在 Spring/Tomcat 中使用 JNDI 环境变量

问题描述 投票:0回答:1

我负责 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。

java spring tomcat jndi
1个回答
0
投票

仍然不确定问题是什么,但我解决了它。我创建了一个新类:

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 的一个错误?

© www.soinside.com 2019 - 2024. All rights reserved.