Domanda

Ho un servizio JAX-RS web (utilizzando Jersey) che accetta un oggetto JAXB come entità richiesta. Quando otteniamo un errore, vogliamo registrare la stringa XML originale che è stato inviato a noi. Attualmente, sto appena ri-marshalling l'oggetto JAXB, ma dato che abbiamo diverse enumerazioni java in quelle classi, valori enum che non sono scritte correttamente nella stringa XML originale si perdono, che non è accettabile per i nostri scopi.

Qualcuno sa un modo per ottenere l'entità richiesta sia come una stringa e oggetto JABX? Io preferirei non scrivere un MessageBodyReader costume e preferirei non cercare di ottenere il MessageBodyReader per la JAXB, se possibile. Siete liberi di utilizzare le classi specifiche di jersey pure. Stiamo usando la versione 1.0.x.

È stato utile?

Soluzione

Si scopre che non è così difficile da fare questo con l'API JAX-RS. Ecco quello che ho fatto:

@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();
    }
}

Questo vi darà l'XML come stringa e come oggetto JAXB in poche righe di codice.

Altri suggerimenti

Come idea, è possibile aggiungere un filtro servlet per l'applicazione Web che avrebbe intercettare tutte le richieste e la cattura di carico utile in un contesto thread in cui può essere estratto dal seguito, se necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top