gpt4 book ai didi

java - 如何在调用之前拦截方法并检查参数?

转载 作者:太空宇宙 更新时间:2023-11-04 10:26:47 25 4
gpt4 key购买 nike

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

我添加自定义注释 Dto、DtoFiels 并将其写入 RestController 和方法 createEntity 上。如何检查带注释的 DtoFiels 对象中注释的所有字段。我尝试添加 BeanPostProcessor 并使用 Proxy.newProxyInstance 和 InitationHandler 进行调用,但它抛出 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;

最佳答案

您可以使用验证组来定义应验证哪些约束以及不应验证哪些约束。我假设当调用 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 ,仅检查名称不为空。不应用大小和正则表达式验证。

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

关于java - 如何在调用之前拦截方法并检查参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50450337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com