有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

spring中的java自动动态绑定

我正在使用SpringMVC,并希望公开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{}

我想分别为每个具体控制器自动设置validator字段(这样FooController.validator将是foodalidater的实例)。 应自动按类名进行匹配


共 (2) 个答案

  1. # 1 楼答案

    你不能在你的配置中使用这样的东西吗:

    <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>
    
  2. # 2 楼答案

    您可以创建一个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;
    }
    

    或者,如果验证器注册为SpringBean,因为它们需要依赖项注入或其他什么,那么您可以创建一个BeanFactoryPostProcessor(而不是BeanPostProcessor),按类型或名称查找所有控制器bean定义,然后按类型或名称查找匹配的验证程序bean定义,并将匹配的验证程序添加到每个控制器bean的属性列表中。我没有这方面的示例代码,但希望您能理解