我正在使用带有Javax验证的Spring来验证我的模型。现在,我要求验证结果也包含在模型中。有没有办法自动执行此操作?
例:
@SomeCustomValidator
class Foo {
@NotEmpty
private String name;
private boolean isValid; //how to bind the validation result?
}
isValid验证框架应将验证结果填充该字段。可以自动完成吗?还是我必须自己运行验证器?
谢谢
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Spring框架中,使用JSR-380(Java Bean Validation 2.0,也就是Javax验证)进行模型验证时,验证结果通常不会直接填充到模型的某个字段中,如您所期望的isValid
字段。验证过程是通过注解触发并在控制器层或服务层通过@Valid
注解和BindingResult
来捕获验证结果,而不是自动更新模型对象的状态。
不过,您可以采取一种间接的方式来实现您的需求,即自定义一个后处理程序(Bean Validation Post Processor),或者在验证之后手动设置这个标志。以下是一个简单的示例说明如何在控制器层处理并设置isValid
:
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FooController {
@PostMapping("/foos")
public ResponseEntity<?> createFoo(@RequestBody @Valid Foo foo, BindingResult result) {
if (result.hasErrors()) {
// 自动设置 isValid 为 false
foo.setIsValid(false);
// 可以选择性地返回错误信息给客户端
return ResponseEntity.badRequest().body(result.getAllErrors());
} else {
// 验证通过,设置 isValid 为 true
foo.setIsValid(true);
// 逻辑处理...
return ResponseEntity.ok("Foo created successfully");
}
}
}
在这个例子中,我们没有自动将验证结果绑定到模型的isValid
字段,而是根据BindingResult
是否有错误手动设置了它。这是因为验证框架本身并不设计为修改被验证对象的状态,而是提供验证结果供调用者处理。
如果您希望更深入地集成这种行为,可以考虑创建自定义的Validator或ConstraintValidator,并在其中处理验证成功或失败时的行为,但请注意这通常不包括直接修改被验证对象的属性来表示验证状态,因为这可能会违反验证框架的设计原则。您可能需要探索AOP(面向切面编程)或其他方式来“拦截”验证流程并在合适的时候设置isValid
字段。
总的来说,虽然不能直接自动化填充模型中的isValid
字段作为验证结果,但通过上述方法可以在业务逻辑层面达到类似的效果。