当前位置: 首页 > 知识库问答 >
问题:

如何在Spring MVC中验证域对象上的对象字段?

阳博赡
2023-03-14

我有一个对象Foo,其中包含对对象Bar的引用,该对象有对对象Baz的引用,为了使Foo有效,Bar必须具有对Baz的有效且非空的引用。

问题是,Bar不需要有效的、非空的Baz才有效,所以我不能简单地将验证放在那里,我需要它在Foo中。

这里有一个我正在谈论的类结构的简单伪版本:

class Foo {
    // Bar needs to have a valid Baz. Something like this would be ideal:
    // @HasAValidBaz(message="Baz is required")
    Bar bar;   
}

class Bar {
    // Baz can be null and Bar will still be valid
    // But if there _is_ a Baz, it needs to be valid
    Baz baz;
}

class Baz {
    @NotBlank(message="My String is required")
    String myString;
}

我知道我可以用类级自定义验证注释来做到这一点,但问题是这些错误对象和相应的消息应用于类实例,而不是字段实例,我需要能够轻松地在正确的表单字段旁边显示错误消息。

有没有一个好方法可以做到这一点,或者我一直在控制器中实现这种验证?

共有1个答案

燕富
2023-03-14

批注很好,但在这种情况下可能不合适。问题是批注被标记在实际的类上,这意味着你不能在同一个类上有两种类型的验证批注——这似乎是你的问题。也许你更适合使用老式的Spring MVC方法来实现Spring Validator类。这里有一个例子:

public class FooValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return Foo.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {

        Foo foo = (Foo) target;

        if(foo.getBar() == null) {
            errors.rejectValue("bar", "bar[emptyMessage]");
        }
        else if(foo.getBar().getBaz() == null){
            errors.rejectValue("bar.baz", "bar.baz[emptyMessage]");
        }
    }
}

您的Spring控制器与使用注释的控制器基本相同:

@Controller
public class FooController {

    @InitBinder("foo")
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new FooValidator());
    }

    @RequestMapping(value="fooPage", method = RequestMethod.POST)
    public String processSubmit(@Valid Foo foo, BindingResult result, ModelMap m) {
        if(result.hasErrors()) {
            return "fooPage";
        }
        ...
        return "successPage";
    }
}
 类似资料:
  • 问题内容: 我使用sf.json库在Java Web应用程序中映射传入请求的表单数据。 可以说传入请求是http:// localhost:8080 / app / addProfile ,其表单数据为: 服务器端 : 这种方法的主要问题是,如果对结构进行少量修改,则需要修改整个代码。 有没有可以配置验证所需规则的api? 问题答案: 您可以使用Json验证器:-https: //github.c

  • 我使用sf.json库来映射在java中的Web应用程序中传入请求的表单数据。 假设传入请求http://localhost:8080/app/addProfile表单数据为: 服务器端: 这种方法的主要问题是,如果在结构中有微小的修改,那么整个代码都需要修改。 是否有api可以配置验证所需的规则?

  • 问题内容: 我正在使用数据对象作为ReactJS中组件的道具。 我知道容易验证PropTypes对象本身: 但是,如果我想验证其中的值怎么办?即。data.id,data.title? 问题答案: 您可以用来验证属性: 更新资料 正如@Chris在评论中指出的那样,从React 15.5.0版本开始已移至package 。 更多信息

  • 我试图为以下静态方法编写一个测试: 多谢! 本。

  • 我正在使用Springs的Webclient进行HTTP GET调用。 我如何验证响应对象的属性,我收到作为我的HTTP调用的响应。 我试图通过阻止响应对象来验证平板地图中的出生日期,但这看起来不是最有效的方法。 以下是我代码的摘录。 任何帮助都非常感谢。

  • 我是一个新的论坛和Appium/Android自动化,我需要帮助,以验证对象是否存在我的应用程序之前,我采取下一个行动。 信息:[BOOTSTRAP][info]返回结果:{“value”:“未找到元素”,“status”:7} 信息:将命令推送到appium工作队列:[“find”,{“strategy”:“name”,“selector”:“John Doe”,“context”:“”,“mu