As another option, you can use the cxfbean compound but your bean needs to have JAXWS annotations.
<route> <from uri="jetty:http://localhost:9090?matchOnUriPrefix=true" /> <to uri="cxfbean:jaxwsBean" /> </route> Please see the unit test here: https://svn.apache.org/repos/asf/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/cxfbean/CxfBeanTest.java (see testJaxWsBean) https://svn.apache.org/repos/asf/camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/cxfbean/CxfBeanTest-context.xml The only catch is you will probably the first person to do "from(jms).to(cxfbean)". On Tue, Jan 19, 2010 at 4:53 PM, Christian Schneider <ch...@die-schneider.net> wrote: > Hi all, > > I am thinking about how to make one way services easier. Currently I > generate code for the service using cxf codegen and use the camel-cxf module > to create a client or endpoint that can be routed over jms using the > camel-jms component. Using CXF for this task is a little overkill as very > few features of CXF are used and quite a lot of configuration has to be > done. I wonder if this can be done easier. > > I have experimented with a possible solution for the server part. It looks > like this: > from("jms:myqueue").process(new > SoapProcessor("com.example.customerservice")).to("bean:serviceHandler"); > > The idea is that a soap message for the service comes in over jms. The soap > processor parses the soap xml, strips the Envelope and Body and unmarshals > the content using JAXB. The processor needs the package name of the > generated stub code for the service. The advantage over using camel-cxf is > that there is much less configuration and you do not need cxf at runtime > (which means much less jars). Additionally the serviceHandler bean only > needs to have a method with the expected classs type as input parameter it > does not need to implement a service interface. I have added the code of > SoapProcessor to the mail as it is quite small. > > So what do you think? Does it make sense to have such small scale SOAP > functionality in camel? > I am thinking about turning my Processor into a DataFormat and provide > marshalling and unmarshalling. Does this make sense or is a processor > better? > > Greetings > > Christian > > -- > > Christian Schneider > --- > http://www.liquid-reality.de > > ---- > > > import java.io.InputStream; > import java.util.Iterator; > > import javax.xml.bind.JAXBContext; > import javax.xml.bind.JAXBElement; > import javax.xml.bind.JAXBException; > import javax.xml.bind.Unmarshaller; > import javax.xml.namespace.NamespaceContext; > import javax.xml.xpath.XPath; > import javax.xml.xpath.XPathConstants; > import javax.xml.xpath.XPathExpression; > import javax.xml.xpath.XPathExpressionException; > import javax.xml.xpath.XPathFactory; > > import org.apache.camel.Exchange; > import org.apache.camel.Processor; > import org.w3c.dom.Element; > import org.xml.sax.InputSource; > > public class SoapProcessor implements Processor { > > private XPathExpression xpathExpression; > private Unmarshaller unmarshaller; > > public SoapProcessor(String jaxbPackage) { > super(); > XPath xpath = XPathFactory.newInstance().newXPath(); > xpath.setNamespaceContext(new SoapNameSpaceContext()); > try { > xpathExpression = > xpath.compile("/soap:Envelope/soap:Body/*"); > JAXBContext jContext = > JAXBContext.newInstance(jaxbPackage); > unmarshaller = jContext.createUnmarshaller(); > } catch (XPathExpressionException e) { > throw new RuntimeException(e.getMessage(), e); > } catch (JAXBException e) { > throw new RuntimeException(e.getMessage(), e); > } > > } > > private final class SoapNameSpaceContext implements NamespaceContext > { > private static final String SOAP_NAMESPACE = > "http://schemas.xmlsoap.org/soap/envelope/"; > > public Iterator<?> getPrefixes(String namespaceURI) { > return null; > } > > public String getPrefix(String namespaceURI) { > return null; > } > > public String getNamespaceURI(String prefix) { > return SOAP_NAMESPACE; > } > } > > public void process(Exchange exchange) throws Exception { > InputStream request = > exchange.getIn().getBody(InputStream.class); > InputSource is = new InputSource(request); > Element payload = (Element) xpathExpression.evaluate(is, > XPathConstants.NODE); > JAXBElement<?> el = (JAXBElement<?>) > unmarshaller.unmarshal(payload); > Object o = el.getValue(); > exchange.getIn().setBody(o); > } > > } > >