Spring 3.1 Autowiring 在自定义约束验证器中不起作用

标签 spring validation customvalidator hibernate-validator

我在自定义约束验证器中遇到 bean Autowiring 问题。没有使用 Spring 的 LocalValidatorFactoryBean 给出约束验证器实例。 JSR-303 提供程序是 hibernate-validator 4.2.0.Final。

Spring 配置摘录:

<!-- JSR 303 validation -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 

自定义约束验证器:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.springframework.beans.factory.annotation.Autowired;

import com.model.Subject;
import com.services.SomeTypeService;

public class ReadOnlyValidator implements ConstraintValidator<ReadOnly, String> {

@Autowired
private SomeTypeService someTypeService;

@Override
public void initialize(ReadOnly constraintAnnotation) { }

@Override
public boolean isValid(String type, ConstraintValidatorContext context) {
    try {
         if (null != type) {
                        return !someTypeService.isReadonly(type);
                     }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return false;
}
}

注释:

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target( { METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER } )
@Retention(RUNTIME)
@Constraint(validatedBy = ReadOnlyValidator.class)
@Documented
public @interface ReadOnly {
String message() default "{constraints.subjecttype.readonly}";
public abstract Class<?>[] groups() default {};
public abstract Class<? extends Payload>[] payload() default {};
}

一些服务:

 @Validated
 public interface SomeService {
    ...
    public void updateType(@ReadOnly String type) throws SomeException;
    ...
 }

SomeServiceImpl :

 @Service
 public class SomeServiceImpl implements SomeService {
  ...
    public void updateType(String type) throws SomeException {
     // do something
    }
  ...
 }

SomeTypeService 是另一个不依赖于 SomeService 的 @Service 注释 bean ...

问题是我得到一个 NPE,因为 Autowiring 不起作用;其他人正在管理自定义验证器实例,而不是 Spring ...

提前感谢任何类型的建议。

最佳答案

发现问题。 MethodValidationPostProcessor 和 mvc:annotation-driven 声明必须使用相同的“验证器”bean 引用:

service-context.xml

<!-- JSR 303 validation -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
    <property name="validator" ref="validator"/>
</bean>
    ...

dispatcher-servlet.xml

...
<mvc:annotation-driven validator="validator" />
...

关于Spring 3.1 Autowiring 在自定义约束验证器中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12676299/

相关文章:

java - spring 中的 c 命名空间构造函数参数 : Attribute c:_ is not allowed here

java - Spring Security 在登录后总是返回 403 accessDeniedPage

javascript - 如果在 jQuery 中放错位置,脚本将无法工作

asp.net-mvc - 自定义模型绑定(bind)、模型状态和数据注释

WCF:找不到我在 web.config 中指定的自定义验证器 - customUserNamePasswordValidatorType - - 无法加载文件或程序集... - 帮助?

jquery - 如何创建 jQuery 函数来验证 ASP 复选框列表上的自定义验证器

java - Spring 没有注入(inject) bean,我做错了什么?

java - 嵌套异常是 java.lang.NoClassDefFoundError : MappingJacksonHttpMessageConverter after making changes in pom. xml

ruby-on-rails - Rails before_validation 剥离空白最佳实践

asp.net - asp:CustomValidator/OnServerValidate