在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);
我同意,這是同樣的問題。 –