gpt4 book ai didi

java - spring自动动态绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-04 08:59:26 25 4
gpt4 key购买 nike

我正在使用 spring MVC,并希望公开默认 validator 以供 javascript 使用。我有一堆扩展公共(public)抽象类的 Controller 和一堆实现公共(public)接口(interface)的 validator 。情况是这样的:

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{}

我想分别自动为每个具体 Controller 设置 validator 字段(以便 FooController.validator 将是 FooValidator 的实例)。匹配应该由类名自动完成。

最佳答案

您可以创建一个BeanPostProcessor来执行此操作并将其注册到应用程序上下文中。后处理器可以查找具有正确命名约定的 AbstractController 实例,生成 validator 名称,通过反射实例化 validator 对象,并将其设置在 Controller 中。像这样的事情:

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;
}

或者,如果 validator 由于需要依赖注入(inject)或其他原因而注册为 Spring bean,您可以创建一个 BeanFactoryPostProcessor(不是 BeanPostProcessor),它按类型或名称查找所有 Controller bean 定义,然后按类型或名称查找匹配的 validator bean 定义,并将匹配的 validator 添加到每个 Controller bean 的属性列表中。我没有相关的示例代码,但希望您能明白。

关于java - spring自动动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1207044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com