我正在尝试创建一个给出以下方法签名的验证器:
String methodName = String.format("%s[%s]", joinPoint.getSignature().toShortString(), joinPoint.getArgs()[0].toString());
如果存在违规行为,我将抛出ConstraintViolationException
我可以遍历public void validateAllParameters(
final Method method,
final Object[] parameterValues)
并在每个上运行parameterValues
,但是当我这样做时,我没有包含哪个参数的路径信息。
我尝试将.validate()
汇总到这样的地图中
parameterValues
但是
Map<String, @Valid Object> parameterMap = new LinkedHashMap<>();
for (int i = 0; i < method.getParameterCount(); ++i) {
parameterMap.put(method.getParameters()[i].getName(), parameterValues[i]);
}
是一个空集,即验证没有在地图上执行。
答案 0 :(得分:0)
如果你使用springframework,你可以使用MethodValidationPostProcessor实现这样的方法级验证。
@Validated
@Service
public class GreetingService {
public GreetingService() {
System.out.println("init GreetingService");
}
public void validate(
@Min(message = "service中的page不能小于5", value = 5) int page,
@Max(message = "service中的size不能大于20", value = 20) int size) {
System.out.println(page + " : " + size);
}
}
您可以捕获ConstraintViolationException以获取验证错误,并使用MethodValidationPostProcessor config。
public Map handle(ConstraintViolationException exception) {
return error(exception.getConstraintViolations()
.stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.toList()));
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
希望能帮到你
答案 1 :(得分:0)
为什么不使用BeanValidation参数验证? (link to doc)。 例如,我们有一个类:
class Foo {
public void bar(@NotNull String string) {
}
}
你想验证bar方法的参数,你可以这样做:
ExecutableValidator executableValidator = Validation.byDefaultProvider().configure()
.buildValidatorFactory().getValidator().forExecutables();
Foo foo = new Foo();
Object[] parameterValues = { null };
Method method = Foo.class.getMethod( "bar", String.class );
Set<ConstraintViolation<Foo>> violations = executableValidator
.validateParameters( foo, method, parameterValues );
assertThat( violations ).hasSize( 1 );