You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Tomcat部署WAR包后无法找到REST Web服务资源求助

解决NetBeans本地运行正常、WAR包部署Tomcat后REST服务404的问题

这种本地跑起来没问题,打包部署就掉链子的情况真的挺闹心的,我来帮你捋捋几个最可能的问题点和对应的解决办法:

1. 先检查Tomcat的上下文路径

NetBeans内部部署时,默认会把项目名作为上下文路径(比如你的项目叫callback,路径就是/callback),但打包成WAR后,Tomcat默认会用WAR文件的名字作为上下文路径。比如:

  • 如果你的WAR包叫callback.war,那访问路径和NetBeans里一致:http://localhost:8080/callback/callback/test
  • 如果WAR包名字是my-rest-service.war,那路径就得改成:http://localhost:8080/my-rest-service/callback/test

快速验证方法:

去Tomcat的webapps目录下看看你的WAR文件名是什么,或者直接访问http://localhost:8080/看Tomcat的欢迎页,里面会列出已部署的应用,点进去就能看到正确的上下文路径前缀。

如果想强制指定上下文路径,也可以在Tomcat的conf/server.xml里添加Context标签:

<Context docBase="你的WAR包路径或文件名" path="/callback" reloadable="true"/>

2. 确认Application配置类的正确性

你的REST服务能不能被Tomcat识别,很大程度取决于Application配置类的注解和位置是否正确。确保你的配置类符合以下要求:

  • 继承自javax.ws.rs.core.Application
  • 加上@ApplicationPath("/callback")注解(和你访问路径里的/callback对应)
  • 被正确打包进WAR的WEB-INF/classes目录下

示例代码:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/callback")
public class CallbackApplication extends Application {
    // 这里可以留空,JAX-RS会自动扫描当前包及子包下的REST服务类
}

3. 排查web.xml的配置冲突

如果你的项目里有web.xml,要确保它和JAX-RS的自动注册逻辑不冲突:

  • 如果你用的是Jersey(NetBeans默认的JAX-RS实现),需要在web.xml里配置Servlet容器,指定扫描你的REST服务包:
<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>com.your.package</param-value> <!-- 替换成你的REST服务类所在的包 -->
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/callback/*</url-pattern> <!-- 和@ApplicationPath保持一致 -->
</servlet-mapping>
  • 如果你已经用了@ApplicationPath注解,也可以不用web.xml的配置,但前提是WAR包里包含了Jersey的核心依赖,Tomcat才能自动扫描到你的服务。

4. 检查WAR包是否遗漏关键资源

解压你的WAR包,确认以下内容是否存在:

  • WEB-INF/classes下有你的Application配置类和REST服务类的.class文件
  • WEB-INF/lib下有Jersey的核心依赖(比如jersey-server.jarjersey-container-servlet-core.jarjavax.ws.rs-api.jar等)

NetBeans的内置容器可能自带这些依赖,但Tomcat是轻量级服务器,不会默认包含JAX-RS实现,所以必须把这些依赖打包进WAR包(也就是所谓的"胖WAR")。

最后再试一次

按照上面的步骤排查后,重启Tomcat,然后用正确的路径访问:http://localhost:8080/[上下文路径]/callback/test,应该就能正常访问了。

内容的提问来源于stack exchange,提问作者Stanley Mungai

火山引擎 最新活动