如何在Jersey的ResourceConfig中读取Tomcat独立context.xml的配置值
一、Jersey 读取 context.xml 配置方案
你遇到的 javax.naming.NameNotFoundException 异常核心原因是:ResourceConfig 构造方法执行时机早于 Servlet 容器上下文初始化完成的时间,此时 JNDI 环境、ServletContext 都还未完成加载,自然读取不到配置。推荐两种实现方式:
方式1:读取 JNDI 配置
不要在构造方法中执行查找,通过 @PostConstruct 注解指定初始化方法,等 Servlet 依赖注入完成后再执行 JNDI 查询:
import org.glassfish.jersey.server.ResourceConfig; import javax.annotation.PostConstruct; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.ws.rs.core.Context; import javax.servlet.ServletContext; public class CustomResourceConfig extends ResourceConfig { @Context ServletContext servletContext; public CustomResourceConfig() { // 构造方法仅做包扫描、注册组件等无容器依赖的操作 packages("com.your.business.package"); } @PostConstruct public void initConfig() { try { InitialContext context = new InitialContext(); String companyName = (String) context.lookup("java:comp/env/companyName"); // 存入Jersey全局配置,后续业务代码可直接注入Configuration读取 property("env.companyName", companyName); } catch (NamingException e) { // 处理配置缺失逻辑 e.printStackTrace(); } } }
方式2:改用 ServletContext 初始化参数(更简单)
如果不需要 JNDI 级别的配置,可将 context.xml 中的配置改为 <Parameter> 标签:
<Context> <Parameter name="companyName" value="My Company, Incorporated" type="java.lang.String" override="false" /> </Context>
直接在初始化方法中调用 getInitParameter 读取即可,不需要处理 JNDI 异常:
@PostConstruct public void initConfig() { String companyName = servletContext.getInitParameter("companyName"); property("env.companyName", companyName); }
二、Eclipse 部署不覆盖自定义 context.xml 配置方法
仅勾选「Publish module contexts to separate XML files」无法解决覆盖问题,因为该选项的作用就是让 Eclipse 每次部署时生成独立的 context.xml 覆盖 Tomcat 对应目录下的文件,按以下步骤配置即可:
- 打开 Eclipse 「Servers」视图,双击对应的 Tomcat 服务器打开配置页
- 在「Server Options」配置块中,取消勾选「Publish module contexts to separate XML files」,Eclipse 部署时就不会再生成 context 文件覆盖你自定义的配置
- 如果配置后仍不生效,删除当前 Tomcat 服务器实例,重新关联本地 Tomcat 即可清除缓存配置
「Update context paths」选项作用
该选项用于同步 Eclipse 中项目的 Web 上下文路径与 Tomcat 配置:当你修改了项目的访问根路径(比如把默认的项目名改为 /api),勾选该选项后 Eclipse 发布时会自动更新 Tomcat 中对应应用的 context 路径配置,不需要手动修改 server.xml 或 context.xml 的 path 属性。
内容的提问来源于stack exchange,提问作者BairDev
相关产品推荐
相关产品推荐

