如何在调用和检查param之前拦截方法?

时间:2018-05-21 13:47:15

标签: java spring validation

如何在调用之前拦截方法并检查param?

我添加自定义注释Dto,DtoFiels并将其写在RestController和方法createEntity上。 如何检查在对象注释的DtoFiels中注释的所有字段。 我尝试添加BeanPostProcessor并使用InvocationHandler调用Proxy.newProxyInstance,但它抛出ExceptionHandlerExceptionResolver - Resolved exception caused by Handler execution: org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction

我尝试使用我的注释添加ConstraintValidator并注释@Valid,但它会检查注释@NotNull和@CreatedDate的所有字段。

方法

 @PostMapping @Dto
 public CompletableFuture<Response> createEntity(@RequestBody Entity entity) {

班级实体:

@Column(nullable = false)
protected String name;

protected String description;

@Column(nullable = false, updatable = false)
@CreatedDate
protected LocalDateTime creationDate;

@NotNull
protected boolean deleted;

@NotNull
@LastModifiedDate
protected LocalDateTime modificationDate;

1 个答案:

答案 0 :(得分:0)

您可以使用验证组来定义应验证哪些约束以及不应验证哪些约束。我假设在调用createEntity时,您不希望强制执行@NotNull和其他验证。相反,您需要执行其他一些自定义验证代码...

class level constraint中定义您的验证。

@Data
public class Person {

    @NotEmpty
    @Size(min = 10)
    @Pattern(regexp = "[0-9]*")
    private String name;
}

自定义类级别约束

@Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { PersonValidator.class })
@Documented
public @interface ValidPerson {

    String message() default "Invalid person";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

上面定义的自定义约束的Validator,它仅检查名称是否为null。不适用大小和正则表达式验证。

public class PersonValidator implements ConstraintValidator<ValidPerson, Person> {
    @Override
    public boolean isValid(Person person, ConstraintValidatorContext context) {
        // Add your validation code here
        if (person == null) {
            return true;
        }
        return person.getName() != null;
    }
}

创建自定义组并使用此组验证参数。由于您的常规验证不属于此组,因此不会验证这些约束。

public interface CustomPersonGroup {

}

@Service
@Validated
public class SomeService {

    public void test(@Validated(value = CustomPersonGroup.class) @ValidPerson Person person) {

    }
}

如果您要执行的验证可以用标准bean验证注释表示,则可以执行以下操作。

@Data
public class Person {

    @NotEmpty(groups = CustomPersonGroup.class)
    @Size(min = 10)
    @Pattern(regexp = "[0-9]*")
    private String name;
}