今天在编写新接口时,准备对入参的List做非空校验,但是加上注解后发现List和对象的校验都不生效,只有入参是一个单体对象时属性上的校验才会生效。找了几篇csdn的文章发现如果需要校验的对象如果是一个集合则需要在类上加,@Validated注解,否则注解不生效。

场景复现

实体对象

import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Data
public class GetItemNoPositionDetailDTO {

    @NotBlank(message = "addressFlag不能为空")
    private String addressFlag;
    
    @NotBlank(message = "policyNo不能为空")
    private String policyNo;
    
    @NotBlank(message = "endorSeqNo不能为空")
    private String endorSeqNo;
    
    @NotBlank(message = "subPolicyNo不能为空")
    private String subPolicyNo;
    
    @NotNull(message = "itemNo不能为空")
    private Long itemNo;

}

接口层

@RestController
@RequestMapping("/policy")
public class PolicyController {

    @Resource
    private CheckTokenUtil checkTokenUtil;
    @Resource
    private PolicyService policyService;
  
    @PostMapping("/get-item-no-position-detail-all")
    public ResponseBean<List<GetItemNoPositionDetailVO>> getItemNoPositionDetailAll(@RequestHeader(
            "Authorization") String authorization,@Valid @NotEmpty(message = "保单列表清单不能为空") @RequestBody List<GetItemNoPositionDetailDTO> searchDTO) {
        String companyCode = checkTokenUtil.getCompanyCode(authorization);
        
        List<GetItemNoPositionDetailVO> itemNoPositionDetail =
                policyService.getItemNoPositionDetailAll(searchDTO,companyCode);
        return new ResponseBean<>(itemNoPositionDetail);
    }

}

修改接口层适配List校验

@Valid注解用于验证对象的属性值是否满足指定的约束条件。但是,@Valid注解默认情况下不会对集合(如List、Set等)内部的元素进行验证。这意味着即使集合内部存在不符合约束条件的元素,验证也可能不会生效,从而导致校验失效的问题。
只需要在类上加上@Validated注解即可

@RestController
@RequestMapping("/policy")
@Validated
public class PolicyController {

    @Resource
    private CheckTokenUtil checkTokenUtil;
    @Resource
    private PolicyService policyService;
  
    @PostMapping("/get-item-no-position-detail-all")
    public ResponseBean<List<GetItemNoPositionDetailVO>> getItemNoPositionDetailAll(@RequestHeader(
            "Authorization") String authorization,@Valid @NotEmpty(message = "保单列表清单不能为空") @RequestBody List<GetItemNoPositionDetailDTO> searchDTO) {
        String companyCode = checkTokenUtil.getCompanyCode(authorization);
        
        List<GetItemNoPositionDetailVO> itemNoPositionDetail =
                policyService.getItemNoPositionDetailAll(searchDTO,companyCode);
        return new ResponseBean<>(itemNoPositionDetail);
    }

}