在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/json
和Accept: application/xml
)。
在第一种情况下,FilteringMoxyJsonProvider被选为响应编写器,因为EntityFilteringFeature已注册。响应是基于实体过滤注释编写的。
虽然客户端要求XML响应,但选择了另一个MessageBodyWriter(org.glassfish.jersey.jaxb.internal.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);
我同意,这是同样的问题。 –