【发布时间】: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/json 和Accept: application/xml)。
在第一种情况下,FilteringMoxyJsonProvider 被选为响应编写器,因为 EntityFilteringFeature 已注册。响应是根据实体过滤注解编写的。
虽然当客户端请求 XML 响应时,会选择另一个 MessageBodyWriter (org.glassfish.jersey.jaxb.internal.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