使用Glassfish 4与Jersey 2构建JMS+REST服务遇404错误求助
嘿,我之前在Glassfish4上搭Jersey2的REST服务时也踩过404的坑,结合你的情况,给你几个实用的排查方向:
首先得明确:Glassfish4本身已经内置了Jersey2,和教程里的Jersey1配置差异很大,加上你没用到Maven手动部署,很容易在配置或路径上出问题。
1. 先检查web.xml的Jersey2配置是否正确
这是最常见的坑!Jersey1和Jersey2的Servlet类、初始化参数完全不一样:
- 旧Jersey1用的是
com.sun.jersey.spi.container.servlet.ServletContainer,Jersey2必须换成org.glassfish.jersey.servlet.ServletContainer - 指定资源包的参数也要从
com.sun.jersey.config.property.packages改成jersey.config.server.provider.packages
给你一个适配Jersey2的web.xml示例:
<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>你的REST资源类所在的完整包路径</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/api/*</url-pattern> <!-- 这个路径要和你访问的URL对应 --> </servlet-mapping>
2. 确认访问URL和部署上下文根匹配
你提到部署路径是glassfish/domains/domain1/applications/__internal/JMS1,这里的__internal是Glassfish的临时部署目录,实际访问的上下文根应该是JMS1(默认是你的应用文件名)。
举个例子:如果你的servlet映射是/api/*,资源类的@Path是/jms,那完整访问URL应该是:http://localhost:8080/JMS1/api/jms
不确定上下文根的话,直接登录Glassfish管理控制台(默认地址http://localhost:4848),在「应用程序」列表里看你的应用的上下文根是什么,别瞎猜路径!
3. 避免类路径冲突
Glassfish4已经内置了Jersey2的核心库,如果你手动往WEB-INF/lib里塞了Jersey2的jar包(比如jersey-server.jar、jersey-container-servlet.jar),大概率会出现版本冲突,导致Jersey初始化失败,表面上就是404。
正确的做法是:只把你自己的业务类、JMS相关的依赖(如果需要)放进WEB-INF/lib,不要加Jersey的核心jar包。
4. 查Glassfish日志找深层原因
404有时候只是表象,背后可能是Jersey初始化失败或者资源扫描出错。去glassfish/domains/domain1/logs/server.log里搜这些关键词:
SEVERE:看有没有Jersey启动失败的报错Jersey:找资源包扫描、类加载相关的日志
比如如果你的资源类没加@Path注解,或者包路径配置错了,日志里会明确提示。
5. 确认REST资源类的注解没问题
Jersey2对注解的要求和Jersey1基本一致,但要确保:
- 资源类上有
@Path("/xxx")注解 - 方法上有
@GET/@POST等HTTP方法注解 - 参数注解(比如
@PathParam)也正确使用
举个简单的正确示例:
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/jms-demo") public class JmsResource { @GET @Produces(MediaType.TEXT_PLAIN) public String getJmsMessage() { // 你的JMS逻辑 return "JMS REST Service works!"; } }
如果以上都排查过还是不行,可以补充你的web.xml内容、资源类代码,还有server.log里的关键报错,这样能更精准定位问题。
内容的提问来源于stack exchange,提问作者M_I

