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

Reply via email to