我想知道什么是执行用户输入的表单验证的最干净,最好的方法。我已经看到一些开发人员实现了org.springframework.validation.Validator
。有一个问题:我看到它验证了一个类。是否必须使用用户输入的值手动填充该类,然后将其传递给验证器?
我对验证用户输入的最干净,最好的方法感到困惑。我知道传统的使用方法request.getParameter()
然后手动检查的方法nulls
,但是我不想在我的工具中进行所有的验证Controller
。在这方面的一些好的建议将不胜感激。我没有在此应用程序中使用Hibernate。
使用Spring
MVC,可以通过3种不同的方式执行验证:使用批注,手动或两者结合使用。没有唯一的“最干净,最好的方式”进行验证,但是可能有一种更适合您的项目/问题/上下文的方式。
让我们有一个用户:
public class User {
private String name;
...
}
方法1: 如果您具有Spring 3.x
+和简单的验证功能,请使用javax.validation.constraints
注释(也称为JSR-303注释)。
public class User {
@NotNull
private String name;
...
}
您将需要在库中使用JSR-303提供程序,例如作为参考实现的Hibernate
Validator
(此库与数据库和关系映射无关,它只进行验证:-)。
然后在您的控制器中,您将看到类似以下内容的内容:
@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:如果用户碰巧具有空名称,则result.hasErrors()将为true。
方法2:
如果您具有复杂的验证(如大型企业验证逻辑,跨多个字段的条件验证等),或者由于某种原因您无法使用方法1,请使用手动验证。将控制器的代码与验证逻辑分开是一个好习惯。不要从头开始创建验证类,Spring提供了一个方便的org.springframework.validation.Validator
界面(自Spring
2起)。
所以说你有
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
并且您想执行一些“复杂”的验证,例如:如果用户的年龄未满18岁,则负责用户不能为null,负责用户的年龄必须超过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
}
}
如果存在验证错误,则result.hasErrors()将为true。
注意:您还可以使用“
binder.setValidator(…)”在控制器的@InitBinder方法中设置验证器(在这种情况下,无法混合使用方法1和2,因为您替换了默认值验证器)。或者,您可以在控制器的默认构造函数中实例化它。或者在控制器中插入一个@
Component / @ Service
UserValidator(@Autowired):非常有用,因为大多数验证器都是单例+单元测试模拟变得更加容易+您的验证器可以调用其他Spring组件。
方法3: 为什么不同时使用两种方法?验证带有注解的简单内容(如“
name”属性)(该操作快速,简洁且可读性强)。保留对验证器的繁重验证(当编写自定义复杂验证注释需要花费数小时,或者仅在无法使用注释时)。我在一个以前的项目中做到了这一点,它就像一个魅力,快速又轻松。
警告: 您不得将 验证处理 误认为是 异常处理
。
问题内容: 我想知道什么是执行用户输入的表单验证的最干净,最好的方法。我已经看到一些开发人员实现了。有一个问题:我看到它验证了一个类。是否必须使用用户输入的值手动填充该类,然后将其传递给验证器? 我对验证用户输入的最干净,最好的方法感到困惑。我知道传统的使用方法然后手动检查的方法,但是我不想在我的工具中进行所有的验证。在这方面的一些好的建议将不胜感激。我没有在此应用程序中使用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)推送订单。系统将接受所有这些订单,并