4

I'm trying to send a soap request in apache camel running on an osgi enviroment (karaf). Until now I got this code

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;
}

And now I got this error in my karaf logs

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 [...]

And the same happens for serviceName when I delete portName - So how is it possible to pass these arguments as javax.xml.namespace.QName? Or is there anything else I'm doing wrong?

EDIT: Getting the same error when I simplify it to this

        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");
Milla
  • 403
  • 1
  • 5
  • 22

1 Answers1

1

The TypeConverter that you need is CxfConverter It is normally loaded to CamelContext by Spring or Blueprint using AnnotationTypeConverterLoader. You can add TypeConverters to CamelContext like this but it only works on classes that implement TypeConverter interface but CxfConverter is @Converter annotated and it should be found using discovery.

I don't know how to solve this but I hope you get further with this information. Please update here if you figure this out.

jnupponen
  • 715
  • 1
  • 5
  • 16