【问题标题】:Different Jersey 2 response depending on media type (JSON/XML)不同的 Jersey 2 响应取决于媒体类型 (JSON/XML)
【发布时间】:2016-07-27 13:30:08
【问题描述】:

在一个 RESTful Glassfish 4 应用程序(JERSEY 2.22.2,MOXY 作为 JSON Provider)中,我们有一个资源方法,它能够生成 JSON 和 XML 输出。

方法响应通过 MessageBodyWriter,但仅在某些情况下用于构建对象图。在这些情况下,独立于客户端请求的媒体类型,图表被正确应用。

另一方面,当我们的 MessageBodyWirter 的 isWriteable() 方法返回 false,因此传递给 MessageBodyFactory 的writers 列表中的下一个写入器时,JSON 媒体类型请求和 XML 之间的行为是不同的媒体类型请求(即分别在请求标头中的Accept: application/jsonAccept: application/xml)。

在第一种情况下,FilteringMoxyJsonProvider 被选为响应编写器,因为 EntityFilteringFeature 已注册。响应是根据实体过滤注解编写的。

虽然当客户端请求 XML 响应时,会选择另一个 MessageBodyWriter (org.glassfish.jersey.jaxb.in​​ternal.XmlRootElementJaxbProvider)。 这是由于 MessageBodyFactory 中 WriterModels 的排序,其中 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);

【问题讨论】:

    标签: rest jersey filtering marshalling moxy


    【解决方案1】:

    我还尝试将 Jersey 的实体过滤机制与产生 application/jsonapplication/xml 响应的资源一起使用,并根据响应类型查看不同的结果信息。

    我怀疑 moxy 组件的这个已关闭/无法修复的 github 问题是我们在过滤时看到的行为的原因:https://github.com/jersey/jersey/issues/3036

    【讨论】:

    • 我同意,这是同一个问题。
    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2015-08-21
    相关资源
    最近更新 更多