0

Я новичок в весне. Админы моего веб-приложения, основанного на весне, хотят настроить параметры из веб-интерфейса, чтобы пользователи могли аутентифицироваться на сервере LDAP с указанием имени и пароля своей компании.Переключение соединения LDAP во время работы весной

Изменение параметров LDAP должно быть возможным без перезапуска приложения. Это может произойти во время «миграции» или по любой причине. У меня есть пара бобы, которые должны быть обновлены после того, как администратор сохраняет новые настройки для сервера LDAP:

<bean id="ldapServer" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <constructor-arg> 
     <list> 
      <value>${ldap.url1}</value> 
      ... 
     </list> 
    </constructor-arg> 
    <constructor-arg value="${ldap.basedn}"</constructor-arg> 
    <property name="referral" value="${ldap.referral}" /> 
    <property name="baseEnvironmentProperties">...</property> 
    <property name="userDn" value="${ldap.username}" /> 
    <property name="password" value="${ldap.password}" /> 
</bean> 

Я использую Springframework 3.1.2. Проблема в том, что есть аргументы конструктора, которые я хочу изменить и не влиять на другие текущие задания. Я пытался играть с контекстными прокси, но не большим успехом еще:

<bean id="ldapServer" scope="prototype" ...> 
    <aop:scoped-proxy/> 

Я был успешным, хотя, чтобы получить ldapServer к reinstantiate, при использовании рамки прототипа, запустив этот кусок кода:

@Controller 
public class LDAPSettingsController implements ApplicationContextAware { 
    public ModelAndView handleRequest(...) { 
     DefaultSpringSecurityContextSource ldap; 
     ldap = context.getParentBeanFactor().getBean("ldapServer"); 

     System.out.println(ldap.hashCode()); 

     return new ModelAndView(new RedirectView('login.jsp')); 
    } 
    ... 
} 

Are области и прокси-серверы здесь, путь, или другой механизм весной, чтобы отразить изменения конфигурации в исполняемый экземпляр программы?

ОБНОВЛЕНИЕ: Устраните вопрос. UPDATE: Корневая проблема с прокси АОП был следующим корневым исключением:

java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given 

ответ

0

То, что работало добавлял proxy-target-class="false" атрибут в <aop:scoped-proxy/> тега. Я создал новую область, которая работает лучше, чем прототип - она ​​уничтожает бобы при обновлении настроек. Теперь у меня есть это в моем beans.xml:

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> 
    <property name="scopes"> 
    <map> 
     <entry key="ldap"> 
     <ref bean="ldapScope" /> 
     </entry> 
    </map> 
    </property> 
</bean> 

<bean id="ldapScope" class="com.myapp.SettingsScope" /> 

<bean id="ldapServer" scope="ldap" ...> 
    <aop:scoped-proxy proxy-target-class="false"/> 
    <constructor-args> 
     <list><value>${ldap.url1}</value> .. </list> 
    </constructor-args> 
    ... 
</bean> 

У меня также есть контроллер для настройки LDAP, в который я инъекционные ldapScope и я называю метод, который разрушает объекты тока жизненного цикла и начинается новый жизненный цикл каждый время, пользователь нажимает кнопку Apply.

PS: Не уверен, что я вернусь к «повторному запуску» жизненного цикла в правильном направлении - люди ищут автозапуска и запускают их после такого события (например: Настройка -> Применить)

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