我负责 Kiosk 的 Web 服务项目。
我只是想将 tomtact contaxt 中的 JNDI 中的几个字符串注入到 Spring bean 中。我发现这方面的文档很少(尽管找到了有关 JNDI 数据源的大量文档),并且我已经尽力拼凑出正在发生的事情。
在 tomcat 上下文文件中,我有:
<Context path="/kiosk" debug="0" reloadable="true"
crossContext="true">
<Resource name="jdbc/kiosk" auth="Container" type="javax.sql.DataSource"
maxTotal="20"
maxIdle="-1" maxWaitMillis="20000"
username="xxxx" password="xxxx"
driverClassName="com.informix.jdbc.IfxDriver"
url="jdbc:some:url"/>
<Environment name="configFilePath"
value="c:\\dev\\KioskServicesConfiguration\\"
type="java.lang.String" override="false"/>
<Environment name="configFileName"
value="KioskServicesConfiguration"
type="java.lang.String" override="false"/>
</Context>
在我的 applicationContext.xml 中我有:
<!-- Location of the configuration file stored ih the context -->
<bean id="configFileName" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/configFileName"/>
</bean>
<bean id="configFilePath" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/configFilePath"/>
</bean>
我的班级定义:
@服务 公共类 XMLConfigurationLoader 实现 ConfigurationLoader {
private static Logger logger = LogManager.getLogger();
private static final String CONFIG_FILE_NAME = "configFileName";
private static final String CONFIG_FILE_PATH = "configFilePath";
//injected
@Resource(name = CONFIG_FILE_NAME)
private String envName;
@Resource(name = CONFIG_FILE_PATH)
private String envPath;
...
private List<GlobalConfiguration> loadConfigurationFromXML() {
System.err.println("envName:" + envName);
System.err.println("envPath:" + envPath);
}
然后输出:
envName:null
envPath:null
由于我没有收到错误,因此很难找出问题所在。有人能为我指明道路吗? Spring 4,java 8。
更新:我尝试将环境条目的名称更改为 env/configFilePath 以查看会发生什么,并且 Spring 因无法找到资源而抛出异常,因此看来 Spring 正在成功从上下文中提取资源。
更新:更改资源名称
@Resource(name = "Slartibartfast")
private String envName;
也会导致错误,因此 Spring 正在加载 bean。
仍然不确定问题是什么,但我解决了它。我创建了一个新类:
public class EnvironmentVariables implements InitializingBean {
private String configFileName;
private String configFilePath;
@Override
public void afterPropertiesSet() throws Exception {
if (configFileName == null || configFileName.isEmpty()) throw new NullPointerException("configFileName is not defined");
if (configFilePath == null || configFilePath.isEmpty()) throw new NullPointerException("configFilePath is not defined");
}
public String getConfigFileName() {
return configFileName;
}
public void setConfigFileName(String configFileName) {
this.configFileName = configFileName;
}
public String getConfigFilePath() {
return configFilePath;
}
public void setConfigFilePath(String configFilePath) {
this.configFilePath = configFilePath;
}
}
然后添加了新的bean定义:
<!-- Location of the configuration file stored ih the context -->
<bean id="configFileName" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/configFileName"/>
</bean>
<bean id="configFilePath" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/configFilePath"/>
</bean>
<bean id="environmentVariables" class="com.gs.juror.kiosk.services.configuration.EnvironmentVariables">
<property name="configFileName" ref="configFileName"/>
<property name="configFilePath" ref="configFilePath"/>
</bean>
最后,我将其自动装配到 XMLConfigurationLoader 上的 setter 中:
@Autowired
public void setEnvironmentVariables(EnvironmentVariables environmentVariables) {
this.environmentVariables = environmentVariables;
}
然后,使用 getter 方法就可以了。
不确定故障出在哪里,但这正在起作用,所以我很高兴。不知道这是否是 Spring 的一个错误?