【问题标题】:Spring 3.2 using cross parameter constraintSpring 3.2 使用交叉参数约束
【发布时间】:2014-04-03 11:09:13
【问题描述】:

我正在尝试使用针对方法参数的交叉参数约束验证器。问题是验证不是针对方法参数触发的,而是针对方法返回值触发的。
我正在使用 Spring 的 LocalValidatorFactoryBean。
JSR-303 提供程序是 hibernate-validator 4.2.0.Final。
Spring 版本是 3.2.0。

Spring 配置摘录:

<!-- 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>

自定义约束验证器:

@SupportedValidationTarget( ValidationTarget.PARAMETERS )
public class InstanceValidator implements
    ConstraintValidator<InstanceCheck, Object[]> {

  @Override
  public void initialize(InstanceCheck constraintAnnotation) {}

  @Override
  public boolean isValid(Object[] value, ConstraintValidatorContext context) {
  ...
  }
}

注释:

@Target( { METHOD, ANNOTATION_TYPE, CONSTRUCTOR } )
@Retention(RUNTIME)
@Constraint(validatedBy = InstanceValidator.class)
@Documented
public @interface InstanceCheck {
   String message() default "{constraint.instance.not.allowed}";
   public abstract Class<?>[] groups() default {};
   public abstract Class<? extends Payload>[] payload() default {};
}

一些服务:

 @Validated
 public interface SomeService {
    ...
    @InstanceCheck
    public String addContent(String content) throws SomeException;
    ...
 }

SomeServiceImpl :

 @Service
 public class SomeServiceImpl implements SomeService {
  ...
    public String addContent(String content) throws SomeException {
     // do something
    }
  ...
 }

:更新:

我已经尝试为注解类型添加“validationAppliesTo”方法(见下文)

  @Target( { METHOD, ANNOTATION_TYPE, CONSTRUCTOR } )
  @Retention(RUNTIME)
  @Constraint(validatedBy = InstanceValidator.class)
  @Documented
  public @interface InstanceCheck {
   String message() default "{constraint.instance.not.allowed}";
   public abstract Class<?>[] groups() default {};
   public abstract Class<? extends Payload>[] payload() default {};
   ConstraintTarget validationAppliesTo() default ConstraintTarget.PARAMETERS;
}

,现在我收到以下错误: “约束中不允许使用以 'valid' 开头的参数。”

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

【问题讨论】:

    标签: java spring constraints hibernate-validator


    【解决方案1】:

    仅在 Hibernate Validator 5.x(Bean Validation 1.1)中支持跨参数约束。 Hibernate Validator 4.2 不知道如何处理这些约束。

    【讨论】:

    • 我将 JSR-303 提供程序更改为 hibernate-validator 5.1.0 但没有成功。会不会和Spring有关?
    • 要使用 Bean Validation 1.1,您必须升级到 Spring 4(Spring 3.2 可以使用 Bean Validation 1.0 / Hibernate Validator 4.x)。如果您不能轻松更新,您可以尝试使用 BV 1.1 API 而不是使用 Spring 提供的 bean 创建自己的工厂 bean 和拦截器以进行方法验证。
    【解决方案2】:

    这是 Hibernate Validator 中的编码问题或临时解决方案。

    删除自定义 Annotation 中以 'valid' 开头的任何字段或方法。

    在您的示例重命名方法中 -

    ConstraintTarget validationAppliesTo() 默认 ConstraintTarget.PARAMETERS;

    到

    ConstraintTarget xxxxxationAppliesTo() 默认 ConstraintTarget.PARAMETERS;

    问题代码ConstraintHelper-

        private void assertNoParameterStartsWithValid(Class<? extends Annotation> annotationType) {
        final Method[] methods = run( GetDeclaredMethods.action( annotationType ) );
        for ( Method m : methods ) {
            if ( m.getName().startsWith( "valid" ) && !m.getName().equals( VALIDATION_APPLIES_TO ) ) {
                throw log.getConstraintParametersCannotStartWithValidException();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多