2017-01-12 1 views
0

Meine CXF bereitgestellt REST Dienstleistungen für den üblichen Grund in die Regel javax.ws.rs.core.Response zurückkehren, um das Ergebnis Entitätsdaten gemarshallte als XML und einen Return-Code zu kapseln:Wie Mars JAXBElement in Antwort?

@GET 
@Path("/getPojo") 
@Produces("application/xml") 
public Response getPojo() { 

    SomePojo resultObj = ...; 

    Response result = Response.status(200).entity(resultObj).build(); 

    return result; 
} 

, die erfordert, dass SomePojo richtige Anmerkungen enthält:

@XmlRootElement(name = "somePojo") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class SomePojo implements Serializable { 
    ... 
} 

Ich stehe jedoch jetzt vor einem Szenario, in dem die Annotation Convention für mich nicht funktioniert und ich meine eigene JAXBElement erstellen muss. Wie kann ich das benutzergenerierte JAXBElement in die Datei Response einfügen, anstatt Response.ResponseBuilder.entity(resultObj) zu verwenden, die auf der Annotationskonfiguration beruht? Ich marshalle etwas, das dem ähnlich ist, was erklärt wird here, aber er druckt gerade das gemarshallte XML in die Konsole und ich möchte es in die Antwort drucken (und nicht gerade HttpResponse heraus).

+0

Haben Sie marshall wollen und direkt auf die XML zurückgeben, oder Sie tun Möchten Sie CXF so konfigurieren, dass ein benutzerdefinierter Marshaller Ihre Ergebnisobjekte anwendet? – pedrofb

+0

Ich bin nicht 100% sicher, dass ich die Frage verstehe, aber mein Bauchgefühl ist, mit dem ehemaligen zu gehen, Marshal selbst, aber ich würde immer noch 'Response' verwenden, weil ich sowohl einen Rückkehrcode + Objekt – amphibient

Antwort

1

können Sie marshall die xml Ihre benutzerdefinierten Marshaller verwenden und die resultierenden XML setzen Sie sich in der Einheit des Response, wie String oder InputStream

@GET 
@Path("/getXML") 
@Produces("application/xml") 
public Response getXML() { 

    String xml = // custom marshall 

    Response result = Response. 
      status(200). 
      entity(xml). 
      type("application/xml"). 
      build(); 

    return result; 
} 
+0

warum ' type (application/xml ")' notwendig, wenn wir es in der Annotation deklarieren? – amphibient

+1

Sie bauen direkt die Antwort auf, nicht den CFX Response Wrapper, also bin ich mir nicht sicher, ob CXF in diesem Fall den Header korrekt aktualisiert Ich müsste die Spezifikation überprüfen (oder testen) – pedrofb

+1

Reviewed.In diesem Fall ist es nicht erforderlich _Eine Methode, für die es eine einwertige Produces ist, ist nicht erforderlich, um den Medientyp der Darstellungen, die es produziert: den Container wird Verwenden Sie den Wert von Produces, wenn Sie eine Antwort senden._ Siehe http://docs.oracle.com/javaee/6/api/javax/ws/rs/Produces.html – pedrofb

Verwandte Themen