在 Spring 中使用 @RequestPart 时,@Valid 不起作用
@Valid does not work when @RequestPart is used in Spring
当使用 @RequestPart
时,@Valid
注释未调用验证器。在其他地方,我使用 @Valid
和 @RequestBody
并且效果很好。
也没有错误只是通过了错误的验证。
下面是代码。
@InitBinder("campaignCreatorDTO")
public void initCreatorDTOBinder(WebDataBinder binder) {
binder.addValidators(new CreatorDTOValidator());
}
@PostMapping(value = "/creator", consumes = {"multipart/form-data"}, produces = {"application/json"})
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public @Valid
ResponseDTO creator(@Valid @RequestPart("json") CampaignCreatorDTO campaignCreatorDTO,
@RequestPart(name = "file", required = false) MultipartFile adGraphic) {
}
运行 使用 Validator Bean 在控制器方法中进行验证:
org.springframework.validation.Validator
@Autowired
protected Validator validator;
PostMapping(value = "/creator", consumes = {"multipart/form-data"}, produces = {"application/json"})
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public @Valid
ResponseDTO creator(@RequestPart("json") CampaignCreatorDTO campaignCreatorDTO,
@RequestPart(name = "file", required = false) MultipartFile adGraphic) {
validator.validate(campaignCreatorDTO);
}
如 here 所述,@InitBinder
使用传递给它的值进行具有相同命名请求参数或模型属性的目标验证。问题是您两者都没有,因为您在特定端点 /creator
中使用了多部分表单数据输入。因此,从 @InitBinder
中删除命名限制将是解决方案。
@InitBinder
public void initCreatorDTOBinder(WebDataBinder binder) { ... }
@RequestPart
时,@Valid
注释未调用验证器。在其他地方,我使用 @Valid
和 @RequestBody
并且效果很好。
也没有错误只是通过了错误的验证。
下面是代码。
@InitBinder("campaignCreatorDTO")
public void initCreatorDTOBinder(WebDataBinder binder) {
binder.addValidators(new CreatorDTOValidator());
}
@PostMapping(value = "/creator", consumes = {"multipart/form-data"}, produces = {"application/json"})
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public @Valid
ResponseDTO creator(@Valid @RequestPart("json") CampaignCreatorDTO campaignCreatorDTO,
@RequestPart(name = "file", required = false) MultipartFile adGraphic) {
}
运行 使用 Validator Bean 在控制器方法中进行验证:
org.springframework.validation.Validator
@Autowired
protected Validator validator;
PostMapping(value = "/creator", consumes = {"multipart/form-data"}, produces = {"application/json"})
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public @Valid
ResponseDTO creator(@RequestPart("json") CampaignCreatorDTO campaignCreatorDTO,
@RequestPart(name = "file", required = false) MultipartFile adGraphic) {
validator.validate(campaignCreatorDTO);
}
如 here 所述,@InitBinder
使用传递给它的值进行具有相同命名请求参数或模型属性的目标验证。问题是您两者都没有,因为您在特定端点 /creator
中使用了多部分表单数据输入。因此,从 @InitBinder
中删除命名限制将是解决方案。
@InitBinder
public void initCreatorDTOBinder(WebDataBinder binder) { ... }