如何以编程方式在方法级别上运行Bean Validation?

时间:2018-03-09 03:26:49

标签: java bean-validation

我正在尝试创建一个给出以下方法签名的验证器:

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]);
}

是一个空集,即验证没有在地图上执行。

2 个答案:

答案 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 );