2009-07-30 2 views
1

Я использую Spring MVC и хотел бы использовать шаблон проверки подлинности по умолчанию для использования javascript. У меня есть куча контроллеров, расширяющих общий абстрактный класс и набор валидаторов, реализующих общий интерфейс. Ситуация чем-то вроде этого:Автоматическое динамическое связывание весной

public abstract class AbstractController { 
protected Validator validator; 
} 

public class FooController extends AbstractController{} 
public class BarController extends AbstractController{} 

public interface Validator {} 
public class FooValidator implementes Validator{} 
public class BarValidator implementes Validator{} 

Я хотел бы, чтобы автоматически установить поле валидатор для каждого конкретного контроллера respectivelly (так что FooController.validator будет экземпляром FooValidator). Соответствие должно выполняться с помощью имен классов автоматически.

+0

Есть бобы для валидаторов? –

+0

yep, они сконфигурированы как фасоль – awk

ответ

1

Для этого необходимо создать BeanPostProcessor и зарегистрировать его в контексте приложения. Почтовый процессор может искать AbstractController экземпляры с надлежащим соглашением об именах, сгенерировать имя валидатора, создать экземпляр объекта проверки с помощью отражения и установить его в контроллере. Что-то вроде этого:

public Object postProcessAfterInitialization(final Object bean, final String name) throws BeansException { 
    if (bean instanceof AbstractController) { 
     String controllerName = bean.getClass().getSimpleName(); 
     if(controllerName.endsWith("Controller")) { 
      String validatorName = controllerName.replaceFirst("Controller$", "Validator"); 
      try { 
       Class<?> validatorClass = Class.forName(validatorName); 
       Validator validator = (Validator)validatorClass.newInstance(); 
       ((AbstractController)bean).setValidator(validator); 
      } catch(Exception e) { 
       throw new FatalBeanException("Cannot instantiate validator", e); 
      } 
     } 
    } 
    return bean; 
} 

В качестве альтернативы, если валидаторы зарегистрированы как Spring бобы, потому что они нуждаются в зависимости инъекции или что-то, вы можете создать BeanFactoryPostProcessor (а не BeanPostProcessor), который находит все определения контроллера боба по типу или имени, затем просматривает соответствующие определения ведомых компонентов валидатора по типу или имени и добавляет соответствующий валидатор в список свойств каждого компонента контроллера. У меня нет образца кода для этого, но, надеюсь, вы получите эту идею.

0

не могли бы вы использовать что-то подобное в вашей конфигурации:

<bean id="abstractControllerTemplate" abstract="true"> 
    <property name="validator" ref="myFormValidator"/> 
</bean> 
... 
<bean id="someOtherConcreteController" class="com.myproj.controllers.SomeOtherConcreteController" parent="abstractControllerTemplate"> 
     <!-- other properties specific to this controller --> 
</bean> 
+0

Это не то, что я имел в виду под автоматическим назначением – awk

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