gpt4 book ai didi

其余 Controller 参数的 Spring 验证不起作用

转载 作者:行者123 更新时间:2023-12-05 01:16:37 26 4
gpt4 key购买 nike

我有这样的 Controller 处理程序:

@RequestMapping(method = POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ApiOperation(value = "Add to basket")
@ApiResponses(value = {@ApiResponse(code = 200, message = "Successfully add to basket")})
@PreAuthorize("@securityService.hasUserAccess()")
public ResponseEntity addToBasket(@RequestBody @ItemAlreadyExistInBasket ProductEntity product) {
basketService.addToBasket(product);
return new ResponseEntity(HttpStatus.OK);
}

认为是注解

@ItemAlreadyExistInBasket

从未触发,我不知道为什么。这是我的带有约束验证的注释

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = ItemAlreadyExistInBasketConstraint.class)
public @interface ItemAlreadyExistInBasket {
String message() default "Item already exist in basket";

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

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

public class ItemAlreadyExistInBasketConstraint implements ConstraintValidator<ItemAlreadyExistInBasket, ProductEntity> {

@Autowired
private BasketRepository basketRepository;

@Autowired
private UserRepository userRepository;

@Override
public void initialize(ItemAlreadyExistInBasket constraintAnnotation) {

}

@Override
public boolean isValid(ProductEntity productEntity, ConstraintValidatorContext context) {
userRepository.findByLogin(UserUtil.getAuthenticatedUserName());
return basketRepository.findByUserAndStatusAndProduct(userRepository.findByLogin(UserUtil.getAuthenticatedUserName()), Status.ACTIVE, productEntity).isEmpty();
}
}

有什么想法吗?

最佳答案

我最近也在处理这些方法验证,不知道你是否已经找到了这个问题的答案,但我还是要回答一下。以下适用于 Spring 4.1.2(也可能是更早的版本)

1。创建以下 bean(例如在 @Configuration 类中):

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}

2。用@Validated 注释你的@RestController

@RestController
@Validated
[...]
public class YourController ...

3。实现您的验证器。

就像您在问题中发布的一样,您可以使用 JSR303 规范实现验证器。

4。处理验证错误

不知何故,Spring 在使用@Value 和方法验证时以不同方式处理验证错误。因此,如果您希望您的方法返回 400 错误而不是抛出服务器异常,您还需要实现与此方法类似的东西:

/**
* Handle Constraint exceptions in order to return a bad request http status
*/
@ExceptionHandler(value = { ConstraintViolationException.class })
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public String handleResourceNotFoundException(ConstraintViolationException e) {
Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
StringBuilder strBuilder = new StringBuilder();
for (ConstraintViolation<?> violation : violations ) {
strBuilder.append(violation.getMessage() + "\n");
}
return strBuilder.toString();
}

奇怪的是,我不得不将这个方法放在我的 RestController 中。我确实在 @Configuration 类中测试了它的实现,但它没有用。

重要!

两种类型的验证都可以使用@Valid 和@Validated

如果您同时需要 POJO 验证和方法参数验证,请在类级别上使用 @Validated 批注,并在方法上的 POJO 之前使用 @Valid。使用@Valid 注解时,在此 POJO 中声明的所有内容(例如字段上的@NotNull)也将被验证。这是我必须实现的用例。

希望这对您有所帮助!

关于其余 Controller 参数的 Spring 验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39870093/

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