JAX-RS ottenere un'entità come oggetto JAXB e as String
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.
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.