我想知道对用户输入执行表单验证的最干净和最好的方法是什么。我见过一些开发人员实现org.springframework.validation.Validator
。关于这个问题有一个问题:我看到它验证了一个类。这个类是否必须手工填充用户输入的值,然后传递给验证器?
我对验证用户输入的最干净和最好的方法感到困惑。我知道使用request.getParameter()
然后手动检查nulls
的传统方法,但我不想在我的Controller
中做所有的验证。如果能在这方面提供一些好的建议,我将不胜感激。我在这个应用程序中没有使用Hibernate。
7条答案
按热度按时间x6492ojm1#
使用Spring MVC,有3种不同的方法来执行验证:使用注解,手动,或两者的混合。没有唯一的"最干净和最好的方法"来验证,但可能有一种方法更适合您的项目/问题/上下文。
让我们有一个用户:
javax.validation.constraints
注解(也称为JSR-303注解)。您的库中需要一个JSR-303提供程序,比如Hibernate Validator,它是参考实现(这个库与数据库和关系Map无关,它只进行验证:-)。
那么在你的控制器中,你会有这样的东西:
注意@Valid:如果用户碰巧有一个空名字,result.hasErrors()将为真。
org.springframework.validation.Validator
接口(从Spring 2开始)。假设你有
您希望执行一些"复杂"的验证,例如:如果用户的年龄在18岁以下,则responsibleUser不能为空,responsibleUser的年龄必须在21岁以上。
你会做出这样的事
然后在控制器中,您将拥有:
如果存在验证错误,result. hasErrors()将为true。
注意:您也可以在控制器的@InitBinder方法中设置验证器,使用"binder. setValidator(...)"(在这种情况下,方法1和2的混合使用是不可能的,因为您替换了默认的验证器)。或者您可以在控制器的默认构造函数中示例化它。或者在控制器中注入(@Autowired)@Component/@Service UserValidator:非常有用,因为大多数验证器都是单例的+单元测试模拟变得更容易+您的验证器可以调用其他Spring组件。
参考文献:
uxhixvfz2#
验证用户输入的方法有两种:注解和继承Spring的Validator类。对于简单的情况,注解是很好的。如果你需要复杂的验证(如跨字段验证,例如"验证电子邮件地址"字段),或者如果您的模型在应用程序中的多个位置使用不同的规则进行验证,或者如果您无法通过在模型对象上放置注解来修改模型对象,Spring的基于继承的Validator是一种可行的方法,我将展示这两种方法的示例。
无论您使用哪种验证类型,实际的验证部分都是相同的:
如果使用注解,
Foo
类可能如下所示:上面的注解是
javax.validation.constraints
注解,你也可以使用Hibernate的org.hibernate.validator.constraints
,但是看起来不像是在使用Hibernate。或者,如果实现Spring的Validator,则可以按如下方式创建类:
如果使用上面的验证器,您还必须将验证器绑定到Spring控制器(如果使用注解则不需要):
另请参见Spring文档。
希望能有所帮助。
kqqjbcuj3#
我想扩展一下杰罗姆的回答。我发现用JSR-303的方式编写自己的注解验证器非常容易。您不限于“一个字段”验证。您可以在类型级别创建自己的注解并进行复杂的验证(参见下面的示例)。我更喜欢这种方式,因为我不需要混合不同类型的验证(Spring和JSR-303)就像杰罗姆做的那样。而且这个验证器是“Spring感知”的,所以你可以开箱即用@Inject/@Autowire。
自定义对象验证示例:
一般字段相等的示例:
fiei3ece4#
如果不同的方法处理程序具有相同的错误处理逻辑,那么最终将得到许多具有以下代码模式的处理程序:
假设您正在创建RESTful服务,并希望返回
400 Bad Request
沿着每个验证错误情况的错误消息,那么,对于每个需要验证的REST端点,错误处理部分都是相同的,在每个处理程序中重复相同的逻辑并不那么枯燥!解决这个问题的一个方法是在每个 To-Be-Validated bean之后删除直接的
BindingResult
。这样,如果绑定的bean无效,Spring将抛出一个
MethodArgumentNotValidException
,您可以定义一个ControllerAdvice
,它使用相同的错误处理逻辑来处理此异常:您仍然可以使用
MethodArgumentNotValidException
的getBindingResult
方法检查底层BindingResult
。yhived7q5#
查找Spring Mvc验证的完整示例
3yhwsihp6#
将这个bean放到您的配置类中。
然后你可以用
用于手工验证bean。然后你将在BindingResult中得到所有结果,并且你可以从那里检索。
biswetbf7#
确认组
同样值得一提的是,在一些更复杂的情况下,当你的业务逻辑中有一些“多步骤”时,我们需要“验证组”。
添加了
@Validated
注解以支持validated bean中的“validation groups”。这可以用于多步骤表单,其中第一步需要验证姓名和电子邮件,第二步需要验证电话号码。使用
@Validated
时,首先需要声明组,组是使用自定义标记接口声明的。@确认示例
假设我们有一个场景,我们有一个表单供用户注册。在这个表单上,我们希望用户提供姓名和电子邮件。用户注册后,我们有另一个表单,我们建议用户添加一些额外的信息,例如,电子邮件。我们不希望在第一步提供电子邮件。但要求在第二步提供它。
对于这个例子,我们将声明两个组,第一个组是
OnCreate
,第二个组是OnUpdate
:创建时:
更新时:
我们的用户UserAccount类:
我们用组接口标记验证注解,这取决于那些验证应该与哪个组相关。
最后是我们的Controller方法:
这里我们指定
@Validated(...)
而不是@Valid
,并指定应在不同情况下使用的验证组。现在,根据验证组,我们将在不同的步骤中对特定字段执行验证。