如何在调用之前拦截方法并检查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;
答案 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;
}