You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Glassfish 4与Jersey 2构建JMS+REST服务遇404错误求助

嘿,我之前在Glassfish4上搭Jersey2的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:11:53