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