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

Spring MVC:如何执行验证?

廉志强
2023-03-14

我对验证用户输入的最干净和最好的方法感到困惑。我知道使用request.getParameter()然后手动检查nulls的传统方法,但我不想在我的控制器中进行所有验证。对这方面的一些好的建议将非常感谢。我没有在这个应用程序中使用Hibernate。

共有1个答案

羿博延
2023-03-14

对于Spring MVC,有3种不同的方法来执行验证:使用注释、手动或两者的混合使用。没有唯一的“最干净和最好的方法”来验证,但可能有一种方法更适合您的项目/问题/上下文。

让我们来一个用户:

public class User {

    private String name;

    ...

}

方法1:如果要进行Spring3.x+和简单验证,请使用javax.validation.constraints注释(也称为JSR-303注释)。

public class User {

    @NotNull
    private String name;

    ...

}

那么在您的控制器中就会有如下内容:

@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){
    if (result.hasErrors()){
      // do something
    }
    else {
      // do something else
    }
}

注意@valid:如果用户碰巧有一个null名称,result.hasErrors()将为true。

方法2:如果您有复杂的验证(像大业务验证逻辑、跨多个字段的条件验证等),或者由于某种原因无法使用方法1,那么就使用手动验证。将控制器的代码与验证逻辑分离是一个很好的实践。不要从头开始创建验证类,Spring提供了方便的org.springframework.validation.validator接口(从Spring2开始)。

public class User {

    private String name;

    private Integer birthYear;
    private User responsibleUser;
    ...

}

并且您想要做一些“复杂”的验证,比如:如果用户的年龄在18岁以下,则responsibleUser不能为null,并且responsibleUser的年龄必须超过21岁。

你会做这样的事情

public class UserValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
      return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
      User user = (User) target;

      if(user.getName() == null) {
          errors.rejectValue("name", "your_error_code");
      }

      // do "complex" validation here

    }

}

那么在您的控制器中,您将拥有:

@RequestMapping(value="/user", method=RequestMethod.POST)
    public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){
        UserValidator userValidator = new UserValidator();
        userValidator.validate(user, result);

        if (result.hasErrors()){
          // do something
        }
        else {
          // do something else
        }
}

警告:您不能将验证处理误认为异常处理。阅读这篇文章,了解何时使用它们。

参考资料:

  • 一篇关于bean验证的非常有趣的博文(原文链接已死)
  • 另一篇关于验证的好博文(原始链接已死)
  • 关于验证的最新Spring文档
 类似资料:
  • 问题内容: 我想知道什么是执行用户输入的表单验证的最干净,最好的方法。我已经看到一些开发人员实现了。有一个问题:我看到它验证了一个类。是否必须使用用户输入的值手动填充该类,然后将其传递给验证器? 我对验证用户输入的最干净,最好的方法感到困惑。我知道传统的使用方法然后手动检查的方法,但是我不想在我的工具中进行所有的验证。在这方面的一些好的建议将不胜感激。我没有在此应用程序中使用Hibernate。

  • 本文向大家介绍SpringMVC Validator验证示例,包括了SpringMVC Validator验证示例的使用技巧和注意事项,需要的朋友参考一下 SpringMVC服务器验证一种是有两种方式,一种是基于Validator接口,一种是使用Annotaion JSR-303标准的验证,下面主要是学习这两种,工作中推荐后者,方便很多 一.基于Validator接口的验证. 首先创建User实例

  • 如何使用PowerMockito验证对该方法的调用?请参阅下面的课程及其测试。出于某种原因,PowerMockito告诉我,与此模拟没有任何交互。 ... 我收到以下错误消息:

  • 这是我HTML文件中的内容: 我希望按钮在Post类中执行一个方法。我不确定我是否使用了正确的Thymeleaf“标记”。现在,当页面加载时,它执行post-upvote和downvote方法。有人能帮忙吗?我觉得我用错了Thymeleaf标签。

  • 假设有两个微服务:订单和库存。order service中有一个API,它接受< code>ProductId 、< code>Qty等并下订单。 理想情况下,只有在库存服务中存在库存时才允许下订单。人们建议使用Saga模式或任何其他分布式事务。这很好,最终将利用一致性。 但是如果有人想滥用这个系统。他可以使用无效或缺货的产品(< code>ProductId)推送订单。系统将接受所有这些订单,并