Frage

Ich habe einen JAX-RS Web-Service (mit Jersey), der ein JAXB Objekt als Anforderungsentität akzeptiert. Wenn wir einen Fehler bekommen, wollen wir die ursprüngliche XML-Zeichenfolge protokollieren, die an uns gesendet wurde. Derzeit bin ich gerade das JAXB Objekt wieder Rangier-, aber da wir mehrere Java Aufzählungen in diesen Klassen haben, Enum-Werte, die nicht korrekt in dem ursprünglichen XML-String geschrieben sind verloren, die für unsere Zwecke nicht akzeptabel ist.

Kennt jemand eine Möglichkeit, die Anforderungsentität sowohl als String und JABX Objekt zu bekommen? Ich würde es vorziehen, keine benutzerdefinierten MessageBodyReader zu schreiben, und ich würde es vorziehen, nicht zu versuchen, die MessageBodyReader für den JAXB, wenn möglich. Sie sind frei, als auch Jersey spezifische Klassen zu verwenden. Wir sind mit der Version 1.0.x.

War es hilfreich?

Lösung

Es stellte sich heraus, es ist nicht so schwer, diese API mit der JAX-RS zu tun. Hier ist, was ich getan habe:

@Path("/transactions")
public class TestResource<X> {

    private Class<X> jaxbClass;

    @POST
    @Path("/{transaction-id}")
    @Consumes("application/xml")
    public Response processPost(@Context Providers providers, @Context HttpHeaders httpHeaders, @PathParam("transaction-id") final long transactionId,
            final String xmlString) throws WebApplicationException, IOException {

        MessageBodyReader<X> reader = providers.getMessageBodyReader(jaxbClass, null, null, MediaType.APPLICATION_XML_TYPE);
        InputStream entityStream = new ByteArrayInputStream(xmlString.getBytes());
        final X xmlObject = reader.readFrom(jaxbClass, null, null, MediaType.APPLICATION_XML_TYPE, httpHeaders.getRequestHeaders(), entityStream);

        //insert logic here

        return Response.ok().build();
    }
}

Dies gibt Ihnen die XML als String und als JAXB Objekt in nur wenigen Zeilen Code.

Andere Tipps

Als Idee, können Sie einen Servlet-Filter für Ihre Web-Anwendung hinzufügen, die alle Anforderungen und Capture-Nutzlast in einen Thread-Kontext abfangen würden, woher es später extrahiert werden kann, wenn nötig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top