2012-03-15 6 views
2

JAXB와 함께 저지를 사용하여 XML에 대한 응답을 변환합니다. 요청 본문에서 XML을 사용하는 여러 가지 방법이 있습니다. 요청되는 메소드의 매개 변수로 bean을 지정할 수 있으며 JAXB는 요청 본문 데이터를 해당 bean으로 자동 변환하는 데 사용되거나 호환되지 않는 경우 실패합니다.서비스 레이어에서 JAXB를 사용하여 마샬링

이것은 대다수의 모든 경우에 유용하며, 변환을 처리하기 위해 MessageBodyReader 또는 MessageBodyWriter를 작성할 필요가 없습니다. 요청 본문을 빈에 매핑해야하는이 인스턴스가 하나 있지만 요청 본문에 있던 원래 XML이 필요합니다. DB에 저장해야합니다.

HttpContext를 통해 요청 본문에 도달하려고 시도했지만 어떻게 알아낼 수 없습니까? 헤더 값과 URI 값만 표시됩니다. 같은 결과로 끝나는 HTTPServletContext 통해 시도했다.

요청 본문을 변환하기 전에 캡처하는 방법이 있습니까? 이 경우를 처리하기 위해 MessageBodyReader를 만들어야합니까? 그것들은 이미 내용을 콩에 매핑하는 데 사용 된 것처럼 보였으므로, 나는 그것이 해결책이라고 생각하지 않았습니다. 그러나 아마도 MessageBodyReader에서 요청 본문을 일부 변수에 넣고 데이터를 콩으로 변환하면서 전달할 수 있습니다. 그것은 여전히 ​​필요한 것보다 더 많은 일로 보인다. 어떻게 든 요청을 통해 몸에 도착할 수 있다고 생각합니다.

업데이트 : getEntity 메소드를 사용하여 ContainerRequest 객체에서 본문을 가져 오려고했습니다.

String xmlString = request.getEntity(String.class); 

그리고 그 덕분에 좋았습니다. 요청 본문은 해당 속성에서 캡처되고 요청 속성에 나중에 추가하여 리소스 등에서 액세스 할 수 있습니다. 문제는 엔티티가 스트림이기 때문에 본문을 지 웁니다. 콩에 jaxb 매핑이 일어날 무렵에는 변환 할 것이 없으며 나쁜 요청 응답을 받았습니다.

그게 효과가 없지만 누군가가 더 잘 작동하게 만들 수 있다면 가능성을내어 버리고 싶었습니다.

내가 여기서 끝내었고, 이런 식으로 할 필요가 없다. 기본적으로 서비스 클래스에서 정렬되지 않은 것을 마샬링합니다. marhsalling에서 사용하는 주석 루트 콩의 위치를 ​​제공, 나는 기본적으로 객체의 몸에 비 정렬 화 된 루트 콩을하고 마샬링 -

final StringWriter st = new StringWriter(); 
try 
{ 

    final JAXBContext jaxbContext = JAXBContext.newInstance(full.classpath.and.classname.of.root.bean); 
    final Marshaller marshaller = jaxbContext.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
    marshaller.marshal(unmarshalled object, st); 
} catch (final JAXBException je) 
{ 
    // TODO Auto-generated catch block 
    je.printStackTrace(); 
} 
final String xml = st.toString(); 

그래서 당신은 볼 수 있습니다.

이미 비 정렬 화 된 것을 마샬링해야 할 필요가있는 것처럼 보입니다. 응답 인 경우, 다시 출구로 다시 정렬해야합니다. 언 마샬링 (unmarshalling)이 일어나기 전에 내가 몸의 복사본을 얻을 수있는 솔루션을 원합니다. 그러나 그 동안에는 이것이 작동해야합니다.

답변

0

나는 같은 시나리오로 달려 나가 예를 들어 불필요한 JAXB 작업을 피하기 위해 문자열로 얻어서 주위에 그것을 다른 방법을 다음 수동으로 마샬링을 제외하고, 유사한 결론 종료 : 내가 좋아하는

String xmlString = request.getEntity(String.class); 
Reader sReader = new StringReader(xmlString); 
return (T)jaxbCtx.createUnmarshaller().unmarshal(sReader);  
+0

을 이 방법은 불필요한 JAXB 작업을 피할 수 있기 때문에 가능합니다. 그리고 그것은 나의 접근법에 대한 문제입니다. – Elrond

관련 문제