现有需求如下:
新增合同时要保存补贴和费用项信息,由于都是多条,所以用list传参,但不是必传项,不传的时候不校验list中的对象,传的时候就要校验list中对象每个字段都不能为空
也就是要通过JSR303实现
- 当请求对象中传list,需要校验其中字段不为空
- 当请求对象中不传list。不做校验
请求对象如下:
@Data
@ApiModel(value = "ContractAddRequest请求", description = "添加合同请求对象")
public class ContractAddRequest {
......
@ApiModelProperty(value = "补贴集合")
@JsonProperty("contract_subsidy_add_req_list")
private List<ContractSubsidyAddRequest> contractSubsidyAddReqList;
@ApiModelProperty(value = "费用项集合")
@JsonProperty("contract_expenses_add_req_list")
private List<ContractExpensesAddRequest> contractExpensesAddReqList;
}
补贴对象,补贴对象中继续嵌套了补贴条件对象的list
@Data
public class ContractSubsidyAddRequest {
......
@ApiModelProperty(value = "补贴币种(-1前端不显示,0RMB,1USD)")
@JsonProperty("currency")
@NotNull(message = "补贴币种" + HibernateConstant.NOT_NULL)
private Integer currency;
@ApiModelProperty(value = "返点数额")
@JsonProperty("rebate_num")
@NotNull(message = "返点数额" + HibernateConstant.NOT_NULL)
private BigDecimal rebateNum;
@Valid
@ApiModelProperty(value = "补贴条件集合")
@JsonProperty("subsidy_list")
private List<ContractSubsidyDetailListRequest> subsidyList;
}
补贴条件对象
@Data
public class ContractSubsidyDetailListRequest {
.......
@ApiModelProperty(value = "条件名称(-1前端不显示,0订单量(单位:万),1销售额(单位:万),2客单价(单位:元),3作业费(单位:元))")
@JsonProperty("condition_name")
@NotNull(message = "条件名称" + HibernateConstant.NOT_NULL)
private Integer conditionName;
@ApiModelProperty(value = "条件数额")
@JsonProperty("condition_num")
@NotNull(message = "条件数额" + HibernateConstant.NOT_NULL)
private BigDecimal conditionNum;
}
controller代码
@ApiOperation("编辑合同保存")
@PostMapping("edit_contract_save")
public CommonResult editContractSave(@Validated @RequestBody ContractAddRequest request){
return contractService.editContractSave(request);
}
测试:list中的字段校验无效
网上查询了解决方案,只要在请求对象中list属性上加 @Valid
注解即可
@Valid
@ApiModelProperty(value = "补贴集合")
@JsonProperty("contract_subsidy_add_req_list")
private List<ContractSubsidyAddRequest> contractSubsidyAddReqList;
1.打开swagger测试,可以校验到list中的字段了
2.多级list也同样可以校验到