将Spring MVC项目转换为JAX-RS

时间:2014-07-21 11:47:54

标签: spring hibernate spring-mvc jax-rs

我试图用JAX-RS,Spring,Hibernate,Maven和JPA做一个项目。我跟随此article作为参考。这个项目是在Spring MVC中。我对Spring MVC很新。我试图将其转换为JAX-RS。我有什么重要的改变?

主要的变化我注意到在Spring MVC中我们这样使用:@RequestMapping("/accounts/{username}")

但是在JAX-RS中我们这样使用。 @Path("/accounts/{username}")

因此,如果我进行这样的更改,我们必须对此进行哪些其他关键更改?

1 个答案:

答案 0 :(得分:2)

为了将Spring MVC控制器移植到JAX-RS控制器,您需要做的最基本的事情是在Spring和您的JAX-RS提供程序之间提供和集成。一种方法是对web.xml进行适当的更改。

假设您使用的是Jersey 2.x和Spring 3.x,web.xml将会是这样的:

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <module-name>helloworld-spring</module-name>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>SpringApplication</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>some.package.MyApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringApplication</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

然后MyApplication看起来像:

package some.package;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.spring.scope.RequestContextFilter;


public class MyApplication extends ResourceConfig {


    public MyApplication () {
        register(RequestContextFilter.class);
        register(JerseyResource.class);
        register(SpringSingletonResource.class);
        register(SpringRequestResource.class);
        register(CustomExceptionMapper.class);
    }
}

您还需要依赖

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring3</artifactId>
    <version>2.10.1</version>
</dependency>

除了Spring 3和Jersey 2之外的其他依赖项。

一旦你解决了这个问题,就可以开始改造控制器了。

例如:

@Path("admin")
@Component
public class AdminController {

        @Autowired
        private SchoolService service;


        @Path("load-home-page")
        @GET
        public String loadHomePage(Map model){
           return "admin/index";
        }

        //the rest of the code accordingly
}

Spring-Jersey集成的文档是here,而可以找到完整的示例here

如果你真的没有一个令人信服的理由选择Jersey而不是Spring MVC,我个人会选择Spring MVC而不是Jersey。