2016-07-27 80 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

我同意,这是同样的问题。 –