2016-07-27 2 views
1

RESTful Glassfish 4アプリケーション(JERSEY 2.22.2、JSON ProviderとしてMOXY)では、JSONとXMLの両方の出力を生成できるリソースメソッドが用意されています。メディアタイプ(JSON/XML)に応じて異なるJersey 2レスポンス

メソッドのレスポンスはMessageBodyWriterを通過しますが、特定の場合にのみオブジェクトグラフを作成するために使用されます。これらの場合、クライアントからの要求されたメディアタイプとは無関係に、グラフが正しく適用されます。

一方、私たちのMessageBodyWirterのisWriteable()メソッドがfalseを返すと、MessageBodyFactoryのwritersリスト内の次のライターに渡されると、動作はJSONメディアタイプ要求とXMLメディアの間で異なります要求ヘッダーにはそれぞれAccept: application/jsonAccept: application/xmlが含まれています。

最初のケースでは、EntityFilteringFeatureが登録されているため、FilteringMoxyJsonProviderが応答ライターとして選択されています。応答は、エンティティのフィルタリングアノテーションに基づいて記述されます。

クライアントがXML応答を要求すると、別のMessageBodyWriter(org.glassfish.jersey.jaxb.in​​ternal.XmlRootElementJaxbProvider)が選択されます。 これは、FilteringMoxyJsonProviderがXmlRootElementJaxbProviderの後に配置されているMessageBodyFactory内でのWriterModelの順序付けによるものです。

この状況では、XML応答はフィルタが適用されずに書き込まれます。

私たちはライターの順序を変更する方法を探してみましたが、運もなくEntityFieldProcessorクラスにアクセスしようとしました。

両方のシナリオ(つまり、JSONリクエストとXMLレスポンスリクエスト)を同じ方法で実行できますか?いくつかの作家を登録から除外したり、MessageBodyFactoryで注文を変更することは可能ですか?

ご協力いただければ幸いです。

//Configuration 
    public class ApplicationConfigVersione1 extends ResourceConfig { 
    .... 

    register(EntityFilteringFeature.class); 
    register(MyCustomWriter.class); 


    ------------------------ 

    @Produces({"application/json", "application/xml"}) 
    public class MyCustomWriter implements MessageBodyWriter<MyCustomObject> { 
    .... 


    @Override 
    public boolean isWriteable(Class<?> type, Type genericType, 
       Annotation[] annotations, MediaType mediaType) { 
     if (mustUseCustomWriter()) { 
       return true; 
      } else { 
      return false; 
     //In this case, with request header accept=application/xml, the xml response is not filtered. 
     } 
    } 



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

      objectGraph = buildObjectGraph(); 

      marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, objectGraph); 
      marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, mediaType.toString()); 

      //**** objectGraph applies to XML and JSON media types 
      marshaller.marshall(object, entityStream); 

答えて

1

は、私はまた、両方のapplication/jsonapplication/xml応答を生成するリソースとジャージーのエンティティのフィルタリングメカニズムを使用してrepsonse種類に応じて異なる結果情報を参照しようとしています。

私はMOXYコンポーネントのために、このクローズ/文句を言わないフィックスgithubの問題が疑われるが、我々は、フィルタリングと見ている行動の原因である:https://github.com/jersey/jersey/issues/3036

+0

私はそれは同じ問題だ、同意するものとします。 –

関連する問題