如何使用@Resource或DeltaSpike的@InjectableResource注入JBoss 4.2.x的login-config.xml
问题根因
- 注入类型不匹配:
login-config.xml是JBoss自定义的安全配置XML文件,不符合标准Properties文件(包括Properties类支持的XML格式)的结构,直接声明注入为Properties类型会导致解析失败,最终注入的对象为null,调用方法时抛出NPE。 @InjectableResource默认优先加载应用classpath下的资源,若JBoss的server/default/conf目录未被纳入应用的classpath搜索范围,会直接找不到资源。@Resource注解是用于注入JNDI中绑定的资源(如数据源、EJB实例等),login-config.xml默认不会被绑定到JNDI树,因此lookup阶段直接报错。
正确实现方案
方案1:通过DeltaSpike资源注入直接读取(推荐)
先确认JBoss的server/default/conf目录已被纳入全局classpath(JBoss 4.2.x版本默认已配置),修改注入类型为InputStream,拿到流后自行解析XML即可:
@InjectableResource(location = "login-config.xml") private InputStream loginConfigStream;
你可以使用DOM、SAX或者JAXB等方式解析该输入流,获取需要的配置项。
方案2:通过系统属性拼接路径加载
如果classpath优先级问题导致方案1失效,可以用DeltaSpike的ConfigResolver读取JBoss内置的系统属性,拼接出配置文件的绝对路径后加载:
// 读取JBoss服务根目录路径 String jbossServerHome = ConfigResolver.getPropertyValue("jboss.server.home.dir"); File loginConfigFile = new File(jbossServerHome, "conf/login-config.xml"); // 后续自行读取该文件对象即可
内容的提问来源于stack exchange,提问作者XoXo
相关产品推荐
相关产品推荐

