org.apache.camel.Exchange에서 soapmessage를 얻으십시오
-
12-12-2019 - |
문제
봄 콩에서받는 Exchange 개체에서 SOAP 메시지를 가져와야합니다.
서비스 엔드 포인트에서 Java Bean으로 노선하는 낙타 경로가 있습니다.Spring에서 선언 된 Java Bean 및 Camel Route는 다음과 같습니다.
<bean id="processor" class="com.groupgti.esb.camel.wrapper.gradireland.userregistration.UserRegistrationProcessor">
<camel:route id="route">
<camel:from uri="cxf:bean:myListenerEndpoint?dataFormat=PAYLOAD&synchronous=true" />
<camel:bean ref="processor" />
<camel:to uri="cxf:bean:myTargetEndpoint"/>
</camel:route>
.
My Java Bean에서 Exchange 객체를받습니다.
@Override
public SOAPMessage processMessage(Exchange exchange) {
Object object = exchange.getIn().getHeaders().get("CamelCxfMessage");
LOGGER.debug("Object: " + object);
SOAPMessage message = null;
if (object instanceof SOAPMessage) {
message = (SOAPMessage) object;
LOGGER.debug("Got message: " + message);
}
LOGGER.debug("Sending message...");
return message;
}
.
문제는 내가 Exchange에서 SOAP 메시지를 가져올 수 없다는 것입니다.I Camel 웹 사이트, 여기 여기를 사용해야한다는 것을 알아야합니다.:
SOAPMessage soapMessage = (SOAPMessage) exchange.getIn().getBody(List.class).get(0);
.
하지만 그분은 나에게 Exchange 어딘가에 깊은 곳에서 나에게주는 것입니다.
나는 디버깅을 시도하고 개체 트리를 볼 수 있습니다.나는 이것과 같이 메시지를 얻을 수 있다는 것을 발견했다 :
SOAPMessage soapMessage = (SOAPMessage) exchange.getIn().getHeaders().get("CamelCxfMessage");
.
그러나 이것은이 예외를 제공합니다 :
org.apache.camel.ExpectedBodyTypeException: Could not extract IN message body as type: interface javax.xml.transform.Source body is: null
.
여기에 갇혀 있습니다.어쩌면 누군가가 어디에서 문제가 될 수 있는지 알고 있습니까?
해결책
페이로드 모드는 쉬운 방법이 아니며 CXF 용 POJO 모드를 사용해야하며 SOAPMessage를 제거해야합니다.
와 같은 jaxb 주석으로 POJO를 선언해야합니다.@XmlAccessorType(XmlAccessType.FIELD)
public class Registration {
private Long roomNumber;
...
}
.
이렇게하면 프로세서의 등록 클래스에서 직접 작업 할 수 있습니다 (최종 목표는 가정).
Registration registration = exchange.getIn().getBody(Registration.class);
.
페이로드 모드로 지속되면
를 쓸 수 있습니다.SOAPMessage soapMessage = exchange.getIn().getHeader(CxfConstants.CAMEL_CXF_MESSAGE, SOAPMessage.class);
. 제휴하지 않습니다 StackOverflow