Spring配置自定义命名空间

时间:2013-04-04 05:44:34

标签: spring

我有一个带有嵌入式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>

我想从属性文件加载port nio-listener属性,但是

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

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

2 个答案:

答案 0 :(得分:0)

您可以尝试使用PropertyOverrideConfigurer

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

查看STS bean explorer以找到正确答案并尝试类似

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

server.listeners[0].port=2222

其他选项是在xml应用程序上下文中刷新之前禁用模式验证设置验证为false。

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

答案 1 :(得分: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>