Java/Spring:为什么获胜';t Spring是否使用我配置的验证器对象?
我正在用Java&spring2.5.6编写一个web应用程序,并使用注释进行bean验证。我可以很好地工作,Spring甚至会调用在目标bean上用@Validator声明的自定义验证器。但它总是实例化一个全新的验证器对象来完成它。这是不好的,因为新的验证器没有需要运行的注入依赖项,因此它在验证时抛出空指针异常。我需要两件事中的一件,但我都不知道怎么做Java/Spring:为什么获胜';t Spring是否使用我配置的验证器对象?,java,validation,spring,annotations,Java,Validation,Spring,Annotations,我正在用Java&spring2.5.6编写一个web应用程序,并使用注释进行bean验证。我可以很好地工作,Spring甚至会调用在目标bean上用@Validator声明的自定义验证器。但它总是实例化一个全新的验证器对象来完成它。这是不好的,因为新的验证器没有需要运行的注入依赖项,因此它在验证时抛出空指针异常。我需要两件事中的一件,但我都不知道怎么做 说服Spring使用我已经配置的验证器 说服Spring在创建新的验证器时遵守@Autowired注释 验证器有@Component注释,如下
@Component
public class AccessCodeBeanValidator implements Validator {
@Autowired
private MessageSource messageSource;
// first validate via the annotations on the bean
beanValidator.validate(accessCodeBean, result);
// then validate using the specific validator class
acbValidator.validate(accessCodeBean, result);
if (result.hasErrors()) {
@Resource(name="accessCodeBeanValidator")
public void setAcbValidator(Validator acbValidator) {
this.acbValidator = acbValidator;
}
Spring在组件扫描中找到验证器,注入自动连线依赖项,但随后忽略它,并在验证时创建一个新的验证器
目前我唯一能做的就是为每个验证器对象向控制器中添加一个验证器引用,并直接使用该引用,而不是依赖bean验证框架为我调用验证器。看起来像这样
@Component
public class AccessCodeBeanValidator implements Validator {
@Autowired
private MessageSource messageSource;
// first validate via the annotations on the bean
beanValidator.validate(accessCodeBean, result);
// then validate using the specific validator class
acbValidator.validate(accessCodeBean, result);
if (result.hasErrors()) {
@Resource(name="accessCodeBeanValidator")
public void setAcbValidator(Validator acbValidator) {
this.acbValidator = acbValidator;
}
如果有人知道如何说服spring使用现有的验证器,而不是创建一个新的验证器,或者如何让它在创建一个新的验证器时进行自动连接,我很想知道
编辑:下面的代码告诉spring对bean使用什么样的验证器
@Validator(AccessCodeBeanValidator.class)
public class AccessCodeBean {
它可以工作,但如上所述受到限制。所以,目前,我已经注释掉了@Validator行,而是像这样将验证器自动连接到控制器
@Component
public class AccessCodeBeanValidator implements Validator {
@Autowired
private MessageSource messageSource;
// first validate via the annotations on the bean
beanValidator.validate(accessCodeBean, result);
// then validate using the specific validator class
acbValidator.validate(accessCodeBean, result);
if (result.hasErrors()) {
@Resource(name="accessCodeBeanValidator")
public void setAcbValidator(Validator acbValidator) {
this.acbValidator = acbValidator;
}
我怀疑您只是遇到了模块的限制,而不是使用的限制。你能展示将验证器附加到你的控制器上的代码(注释)吗?我想可能是这样的,但这是一个相当大的遗漏,你不觉得吗?在许多情况下,您需要针对数据库中的某些内容或以前存在的资源进行验证。我希望开发商能仔细考虑一下。是的,我同意,这是一个奇怪的遗漏。我只是在想,如果他们希望这些是Springbean,他们会提供一些不同的选项来查找它们(例如,bean名称),而不仅仅是按类查找。不过,我不是100%确定,因为我还没有尝试查看他们的代码。我怀疑您只是遇到了模块的限制,而不是使用的限制。你能展示将验证器附加到你的控制器上的代码(注释)吗?我想可能是这样的,但这是一个相当大的遗漏,你不觉得吗?在许多情况下,您需要针对数据库中的某些内容或以前存在的资源进行验证。我希望开发商能仔细考虑一下。是的,我同意,这是一个奇怪的遗漏。我只是在想,如果他们希望这些是Springbean,他们会提供一些不同的选项来查找它们(例如,bean名称),而不仅仅是按类查找。但我不是100%确定,因为我还没有尝试查看他们的代码。