2013-04-04 125 views
-1

我有一个独立的弹簧应用程序与嵌入式Apache FTP服务器。这个配置看起来是这样的 -Spring配置自定义命名空间

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:afs="http://mina.apache.org/ftpserver/spring/v1" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd">  

    <context:property-placeholder location="classpath:config.properties" system-properties-mode="OVERRIDE"/> 

    <afs:server id="server" anon-enabled="false"> 

     <afs:listeners> 
      <afs:nio-listener name="default" port="2222" 
       idle-timeout="60" /> 
     </afs:listeners> 

     <!-- other AFS config --> 

    </afs:server> 
</beans> 

我想从属性文件加载的nio-listenerport财产,但

<afs:nio-listener name="default" port="${ftp.port}" 
        idle-timeout="60" /> 

不起作用,因为port在XSD定义为xs:int 。我想知道是否有任何解决方法(使用SpEL?),这将允许我使用AFS名称空间从文件或系统属性中加载port属性。

回答

0

在探索了几个选项之后,我已经决定最简单的方法是跳过afs命名空间来完成监听器配置。最后设置是这样的 -

<bean id="listenerFactory" class="org.apache.ftpserver.listener.ListenerFactory"> 
    <property name="port" value="${ftp.port}" /> 
    <property name="dataConnectionConfiguration"> 
     <bean factory-bean="dataConnectionConfigurationFactory" 
      factory-method="createDataConnectionConfiguration" /> 
    </property> 
</bean> 

<bean id="dataConnectionConfigurationFactory" class="org.apache.ftpserver.DataConnectionConfigurationFactory" /> 

<bean id="nioListener" factory-bean="listenerFactory" factory-method="createListener" /> 

<afs:server id="server" anon-enabled="false"> 

    <afs:listeners> 
     <afs:listener name="default"> 
      <ref bean="nioListener"/> 
     </afs:listener> 
    </afs:listeners> 

    <!-- other AFS config --> 

</<afs:server> 
0

您可以试用PropertyOverrideConfigurer

问题是您需要知道<afs:server>标签定义的bean名称(可能是'server')以及<afs:listeners>定义的属性类型(可能是bean定义的托管列表)。

看STS豆资源管理器找到正确答案,并尝试蒙山像

<context:property-override location="classpath:config.properties" /> 

server.listeners[0].port=2222 

其他选项禁用模式验证设置验证为假的XML应用程序上下文刷新前。

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
         new String[] {"applicationContext.xml"}, false); 
     context.setValidating(false); 
     context.refresh(); 
+0

我知道哪些类对应的自定义标签,但因为'port'是一个构造ARG并没有一个二传手'财产override'不是解决办法。我不确定我了解您的其他建议,即禁用应用程序上下文中的验证。你能否详细说明一下?这里的问题是'port'属性不仅在xsd中被声明为int,而且在java类中也被声明为int。 – Vivek 2013-04-05 05:07:13

+0

我试过context.setValidating(false),它工作正常,但在BeanDefinitonParser中失败,甚至在它到达PropertyPlaceholderConfigurer之前。原因是BeanDefinitonParser将port属性解析为int,而不是将其作为String传递给PropertyPlaceholderConfigurer以稍后解析。 – Vivek 2013-04-05 12:54:59

+0

这会导致java.lang.NumberFormatException异常:对于输入字符串:“$ {ftp.port}”'。我开始认为没有简单的方法来做到这一点...... – Vivek 2013-04-05 13:00:28