You need to enable JavaScript to run this app. 如何在Jersey的ResourceConfig中读取Tomcat独立context.xml的配置值
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 对应目录下的文件,按以下步骤配置即可:

  1. 打开 Eclipse 「Servers」视图,双击对应的 Tomcat 服务器打开配置页
  2. 在「Server Options」配置块中,取消勾选「Publish module contexts to separate XML files」,Eclipse 部署时就不会再生成 context 文件覆盖你自定义的配置
  3. 如果配置后仍不生效,删除当前 Tomcat 服务器实例,重新关联本地 Tomcat 即可清除缓存配置

「Update context paths」选项作用

该选项用于同步 Eclipse 中项目的 Web 上下文路径与 Tomcat 配置:当你修改了项目的访问根路径(比如把默认的项目名改为 /api),勾选该选项后 Eclipse 发布时会自动更新 Tomcat 中对应应用的 context 路径配置,不需要手动修改 server.xml 或 context.xml 的 path 属性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:57:03