Jersey 1.7 kommer med stöd för Spring 2.5, men projektet jag jobbar med för tillfället använder Spring 3.0. I denna artikel tänkte jag beskriva vad jag gjorde för att få dessa att funka tillsammans med Maven.
Så här ser min web.xml
ut.
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>MobileSuite</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring/main-context.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>Jersey Servlet</servlet-name>
<servlet-class>
com.sun.jersey.spi.spring.container.servlet.SpringServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Servlet</servlet-name>
<url-pattern>/myresources/*</url-pattern>
</servlet-mapping>
</web-app>
Dispatchern com.sun.jersey.spi.spring.container.servlet.SpringServlet finns i modulen jersey-spring, men för att kunna använda den mot spring 3.0 krävs att man åsidosätter modulens beroende på Spring 2.5 (dependencyManagement taggen). Här är ett urdrag ur pom.xml. Kör mvn dependency:tree
för att se efter vilka Spring 2.5-moduler som dras in.
<dependencyManagement>
<dependencies>
<!-- jersey-spring includes dependency on spring 2.5 which needs to be overriden. -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-spring</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
</dependencies>
Spring-kontextfilen main-context.xml
är minimal eftersom vi använder oss av annoteringar för att definiera och slå upp bönor.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.foo.mypackage" />
</beans>
@Path("/hello")
@Component
public class MyResource {
@Resource
private MessageBundle bundle;
@GET
@Produces("text/plain")
public Response hello() {
return bundle.get("hello.msg");
}
}