This is a logical “next post” to Hosting a CXF SOAP webservice in an existing Jetty instance.
Let’s look at what’s need to host more than one service using CXF from a running instance of Jetty.
Changes to our SOAP Service
We’re going to do this by hosting our original HelloWorld service (from the previous post) with a single line change and alongside it we’ll create a REST service.
So in the AppConfig from the previous post, rename getService to getSoapServer (or whatever you like) and the code should look like this
@Bean @DependsOn( "cxf" )
public Server getSoapServer() {
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceBean(new HelloWorldImpl());
factory.setAddress("/soap");
return factory.create();
}
Apart from the method name change, we’ve added a setAddress call with a relative path. If you recall from the previous post our Jetty server will run on port 9000, i.e. http://localhost:9000 but now our SOAP service will be on http://localhost:9000/soap/HelloWorld?wsdl.
Adding a REST Service
Update the pom.xml with the following, in the properties we’ll add
<json.version>1.1.0-M1</json.version> <glassfish.version>1.0.4</glassfish.version>
and these dependencies
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>${json.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>${glassfish.version}</version>
</dependency>
Next we’ll create a simple REST service (I’ll actually duplicate the one from here).
So create a new Java class, mine’s named PeopleService and here’s the code
package com.putridparrot.core;
import javax.json.JsonArray;
import javax.json.Json;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/people")
public class PeopleService {
@Produces({"application/json"})
@GET
public JsonArray getPeople() {
return Json.createArrayBuilder()
.add(Json.createObjectBuilder()
.add("firstName", "Brian")
.add("lastName", "Kernighan "))
.add(Json.createObjectBuilder()
.add("firstName", "Dennis")
.add("lastName", "Ritchie "))
.add(Json.createObjectBuilder()
.add("firstName", "Bjarne")
.add("lastName", "Stroustrup"))
.build();
}
}
within AppConfig, place the following
@Bean @DependsOn( "cxf" )
public Server getRestServer() {
JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
factory.setServiceBean(new PeopleService());
factory.setProvider(new JsrJsonpProvider());
factory.setAddress("/rest");
return factory.create();
}
if you run the App.main, you should be able to navigate to http://localhost:9000/soap/HelloWorld?wsdl to get the SOAP service’s wsdl and http://localhost:9000/rest/people to get the results of the PeopleService call.
Just to complete the picture – the PeopleService is given a path to the REST calls. We’re simply returning JSON and so we annotate with the @Produces line. As we’re only support a GET call to this service we annotate @GET. Within the getPeople method we build up a JSON document and that’s all there is to it.