gpt4 book ai didi

java - @Valid 注解应用于 MultipartFile 对象时被忽略

转载 作者:搜寻专家 更新时间:2023-11-01 03:31:35 41 4
gpt4 key购买 nike

这是我的 Controller 。它接受 multipart/form-data请求有两个字段,formfile . form字段是一个 MyObject , file字段是 MultipartFile .两个变量都用 @Valid 注释,因此,我希望 Spring 调用 Validator每个领域的类别。然而,这只发生在 MyObject 上。 , 而 MultipartFile .

@RequestMapping("/api")
@RestController
public class Controller {

private MyObjectRepository repo;
private MyObjectValidator myObjectValidator;
private FileValidator fileValidator;

@Autowired
public myObjectController(MyObjectRepository repo, MyObjectValidator myObjectValidator,
FileValidator fileValidator) {
this.repo = repo;
this.myObjectValidator = myObjectValidator;
this.fileValidator = fileValidator;
}

@InitBinder("form")
public void initMyObjectBinder(WebDataBinder binder) {
binder.setValidator(this.myObjectValidator);
}

@InitBinder("file")
public void initFileBinder(WebDataBinder binder) {
binder.setValidator(this.fileValidator);
}

@PostMapping("myObject")
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public MyObject createMyObject(@RequestPart("form") @Valid MyObject myObject,
@RequestPart("file") @Valid MultipartFile... file) {
return repo.save(myObject);
}
}

我的 MyObjectValidator被触发了,但是我的 FileValidator没有被触发。这两个类都实现了 Spring Validator界面。 MyObjectValidator.supports(Class<?> aClass) 调用,而FileValidator.supports(Class<?> aClass) 从未被调用。除此之外,我的Controller运行完美,并努力将对象保存到我的 repo .

这可能是什么问题?我读过类似的问题,常见的错误是没有在 @InitBinder 中使用适当的参数。注释,或设置 @InitBinder private 的方法而不是 public ,但这都不适用于我的情况。

这个丑陋的变通办法做了它应该做的,但它不像 Spring。我调用我 FileValidatorController.createMyObject里面手动方法,而不是让 Spring 通过 @Valid 自动调用它注释。

@PostMapping("myObject")
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public MyObject createMyObject(@RequestPart("form") @Valid MyObject myObject,
@RequestPart("file") @Valid MultipartFile... file) {
if (fileValidator.supports(file.getClass())) {
Errors errors = new BeanPropertyBindingResult(file, "Uploaded file.");
fileValidator.validate(file,errors);
if (errors.hasErrors()) {
throw new BadRequestException();
}
}
return repo.save(myObject);
}

编辑:我已经包含了我的 Validator根据要求上课。

import org.springframework.validation.Validator;

public abstract class AbstractValidator implements Validator {
// One shared method here.
}
public class FileValidator extends AbstractValidator {

public boolean supports(Class<?> aClass) { // This method is never triggered.
boolean isSingleFile = MultipartFile.class.isAssignableFrom(aClass); // This line has a breakpoint, it is never triggered in the debugger.
boolean isFileArray = aClass.equals(MultipartFile[].class);
return (isSingleFile || isFileArray);
}

public void validate(Object o, Errors e) {
//Several validation methods go here.
}
public class MyObjectValidator extends AbstractValidator {

public boolean supports(Class<?> aClass) { // This method is triggered.
return (MyObject.class.equals(aClass)); // This line has a breakpoint, and it is always triggered in the debugger.
}

public void validate(Object o, Errors e) {
// Several validation methods go here.
}

编辑:我按照 NiVeR 的建议对我的代码进行了一些更改,删除了 varargs 参数并更改了我的 FileValidator.supports(Class<?> aClass)相应地,但行为仍然相同。

在 Controller.java 中:

@PostMapping("myObject")
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public MyObject createMyObject(@RequestPart("form") @Valid MyObject myObject, @RequestPart("file") @Valid MultipartFile file) {
return repo.save(myObject);
}

在 FileValidator.java 中:

public boolean supports(Class<?> aClass) {
return MultipartFile.class.isAssignableFrom(aClass);
}

最佳答案

我认为问题与可变参数 Multipart... 有关。在 validator 的 supports 方法中,您正在检查 Multipart 数组,但我怀疑这不是正确的方法。作为试验,我会让 Multipart 成为单个对象参数(并相应地更改 validator )以测试它是否以这种方式工作。

关于java - @Valid 注解应用于 MultipartFile 对象时被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51379247/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com