RESTful Glassfish 4アプリケーション(JERSEY 2.22.2、JSON ProviderとしてMOXY)では、JSONとXMLの両方の出力を生成できるリソースメソッドが用意されています。メディアタイプ(JSON/XML)に応じて異なるJersey 2レスポンス
メソッドのレスポンスはMessageBodyWriterを通過しますが、特定の場合にのみオブジェクトグラフを作成するために使用されます。これらの場合、クライアントからの要求されたメディアタイプとは無関係に、グラフが正しく適用されます。
一方、私たちのMessageBodyWirterのisWriteable()メソッドがfalseを返すと、MessageBodyFactoryのwriters
リスト内の次のライターに渡されると、動作はJSONメディアタイプ要求とXMLメディアの間で異なります要求ヘッダーにはそれぞれAccept: application/json
とAccept: application/xml
が含まれています。
最初のケースでは、EntityFilteringFeatureが登録されているため、FilteringMoxyJsonProviderが応答ライターとして選択されています。応答は、エンティティのフィルタリングアノテーションに基づいて記述されます。
クライアントがXML応答を要求すると、別のMessageBodyWriter(org.glassfish.jersey.jaxb.internal.XmlRootElementJaxbProvider)が選択されます。 これは、FilteringMoxyJsonProviderがXmlRootElementJaxbProviderの後に配置されているMessageBodyFactory内でのWriterModel
の順序付けによるものです。
この状況では、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);
私はそれは同じ問題だ、同意するものとします。 –