Автоматическое динамическое связывание весной - PullRequest
1 голос
/ 30 июля 2009

Я использую 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{}

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

Ответы [ 2 ]

1 голос
/ 01 августа 2009

Вы можете создать 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 ), который находит все определения бинов контроллера по типу или имени, затем ищет соответствующие определения bean-компонента валидатора по типу или имени и добавляет соответствующий валидатор в список свойств каждого bean-компонента контроллера. У меня нет примера кода для этого, но, надеюсь, вы поняли идею.

0 голосов
/ 01 августа 2009

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

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...