gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:02:29 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com