2016-07-27 65 views
1

在RESTful Glassfish 4應用程序(JERSEY 2.22.2,MOXY作爲JSON提供程序)中,我們有一種資源方法,可以同時生成JSON和XML輸出。根據媒體類型的不同Jersey 2響應(JSON/XML)

方法響應通過一個MessageBodyWriter,但它僅用於在某些情況下構建對象圖。在這些情況下,獨立於來自客戶端的請求媒體類型,圖表正確應用。另一方面,當MessageBodyWirter的isWriteable()方法返回false,因此傳遞給MessageBodyFactory的writers列表中的下一個writer時,JSON媒體類型請求和XML媒體之間的行爲是不同的類型請求(即請求頭中分別爲Accept: application/jsonAccept: application/xml)。

在第一種情況下,FilteringMoxyJsonProvider被選爲響應編寫器,因爲EntityFilteringFeature已註冊。響應是基於實體過濾註釋編寫的。

雖然客戶端要求XML響應,但選擇了另一個MessageBodyWriter(org.glassfish.jersey.jaxb.in​​ternal.XmlRootElementJaxbProvider)。 這是由於MessageBodyFactory中WriterModel的排序,其中FilteringMoxyJsonProvider位於XmlRootElementJaxbProvider之後。

在這種情況下,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類型不同的結果信息。

我懷疑這關閉/不會修復GitHub的問題爲MOXY組件是我們與過濾看到的行爲的原因:https://github.com/jersey/jersey/issues/3036

+0

我同意,這是同樣的問題。 –

相關問題