今天在编写新接口时,准备对入参的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);
}
}