Pregunta

Tengo un servicio web JAX-RS (usando el jersey) que acepta un objeto JAXB como la entidad petición. Cuando conseguimos un error, queremos registrar la cadena XML original que fue enviado a nosotros. Actualmente, sólo estoy formación de trenes el objeto JAXB, pero ya que tenemos varias enumeraciones de Java en esas clases, los valores de enumeración que no se escriben correctamente en la cadena XML originales se pierden, lo que no es aceptable para nuestros propósitos.

¿Alguien sabe una manera de conseguir la entidad petición lo tanto una cadena y objeto JABX? Yo preferiría no escribir un MessageBodyReader costumbre y yo preferiría no tratar de obtener el MessageBodyReader para la JAXB si es posible. Usted es libre de utilizar las clases-jersey específica también. Estamos utilizando la versión 1.0.x.

¿Fue útil?

Solución

Resulta que no es tan difícil de hacer esto con la API JAX-RS. Esto es lo que hice:

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

Esto le dará el código XML como una cadena y como un objeto JAXB en tan sólo unas pocas líneas de código.

Otros consejos

Como una idea, se puede añadir un filtro de servlet para la aplicación Web que interceptar todas las solicitudes y la carga útil de captura en un contexto de subproceso en el que se puede extraer de más adelante si es necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top