开发者社区 问答 正文

Javax验证-将结果绑定到模型字段

我正在使用带有Javax验证的Spring来验证我的模型。现在,我要求验证结果也包含在模型中。有没有办法自动执行此操作?

例:

@SomeCustomValidator
class Foo {

  @NotEmpty
  private String name;

  private boolean isValid; //how to bind the validation result?
}

isValid验证框架应将验证结果填充该字段。可以自动完成吗?还是我必须自己运行验证器?

谢谢

展开
收起
垚tutu 2019-11-28 22:49:48 643 分享 版权
阿里云 AI 助理回答

在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字段作为验证结果,但通过上述方法可以在业务逻辑层面达到类似的效果。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: