...
Code Block | ||||
---|---|---|---|---|
| ||||
<properties> <cxf.-version>2.1.1</cxf.-version> </properties> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-core</artifactId> <version>${cxf.-version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>${cxf.-version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>${cxf.-version}</version> </dependency> |
...
Code Block | ||||
---|---|---|---|---|
| ||||
<!-- CXF wsdl2java generator, will plugin to the compile goal --> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf.-version}</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <sourceRoot>${basedir}/target/generated/src/main/java</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>${basedir}/src/main/webapp/WEB-INF/wsdl/report_incident.xml</wsdl> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin> </plugins> |
...
We have named our CXF configuration file cxf-config.xml
and its located in the root of the classpath. In Maven land that is we can have the cxf-config.xml
file in the src/main/resources
folder. We could also have the file located in the WEB-INF folder for instance <param-value>/WEB-INF/cxf-config.xml</param-value>
.
Getting rid of the old jsp world
The maven archetype that created the basic folder structure also created a sample .jsp file index.jsp. This file src/main/webapp/index.jsp
should be deleted.
Configuration of CXF
The cxf-config.xml is as follows:
...
Code Block | ||||
---|---|---|---|---|
| ||||
package org.apache.camel.example.reportincident; import javax.jws.soap.SOAPBinding; import javax.jws.WebResult; import javax.jws.WebMethod; import javax.jws.WebParam; /** * The webservice we have implemented. */ public class ReportIncidentEndpoint implements ReportIncidentServiceImpl { @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) @WebResult(name = "outputReportIncident", targetNamespace = "http://reportincident.example.camel.apache.org", partName = "parameters") @WebMethod(operationName = "ReportIncident", action = "http://reportincident.example.camel.apache.org/ReportIncident") public OutputReportIncident reportIncident(@WebParam(partName = "parameters", name = "inputReportIncident", targetNamespace = "http://reportincident.example.camel.apache.org") InputReportIncident parameters) { System.out.println("Hello ReportIncidentWebServicethis webservice is called fromby " + parameters.getGivenName()); OutputReportIncident out = new OutputReportIncident(); out.setCode("OK"); return out; } } |
We just output the person that invokes this webservice and returns a OK response. This class should be in the maven source root folder src/main/java
under the package name org.apache.camel.example.reportincident
. Beware that the maven archetype tool didn't create the src/main/java folder
, so you should create it manually.
To see test if we are home free we run mvn clean compile
.
Running our webservice
Now that the code compiles we would like to run it in a web container, so we add jetty to our pom.xml so we can run mvn retty:run
:
Code Block | ||||
---|---|---|---|---|
| ||||
<properties>
...
<jetty-version>6.1.1</jetty-version>
</properties>
<build>
<plugins>
...
<!-- so we can run mvn jetty:run -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>${jetty-version}</version>
</plugin>
|
Notice: We use Jetty v6.1.1 as never versions has troubles on my laptop. Feel free to try a newer version on your system, but v6.1.1 works flawless.
So to see if everything is in order we fire up jetty with mvn jetty:run
and if everything is okay you should be able to access http://localhost:8080
.
Jetty is smart that it will list the correct URI on the page to our web application, so just click on the link. This is smart as you don't have to remember the exact web context URI for your application - just fire up the default page and Jetty will help you.
So where is the damm webservice then? Well as we did configure the web.xml to instruct the CXF servlet to accept the pattern /webservices/*
we should hit this URL to get the attention of CXF: http://localhost:8080/my-webapp/webservices
.
Hitting the webservice
Now we have the webservice running in a standard .war application in a standard web container such as Jetty we would like to invoke the webservice and see if we get our code executed. Unfortunately this isn't the easiest task in the world - its not so easy as a REST URL, so we need tools for this. So we fire up our trusty webservice tool SoapUI and let it be the one to fire the webservice request and see the response.TODO: Adding Jetty to pom
TODO: Generation the code
TODO: Adding the System.out and dummy response
TODO: Starting Jetty and using SoapUI to hit the webservice
TODO: Starting Jetty in debug mode so we can debug online
...