JAX-RS配置url-pattern为/rws/*时出现404错误求助
解决JBoss EAP 6.4中JAX-RS服务url-pattern设为/rws/*时的404问题
嘿,我碰到过类似的坑,给你捋清楚怎么解决:
你的问题核心是JAX-RS注解路径和Servlet映射路径叠加导致的不匹配,再加上JBoss EAP 6.4自带Resteasy的默认配置冲突,一步步来解决:
为啥会出问题?
- 路径叠加冲突:当你把servlet-mapping设为
/rws/*,同时在MenuService上标注@Path("/rws/menu"),Resteasy会把这两个路径拼起来——也就是/rws(Servlet映射前缀) +/rws/menu/isAlive(注解路径),实际找的是/rws/rws/menu/isAlive,但你访问的是/rws/menu/isAlive,肯定404啊。 - 重复参数报错:JBoss EAP 6.4里的Resteasy已经在容器层面默认配置了
resteasy.servlet.mapping.prefix,你再在web.xml里加一遍,就触发重复定义的异常了。
两种靠谱的解决办法
办法一:改代码里的@Path,去掉重复前缀
最简单的方式就是把MenuService的@Path里的/rws去掉,因为Servlet映射已经帮你处理了这个前缀:
@Path("/menu") public class MenuService { @GET @Path("/isAlive") public Response isAlive() { return Response.ok("I am alive").build(); } }
web.xml保持你的原有配置就行:
<servlet-mapping> <servlet-name>javax.ws.rs.core.Application</servlet-name> <url-pattern>/rws/*</url-pattern> </servlet-mapping>
现在请求localhost:8080/mesh/rws/menu/isAlive就会正确匹配:/rws(Servlet映射) + /menu/isAlive(注解路径),服务就能正常返回了。
办法二:用jboss-web.xml配置,避开重复参数冲突
如果你不想改代码里的注解,那就别在web.xml里加前缀参数,改用JBoss专属的jboss-web.xml来配置。在项目的WEB-INF目录下创建这个文件(没有的话新建),内容如下:
<?xml version="1.0" encoding="UTF-8"?> <jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_7_0.xsd" version="7.0"> <context-param> <param-name>resteasy.servlet.mapping.prefix</param-name> <param-value>/rws</param-value> </context-param> </jboss-web>
这样JBoss会优先读取这个文件里的配置,不会和内置的参数冲突,同时Resteasy能正确识别/rws作为前缀,你的@Path("/rws/menu")和servlet-mapping/rws/*就能配合工作了。
最后验证
重启JBoss,再访问目标URL,应该就能看到"I am alive"的正常响应了。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

