RESTfull CXF-Server

ein kleines Beispiel für die Nutzung von JAX-RS mit CXF.

die pom.xml mit dem gebundleten JAX-RS-Libraries:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>cxfrest</groupId>
	<artifactId>cxfrest</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<dependencies>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-bundle-jaxrs</artifactId>
			<version>2.4.4</version>
		</dependency>
	</dependencies>

</project>

die cxf.xml, also die Spring-Konfig für das CXF-Framework (gehört unter src/main/resources)

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="
 http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd 
 http://cxf.apache.org/jaxrs 
 http://cxf.apache.org/schemas/jaxrs.xsd 
 http://cxf.apache.org/jaxws 
 http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<jaxrs:server id="echoServer" address="http://127.0.0.1:11111">
		<jaxrs:serviceBeans>
            <ref bean="UserService" />
		</jaxrs:serviceBeans>
	</jaxrs:server>

    <bean id="UserService" class="cxfrest.server.UserService"/>

</beans>

Um ein bisschen standard-konform zu bleiben, ziehen wir die cxf.xml mal über die application-context.xml an

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
   "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
	<import resource="cxf.xml" />
</beans>

Und die können wir dann wiederum über die Main-Methode mittels ClassPathXmlApplicationContext aufrufen:

package cxfrest.server;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Server {
    public static void main(String[] args) {
        ApplicationContext appContext = new ClassPathXmlApplicationContext("application-context.xml");
        while (true){
            //
        }
    }
}

Zu guter Letzt wird noch der eigentliche Service erstellt und mittels Annotations geschmückt:

package cxfrest.server;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Produces(„text/plain“)
public class UserService {

private static List userList;

static{
userList = new ArrayList();
}

@GET
@Path(„/size“)
public String getListSize() {
String response;
try{
response = „size of list: “ + userList.size();
} catch (Exception e){
response = e.getMessage();
System.out.println(e.getStackTrace());
}
return response;
}

@PUT
@Path(„/add/{username}“)
public String echo(@PathParam(„username“) String username) {
userList.add(username);
return „added user: “ + username;
}

@GET
@Path(„/getLastUser“)
public String echo() {
if (userList.size() < 1 ){ return "nobody inside"; } else { return "last user: " + userList.get(userList.size()-1); } } } [/sourcecode]