带有 spring mvc 的 Scala 中的 JSR 303 ConstraintValidator

JSR 303 ConstraintValidator in scala with spring mvc

我混合了scala-java spring-boot mvc项目。我正在尝试使用 javax.validation.ConstraintValidator
为请求 bean 实现自定义验证器 我在这里和其他线程中读到,最好在 Java Does scala suport JSR-303 validation?

中编写注释

我在 Java 中编写了自定义约束注释,在 scala 中编写了 ConstraintValidator class,但是当我指定 @Constraint(validatedBy = ScalaCustomerValidator.class) 时,它给出了编译错误 Type mismatch: cannot convert from Class<ScalaCustomerValidator> to Class<? extends ConstraintValidator<?,?>>[].我的 ScalaCustomerValidator 确实扩展了 ConstraintValidator。

//java

@Constraint(validatedBy = ScalaCustomerValidator.class) //Type mismatch error 
@Target(value = ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ScalaCustomerValid {
    String message() default "Invalid tab to filter combination";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

//ConstraintValidator的scala定义

class ScalaCustomerValidator extends ConstraintValidator[ScalaCustomerValid, ScalaCustomer] { .. }

javap 输出:

javap ScalaCustomerValidator
Warning: Binary file ScalaCustomerValidator contains com.ScalaCustomerValidator
Compiled from "ScalaCustomerValidator.scala"
public class com.ScalaCustomerValidator implements javax.validation.ConstraintValidator<com.ScalaCustomerValid, com.ScalaCustomer> {
  public void initialize(com.ScalaCustomerValid);
  public boolean isValid(com.ScalaCustomer, javax.validation.ConstraintValidatorContext);
  public boolean isValid(java.lang.Object, javax.validation.ConstraintValidatorContext);
  public void initialize(java.lang.annotation.Annotation);
  public com.ScalaCustomerValidator();
}

您的问题是由于无法获取 class scala 对象造成的。 Scala 编译器为对象 ScalaCustomerValidator 生成名为 class 的 ScalaCustomerValidator$。 ScalaCustomerValidator$ 实际上实现了 ConstraintValidator 并且没有办法引用它的 class。 如果你在 scala 中尝试:

val cl = classOf[ScalaCustomerValidator]

你也会得到编译错误。

此问题仍未解决:https://issues.scala-lang.org/i#browse/SI-2453