弹簧自动动态绑定

时间:2009-07-30 14:38:25

标签: java spring-mvc

我正在使用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 个答案:

答案 0 :(得分: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 bean,则可以创建一个 BeanFactoryPostProcessor (不是 BeanPostProcessor )来查找所有控制器按类型或名称定义bean,然后按类型或名称查找匹配的验证器bean定义,并将匹配的验证器添加到每个控制器bean的属性列表中。我没有示例代码,但希望你能得到这个想法。

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