2016-06-24 12 views
1

私のオブジェクトをJSON & XMLにジャクソン(注釈)でマーシャリングしています。本当に素晴らしいですが、XMLに問題があります.DTD-Fileを追加したいです。ちょっと検索して、@ XmlHeader-Annotation (org.glassfish.jersey.message.XmlHeader)を使用してヘッダーを追加します。Jacksonと一緒に@XmlHeaderを使用することはできますか?

@Path("resources/xml/hashtagstatistic") 
@GET 
@XmlHeader("<!DOCTYPE note SYSTEM \"test.dtd\">") 
@Produces(MediaType.APPLICATION_XML) 

public Database getStatisticAsXml(){ 
    return serviceController.getDatabase(); 
} 

しかし、それは機能しません。私はjaxbと同じことを試してみました。そこにヘッダがXML-Outputに追加されました。しかし、私はJacksonが使いたい構造を簡単に返すので(私は好きではない/アダプタが必要です)これを修正する可能性はありますか、ヘッダーでこの問題を処理する他のソリューションはありますか?

答えて

1

ええ、それはジャージー特有のアノテーションなので、ジャクソンはそれについて何も知らないでしょう。私はカップルのオプションを参照してください。 WriterInterceptorを使用して、ヘッダーを自分で書くことができます。

@Provider 
public class XmlHeaderWriterInterceptor implements WriterInterceptor { 

    @Context 
    private ResourceInfo info; 

    @Override 
    public void aroundWriteTo(WriterInterceptorContext context) 
        throws IOException, WebApplicationException { 
     final OutputStream outputStream = context.getOutputStream(); 

     XmlHeader anno = info.getResourceMethod().getAnnotation(XmlHeader.class); 
     if (anno != null) { 
      String value = anno.value(); 
      writeToStream(outputStream, value); 
     } 
     context.proceed(); 
    } 
} 

MessageBodyWriterを作成することもできます。しかし、その代わりに、最初から独自に実装するので、あなただけの今まであなたが使用するもの、単にアプリケーションに登録してください

@Provider 
public class MyJackonXmlProvier extends JacksonJaxbXMLProvider { 

    @Context 
    private ResourceInfo info; 

    @Override 
    public void writeTo(Object value, Class<?> type, Type genericType, 
         Annotation[] annotations, MediaType mediaType, 
         MultivaluedMap<String,Object> httpHeaders, 
         OutputStream entityStream) { 

     // do same thing as example above 
     super.writeTo(pass, all, arguments) 
} 

(現在使用しているもの、これがあると仮定して)the one from Jacksonを拡張することができます。

+0

よろしくお願いします。それは私のために働いた:)。私はWriterInterceptorsについてこれまでは聞いたことがありません。なぜなら、私はこのトピックを初めて知ったからです。 writeToStream-Methodeを単純なoutputStream.write(value.getBytes())で置き換えるのは正しいですか?ありがとう:) – Chr3is

+0

ええ、あなたはそれを行うことができます。 –

関連する問題