2013-04-04 3 views
-1

У меня есть автономное приложение Spring со встроенным FTP-сервером Apache. Конфигурации выглядит следующим образом -Конфигурация пользовательского пространства Spring config

<?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 и загрузить свойство порта из файла или из свойств системы.

ответ

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> определяет (может быть «сервер») и тип свойства, который <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

Я знаю, какие классы соответствует пользовательским тегам, но 'свойство-override' не является решением, так как' port' является конструктором аргумент и не имеет сеттера. Я не уверен, что понимаю ваше другое предложение об отключении проверки в контексте приложения. Не могли бы вы рассказать? Проблема здесь в том, что свойство 'port' объявляется как int не только в xsd, но и в классе java. – Vivek

+0

Я пробовал context.setValidating (false), который работал, но он не работает в BeanDefinitonParser, даже до того, как он попадает в PropertyPlaceholderConfigurer. Причина в том, что BeanDefinitonParser анализирует свойство порта как int вместо того, чтобы передавать его как String для PropertyPlaceholderConfigurer для решения позже. – Vivek

+0

Это приводит к 'java.lang.NumberFormatException: для строки ввода:" $ {ftp.port} "'. Я начинаю думать, что нет простого способа сделать это ... – Vivek

Смежные вопросы