문제

JaxBB 서비스 (Jersey 사용)가 JaxB 객체를 요청 엔티티로 받아들입니다. 오류가 발생하면 우리에게 전송 된 원래 XML 문자열을 기록하고 싶습니다. 현재, 나는 JaxB 객체를 다시 말하고 있지만, 해당 클래스에 여러 개의 Java 열거가 있기 때문에 원래 XML 문자열에서 올바르게 철자가없는 열거 값은 손실되므로 목적으로는 허용되지 않습니다.

요청 엔티티를 문자열 및 JABX 객체로 가져 오는 방법을 아는 사람이 있습니까? 나는 사용자 정의 MessageBodyReader를 작성하지 않는 것을 선호하며 가능한 경우 JAXB의 MessageBodyReader를 시도하지 않는 것을 선호합니다. 저지 특정 수업도 자유롭게 사용할 수 있습니다. 우리는 버전 1.0.x를 사용하고 있습니다.

도움이 되었습니까?

해결책

JAX-RS API 로이 작업을 수행하는 것이 어렵지 않다는 것이 밝혀졌습니다. 내가 한 일은 다음과 같습니다.

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

이렇게하면 XML을 문자열로, 몇 줄의 코드로 JAXB 객체로 제공됩니다.

다른 팁

아이디어로서, 모든 요청을 가로 채고 필요한 경우 나중에 추출 할 수있는 스레드 컨텍스트로 페이로드를 캡처하는 웹 애플리케이션에 서블릿 필터를 추가 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top