如何在JAX-RS REST应用web.xml中声明多包及解决404问题
解决JAX-RS应用多包配置导致的HTTP 404错误
嘿,我来帮你搞定这个问题!你遇到的404错误是因为配置了两个独立的Jersey Servlet实例,且都映射到了/*路径——Servlet容器无法确定该把请求交给哪个Servlet处理,最终导致其中一个包的资源无法被正确识别和路由。
问题根源
你原本配置了两个ServletContainer:一个扫描cuLampPost包,另一个扫描radar包,两者都映射到/*。这种情况下,容器只会优先使用第一个声明的Servlet,第二个Servlet根本没有机会处理请求,所以radar包下的REST资源就会出现404;甚至如果请求匹配逻辑混乱,两个包的资源都可能无法正常访问。
正确解决方案
Jersey提供了更简单的方式:在同一个Servlet的jersey.config.server.provider.packages参数中,用逗号(或分号)分隔多个需要扫描的包,不需要配置多个Servlet。修改后的web.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>LampPostZ12</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>lamppost12</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <!-- 用逗号分隔多个需要扫描的包 --> <param-value>cuLampPost, radar</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>lamppost12</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
为什么这样可行?
Jersey的ServletContainer会自动扫描param-value中所有逗号分隔的包,将其中的JAX-RS资源(比如标注了@Path的类)注册到应用中,这样两个包的资源都能被正确识别和处理,不会出现请求冲突的问题。
内容的提问来源于stack exchange,提问作者Ameni HADRICH
相关产品推荐
相关产品推荐

