2016-07-27 48 views
1

In einer RESTful Glassfish 4-Anwendung (JERSEY 2.22.2, MOXY als JSON-Provider) verfügen wir über eine Ressourcenmethode, die sowohl JSON- als auch XML-Ausgaben erzeugen kann.Unterschiedliche Antwort von Jersey 2 abhängig vom Medientyp (JSON/XML)

Die Methodenantwort wird über MessageBodyWriter übergeben, sie wird jedoch nur in bestimmten Fällen zum Erstellen eines Objektdiagramms verwendet. In diesen Fällen wird das Diagramm unabhängig vom angeforderten Medientyp vom Client korrekt angewendet.

Wenn die isWriteable() - Methode von MessageBodyWirter false zurückgibt und daher an den nächsten Writer in der writers-Liste der MessageBodyFactory weitergibt, ist das Verhalten zwischen einer JSON-Medienartanforderung und einem XML-Medium unterschiedlich Typ Anfrage (dh Accept: application/json und Accept: application/xml jeweils in den Anfrage-Kopfzeilen).

Im ersten Fall wird der FilteringMoxyJsonProvider als Antwortschreiber ausgewählt, da EntityFilteringFeature registriert ist. Die Antwort wird basierend auf den Entitätsfilterungsanmerkungen geschrieben.

Wenn jedoch der Client nach einer XML-Antwort fragt, wird ein anderer MessageBodyWriter (org.glassfish.jersey.jaxb.internal.XmlRootElementJaxbProvider) ausgewählt. Dies liegt an der Reihenfolge der WriterModel s in der MessageBodyFactory, in denen der FilteringMoxyJsonProvider nach XmlRootElementJaxbProvider positioniert ist.

In diesem Fall wird die XML-Antwort geschrieben, ohne dass Filter darauf angewendet werden.

Wir haben versucht, nach einem Weg zu suchen, um die Writers-Reihenfolge zu ändern, auch ohne Berechtigung versucht, auf die EntityFieldProcessor-Klasse zuzugreifen.

Ist es möglich, dass beide Szenarien (d. H. JSON- und XML-Antwortanforderungen) auf die gleiche Weise funktionieren? Ist es möglich, einige Autoren von der Registrierung auszuschließen oder ihre Reihenfolge in der MessageBodyFactory zu ändern?

Jede Hilfe wird geschätzt.

//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); 

Antwort

1

Ich habe auch versucht, beide application/json und application/xml Antworten produzieren Jersey Entity Filtering Mechanismus mit Ressourcen zu nutzen und verschiedene Ergebnisinformationen gemäß der repsonse Art zu sehen.

Ich vermute, das/geschlossen wird nicht-fix Github Problem für die moxy Komponente ist die Ursache für das Verhalten, das wir mit Filterung sehen: https://github.com/jersey/jersey/issues/3036

+0

Ich bin damit einverstanden, es ist das gleiche Problem. –