Pergunta

Eu tenho um serviço JAX-RS web (utilizando Jersey) que aceita um objeto JAXB como a entidade solicitação. Quando teremos um erro, queremos registrar a seqüência de caracteres XML original que foi enviado para nós. Atualmente, eu sou apenas re-empacotamento do objeto JAXB, mas uma vez que temos vários enums Java em dessas classes, valores enum que não estão escritas corretamente na seqüência XML original são perdidos, o que não é aceitável para os nossos propósitos.

Alguém sabe uma maneira de obter a entidade pedido tanto como uma string e objeto JABX? Eu preferiria não escrever uma MessageBodyReader personalizado e prefiro não tentar obter o MessageBodyReader para o JAXB, se possível. Você é livre para usar classes específicas-camisa também. Nós estamos usando a versão 1.0.x.

Foi útil?

Solução

Acontece que ele não é tão difícil de fazer isso com a API JAX-RS. Aqui está o que eu fiz:

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

Isto lhe dará o XML como uma string e como um objeto JAXB em apenas algumas linhas de código.

Outras dicas

Como uma idéia, você pode adicionar um filtro servlet para sua aplicação web que iria interceptar todas as solicitações e carga útil de captura em um contexto segmento onde pode ser extraído de, mais tarde, se necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top