当前位置: 首页 > 面试题库 >

Spring Web MVC-验证单个请求参数

井镜
2023-03-14
问题内容

我在Spring Web MVC 3.0中运行一个webapp,我有许多控制器方法,其签名大致如下:

@RequestMapping(value = "/{level1}/{level2}/foo", method = RequestMethod.POST)
public ModelAndView createFoo(@PathVariable long level1,
        @PathVariable long level2,
        @RequestParam("foo_name") String fooname,
        @RequestParam(value = "description", required = false) String description);

我想添加一些验证-例如,description应限制为一定长度或fooname仅包含某些字符。如果验证失败,我想向用户返回一条消息,而不是抛出一些未经检查的异常(如果我让数据渗透到DAO层,无论如何都会发生这种情况)。我知道JSR303,但尚未使用它,也不太了解如何在Spring上下文中应用它。

据我了解,另一种选择是将绑定@RequestBody到整个域对象并在其中添加验证约束,但目前我的代码已设置为接受单个参数,如上所示。

使用这种方法将验证应用于输入参数的最直接方法是什么?


问题答案:

在当前发行版中,如果要进行自动验证,你仍将需要使用WebDataBinder将参数绑定到对象上。如果你使用的是SpringMVC,则值得学习,即使这不是你执行此任务的首选。

看起来像这样:

public ModelAndView createFoo(@PathVariable long level1,
        @PathVariable long level2,
        @Valid @ModelAttribute() FooWrapper fooWrapper,
        BindingResult errors) {
  if (errors.hasErrors() {
     //handle errors, can just return if using Spring form:error tags.
  }
}

public static class FooWrapper {
  @NotNull
  @Size(max=32)
  private String fooName;
  private String description;
//getset
}

如果你在类路径上具有Hibernate Validator 4或更高版本,并使用默认的分派器设置,则它应该“正常工作”。

由于评论变得越来越大,因此进行编辑:

这是在这不是“预期”的人Spring知道如何注入,如一个你的方法签名的任何对象HttpRequest,ModelMap等等,将得到的数据绑定。对于简单的情况,只需将请求参数名称与bean属性名称进行匹配并调用setter即可实现。这@ModelAttribute只是个人风格的事情,在这种情况下,它什么也没做。JSR-303与方法参数上的@Valid集成通过插入WebDataBinder。如果使用@RequestBody,则使用的是基于spring确定请求正文的内容类型的对象编组器(通常仅来自http头。)分派器servlet(AnnotationMethodHandlerAdapter确实)没有办法为任意封送编组“翻转验证开关”。它只是将Web请求的内容传递到消息转换器,并返回一个Object。不会生成BindingResult对象,因此无论如何都无法设置错误。

你仍然可以只将验证器注入控制器中,然后在获取的对象上运行它,它只是与@Validon参数中的on请求参数没有魔术集成BindingResult



 类似资料:
  • 我有一个设置为接收来自WooCommerce的网络钩子的Rails应用程序。具体来说,我正在寻找创建订单的时间。我已经测试并验证了它在我protect_from_forgery时是否有效,除了创建。现在我正在尝试通过验证网络钩子来保护我的应用程序。WooCommerce的留档声明在请求标头中传递以下秘密: 秘密:一个可选的密钥,用于生成请求正文的HMAC-SHA256哈希,以便接收者可以验证Web

  • 我想验证我的控制器中的一个请求参数。请求参数应该来自给定值列表中的一个,如果不是,则应该抛出错误。在下面的代码中,我希望请求参数orderBy来自@Values准许中存在的值列表。 我已经编写了一个自定义bean验证器,但不知何故,它不起作用。即使我为查询参数传递任何随机值,也不会验证并引发错误。

  • 这是我的视图代码: 和请求验证程序: 发送post请求以创建方法后,它将 SQLSTATE[42S22]:找不到列: 1054未知列'article.title'in'where cluse' SQLSTATE[42S22]:未找到列:“where子句”中的1054未知列“article.title”(SQL:选择count(*)作为来自的聚合,其中title=test) 更新 这是我的控制器代码

  • 我需要在爪哇中使用摇摆不定(YAML文件)来验证传入的REST请求。所以任何人都可以帮我这个。提前致谢。

  • 我们的例子中要求用户进行身份验证并且在我们应用程序的每个URL这样做。我们可以通过给http.authorizeRequests()添加多个子节点来指定多个定制需求到我们的URL。例如: protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() //1

  • 在我的请求正文中,几乎没有JSON原始数据中需要的参数,我希望在Postman中的请求前脚本中验证这些参数是否存在于正文中。 如何检查请求正文中是否传递了和?