[英]Apache camel soap request type conversion error
我正試圖在運行在osgi環境(karaf)上的apache camel發送一個soap請求。 到現在為止我得到了這段代碼
public void start(BundleContext context) throws Exception {
LOGGER.log(Level.INFO, "START");
MyRouteBuilder routeBuilder = new MyRouteBuilder();
camelContext = new DefaultCamelContext();
StreamComponent stream = new StreamComponent();
camelContext.addComponent("stream", stream);
camelContext.addRoutes(routeBuilder);
CxfComponent cxf = new CxfComponent();
camelContext.addComponent("cxf", cxf);
try {
ProducerTemplate template = camelContext.createProducerTemplate(0);
camelContext.start();
String url = "cxf://http://some.server/webservice?"
+ "wsdlURL=http://some.server/webservice?wsdl&"
+ "serviceName={http://some.server}Service&"
+ "portName={http://some.server}ServiceSoapPort"
+ "&dataFormat=MESSAGE";
Exchange e = sendSimpleMessage(template, url);
LOGGER.log(Level.INFO, e.getOut().getBody().toString());
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "ERROR: ");
}
}
public void stop(BundleContext context) {
LOGGER.log(Level.INFO, "STOP");
try {
camelContext.stop();
} catch (Exception e) {
LOGGER.log(Level.INFO, e.toString());
}
}
private static Exchange sendSimpleMessage(ProducerTemplate template,
String endpointUri) {
final List<String> params = new ArrayList<String>();
Map<String, Object> headers = new HashMap<String, Object>();
headers.put(CxfConstants.OPERATION_NAME, "authenticate");
headers.put("requestObject", new DefaultCxfBinding());
params.add("hello world");
Exchange exchange = template.request(endpointUri, new Processor() {
public void process(final Exchange exchange) throws Exception {
SOAPMessage soapMessage = createSOAPRequest();
soapMessage.setContentDescription("someId");
soapMessage.setProperty("key", "value");
soapMessage.setProperty("key", "value");
soapMessage.setProperty("key", "value");
soapMessage.setContentDescription("");
soapMessage.setProperty("key", "value");
exchange.getIn().setBody(soapMessage.getSOAPBody());
}
});
return exchange;
}
private static SOAPMessage createSOAPRequest() throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
String serverURI = "http://some.server";
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("", serverURI);
javax.xml.soap.SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem = soapBody.addChildElement("getApplication",
"example");
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", "http://some.server/someFunction");
soapMessage.saveChanges();
LOGGER.log(Level.INFO, soapMessage.toString());
return soapMessage;
}
現在我在我的karaf日志中出現了這個錯誤
java.lang.IllegalArgumentExcetion: Could not find a suitable setter for property: portName as there isn't a setter method with same type: java.lang.String nor type conversion possible: No type converter available to convert from type: java.lang.String to the required type: javax.xml.namespace.QName with value [...]
當我刪除portName時,serviceName也會發生同樣的情況 - 那么如何將這些參數作為javax.xml.namespace.QName傳遞呢? 或者還有什么我做錯了嗎?
編輯:當我簡化它時得到相同的錯誤
from("direct:start")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody("<mandant>001</<mandant>");
}
})
.to("cxf://http://some.server/webservice?"
+ "wsdlURL=http://some.server/webservice?wsdl&"
+ "serviceName={http://some.server}Service&"
+ "portName={http://some.server}ServiceSoapPort"
+ "&dataFormat=MESSAGE")
.to("file:C:/output?fileName=soap.txt");
您需要的TypeConverter是CxfConverter它通常使用AnnotationTypeConverterLoader通過Spring或Blueprint加載到CamelContext。 您可以添加類型轉換器來CamelContext喜歡這樣 ,但它僅適用於實現類型轉換器接口,但CxfConverter被@Converter注解,它應該使用的發現可以找到類。
我不知道如何解決這個問題,但我希望你能進一步了解這些信息。 如果你搞清楚了,請在這里更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.