Spring rest控制器参数上的弹簧验证不';行不通
我有这样的控制器处理程序:Spring rest控制器参数上的弹簧验证不';行不通,spring,validation,annotations,Spring,Validation,Annotations,我有这样的控制器处理程序: @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
@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);
}
我的想法是这样的
@项目已存在于邮箱中
从未触发,我不知道为什么。这是带有约束验证的注释
@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();
}
}
@Target({方法、字段、注释\类型、构造函数、参数})
@保留(运行时)
@记录
@约束(validatedBy=ItemAlreadyExistInBasketConstraint.class)
public@interface ItemAlreadyExistInBasket{
String message()默认为“篮子中已存在项目”;
类[]组()默认值{};
类我最近还必须处理这些方法验证,不知道您是否已经找到了这个问题的答案,但我仍然要回答它
1.创建以下bean(例如在@Configuration类中):
2.用@Validated注释@RestController
3.实现您的验证器。
正如您在问题中所说的,您可以使用JSR303规范实现验证器
4.处理验证错误
在使用@Value和method validation时,Spring以不同的方式处理验证错误。因此,如果希望方法返回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();
}
/**
*处理约束异常以返回错误的请求http状态
*/
@ExceptionHandler(值={ConstraintViolationException.class})
@ResponseStatus(值=HttpStatus.BAD_请求)
公共字符串句柄ResourceNotFoundException(ConstraintViolationException e){
设置
@RestController
@Validated
[...]
public class YourController ...
/**
* 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();
}