【问题标题】:jndi look up for DefaultFtpSessionFactoryjndi 查找 DefaultFtpSessionFactory
【发布时间】:2025-12-24 04:45:09
【问题描述】:

我在 .properties 文件中有 ftp 连接属性,下面是 spring bean 的代码。

<bean id="ftpConnectionFactory" class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory">
        <property name="host" value="${ftp.host}"/>
        <property name="port" value="${ftp.port}"/>
        <property name="username" value="${ftp.username}"/>
        <property name="password" value="${ftp.password}"/>
    </bean>

上述方法确实可以使用 Web 应用程序和占位符配置中的属性文件。但我想要将这些属性保留在服务器中,比如说 tomcat context.xml 文件。

我有使用这个工厂的 spring 集成。

<int-ftp:outbound-channel-adapter id="ftpOutbound"
        channel="ftpChannel"
        remote-directory="${ftp.remoteDir}" 
        remote-file-separator="\"
        session-factory="ftpConnectionFactory"
         />

有没有办法可以在服务器中外部化这些属性并使用 jndi 进行查找。对于数据源,我目前正在这样做。但我不知道如何为会话工厂做这件事。我之所以要这样做是为了隐藏密码和其他详细信息。

【问题讨论】:

    标签: java spring tomcat jndi spring-integration


    【解决方案1】:

    如果 Tomcat 可以正确地将对象绑定到来自 context.xml 的 JNDI,则从 JNDI 查找中访问该对象没有区别,就像您为 DataSource 所做的那样。

    请展示一下您如何为 Spring 中的 DataSource 执行此操作,以及如何配置 ftpConnectionFactory,我会尽力帮助您。

    【讨论】:

    • 我在 spring 配置中有&lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt; &lt;property name="jndiName" value="java:comp/env/jdbc/myDataSource"/&gt; &lt;/bean&gt;,资源在上下文文件中。我也可以对这个 ftp 会话工厂做同样的事情,对吗?
    • 没错! JNDI 对于您绑定和想要获取的对象没有区别。如果您的 Tomcat 为您执行此操作,那么您可以使用 JndiObjectFactoryBean 从 JNDI 获取所需的对象
    【解决方案2】:

    您可以按如下方式使用 PropertyPlaceholderConfigurer

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
              <value>classpath:external.properties</value>
        </property>
    </bean>
    

    5.8.2 Customizing configuration metadata with a BeanFactoryPostProcessorSpring PropertyPlaceholderConfigurer Example查看更多示例

    【讨论】:

    • 是的,现在我正在使用属性文件。以上确实有效。我想从 Web 应用程序中删除属性文件并将它们添加到服务器 context.xml 中,就像我们对数据源所做的那样