java - 使用 jersey 在 URL 中进行 REST 版本控制

标签 java spring rest jersey

我有一个 Jersey/Spring REST servlet。我正在尝试使用 URL 版本控制机制来拥有同一资源的 2 个版本。 解决这个问题的最佳方法是什么?

这是我的 web.xml,我正在尝试加载 2 个 Jersey servlet

<servlet>
    <servlet-name>REST_V1</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet
    </servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.comp.resource.v1</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>REST_V1</servlet-name>
    <url-pattern>/v1/*</url-pattern>
</servlet-mapping>

这是 V2 映射

<servlet>
    <servlet-name>REST_V2</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet
    </servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.comp.resource.v2</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>REST_V2</servlet-name>
    <url-pattern>/v2/*</url-pattern>
</servlet-mapping>

我定义了2个spring组件,在各自的包中具有相同的资源路径

package com.comp.resource.v1;

@Controller
@Path("/user")
public class User_V1 {

}

对于 V2

package com.comp.resource.v2;

@Controller
@Path("/user")
public class User_V2 {

}

我看到资源/user 出现冲突的 URI 模板错误 有更好的方法来解决这个问题吗?任何帮助将不胜感激

最佳答案

问题似乎出在 spring bean 的加载方式上。在 web.xml 中,如果您在 Jersey 之外使用 contextConfigLocation 来加载所有 bean,则 REST_V1 和 REST_V2 servlet 都会与相同的资源名称发生冲突。

这是我在应用程序上下文中更改的内容。 删除了全局applicationContext.xml中资源包的扫描

<context:annotation-config />
<context:component-scan base-package="com.comp.*">
    <context:exclude-filter type="regex" expression="com.comp.resource.*"/>
</context:component-scan>

为每个 servlet 添加了 2 个 applicationContext

applicationContext_V1.xml

<context:annotation-config />
<context:component-scan base-package="com.comp.resource.v1"/>

applicationContext_V2.xml

<context:annotation-config />
<context:component-scan base-package="com.comp.resource.v2"/>

在 web.xml 的 Jersey 配置中添加了对这些 applicationContext 文件的引用

<servlet>
    <servlet-name>REST_V1</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet
    </servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.comp.resource.v1</param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext_V1.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>REST_V1</servlet-name>
    <url-pattern>/v1/*</url-pattern>
</servlet-mapping>

对于 REST_V2

<servlet>
    <servlet-name>REST_V2</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet
    </servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.comp.resource.v2</param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext_V2.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>REST_V2</servlet-name>
    <url-pattern>/v2/*</url-pattern>
</servlet-mapping>

关于java - 使用 jersey 在 URL 中进行 REST 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31686735/

相关文章:

django - 使用 Neo4J 和 Django 创建 REST API

c# - 创建 REST API 以允许上传大型数据集

java - mvn 无法从终端在自定义位置执行 testNG 类

java - 动态设置一个ContentProvider的权限

java - 在 Google Cloud App Engine 上构建 Spring Boot 应用程序的触发器

java - 设计一个模式来测试 RESTful 服务

java - 检查Java中HTML的特定行

Java CDI : Do interceptors have scope?

java - Spring,JSON序列化器,仅在某些情况下序列化字段

python - Flask Restful API url