java - 自定义约束验证器注释未执行
问题描述
经过大量的冲浪、在 SO 上查看、阅读文章并尝试了很多事情后,由于某种原因,我在基于 Spring 的 Web 服务应用程序中的自定义约束没有触发。我似乎无法弄清楚这一点,所以我正在对观众进行民意调查。
我正在使用码头 9.2.2.v20140723。春季 4.3.13,休眠 5.3.0-FINAL。以下是我的文件。此时我正在尝试实现跨参数验证。这个例子很简单:如果两个参数不相等,验证失败。文件:
package com.xxx.yyy;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import com.xxx.validator.ValuesValidator;
public interface IGetValues {
@Path("/{value1}/{value2}")
@GET
@ValuesValidator
public MyResponse getValues(@PathParam("value1") String value1, @PathParam("value2") String value2);
}
下一个:
package com.xxx.yyy;
import org.springframework.stereotype.Component;
import com.xxx.validator.ValuesValidator;
@Component
public class GetValuesImpl implements IGetValues {
@Override
@ValuesValidator
public MyResponse getValues(String value1, String value2) {
return new MyResponse();
}
}
下一个:
package com.xxx.yyy.validator;
import java.lang.annotation.Documented;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraintvalidation.SupportedValidationTarget;
@Target({METHOD, CONSTRUCTOR, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = ValuesValidatorImpl.class)
@Documented
@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public @interface ValuesValidator {
String message() default "The two values don't match";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
下一个:
package com.xxx.yyy.validator;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;
@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class ValuesValidatorImpl implements
ConstraintValidator<ValuesValidator, Object[]> {
@Override
public void initialize(ValuesValidator valuesValidator) {
}
@Override
public boolean isValid(Object[] values, ConstraintValidatorContext constraintValidatorContext) {
String val1 = (String) values[0];
String val2 = (String) values[1];
return val1.equals(val2);
}
}
我正在使用 PostMan 获取 URL:
http://localhost:9086/path/v1/values/A/B
由于“A”不是“B”,我应该抛出一个验证异常和某种“你糟透了!” 回码。没有运气。
该服务被调用得很好,我从 MyResponse 得到了预期的响应。但是验证器没有被解雇。这是肯定的。我使用过 System.outs、断点等。它只是没有发生。
一位消息人士说要创建一个 @Configuration 类并向其添加一个返回 ValuesValidatorImpl 对象的 @Bean getter。试过了,没用。我将它添加到我的 applicationContext.xml 文件中声明的组件扫描包中。
各位有什么建议吗?“它在示例中运行良好”这次似乎没有在这里发生。
更新:我将我的问题发布到 Jetty 用户列表中,并且一名成员要求提供问题可用性的示例实现。在 Github 上,所以我有义务。要重现问题行为,请参阅:
https://github.com/mcc99/samples/tree/master/customer-validator
与 IntelliJ IDEA 社区一起开发,包括一个 Maven .pom 文件,用于轻松检查和检索依赖项。
并提前感谢您可能决定对此问题进行的任何滑动。我很难相信这是一个现在还没有出现的问题,所以我不得不想象我做错了什么/错过了什么。另请注意,我已经尝试了最新的版本。码头和有问题的行为仍在继续。
解决方案
您必须在目标 bean 上添加注释 @Validated。
import org.springframework.validation.annotation.Validated;
//..
@Component
@Validated
public class GetValuesImpl implements IGetValues {
否则,此 bean 将不会附加您提供的自定义验证。
推荐阅读
- swift - 后台定时器运行
- jquery - jQuery offset() 缩放后返回相同的最大值?
- react-native - 我安装了 react-native-barcode-builder 并得到一个空白矩形
- kotlin - 为什么无法访问的语句方法不会导致编译错误?
- docker - 如何从 Concourse CI 中的 git 资源构建 docker-compose 容器?
- python - Tkinter 在终端中工作但不在 sublime 中(mac)
- java - Android 上的 AnyChart 着色网格
- php - 如何在已由 mysql 填充的下拉列表中设置值
- c# - VSIX:从 VS2017 移植到 VS2019 的步骤
- python - 如何从特定文件夹中的 Outlook 中的不同帐户读取 Outlook 电子邮件?