我正在尝试验证一个应该包含(如果不是空)一个自然数的输入字段(即一个正的非零整数:1,2,3,......)
我使用以下注释:
@Digits(integer=10, fraction=0)
@Min(value = 1)
private Long number;
(这是描述我的约束的最好方法吗?)
当我提交1.5之类的数字时,我会收到验证消息,这很好。 但是,当我提交-1等输入时,我没有得到任何验证消息。我错过了什么?
谢谢!
P.S。由于我的(其他)Hibernate对该字段的注释是在该字段的getter上,我只是将这两个注释移动到getter(而不是在实际字段上)。没有帮助。
修改
我刚读过,我可能需要将<mvc:annotation-driven />
添加到我的XML中。我做到了,但是在启动服务器时我得到了例外:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/mvc]
Offending resource: ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
我不确定这是什么意思,如果我真的需要(????)那个注释驱动的标签......还有,如果我需要在我的xml中使用注释驱动标签,为什么我的其他注释(包括其中一个验证注释)没有它吗?
答案 0 :(得分:2)
您确实需要<mvc:annotation-driven />
标记。这就是告诉Spring Web MVC激活JSR-303验证的原因。
要检查的一些事项:
1)确保在mvc
配置中声明dispatcher-servlet.xml
名称空间前缀。例如(在这里使用Spring 3):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
...
</beans>
2)还要确保在类路径上有Spring Web MVC JAR。 JAR包含名称空间处理程序,它知道如何处理MVC配置名称空间。
3)确保Hibernate Validator在类路径上。 Spring需要它才能执行验证。
关于你的其他注释为何有效的问题:<mvc:annotation-driven>
不对所有注释负责,只对其中一些注释负责。如上所述,它负责的一件事是JSR-303验证。
关于为什么你的其他验证有效,我的猜测是它根本不是一个有效的验证。相反,当您尝试将1.5放入Long
时,Spring无法执行此操作,并且您可能会收到某种错误消息。我认为你根本不需要@Digits
注释。如果你删除它,我猜你仍然会收到消息。
答案 1 :(得分:1)
您必须另外明确指定Spring以使用@Valid注释在绑定点验证您的bean,您能否确认您正在执行此操作。我假设您使用1.5获得的错误,因为输入只是因为1.5不能放入Long字段并且是绑定异常,而不是验证异常。
答案 2 :(得分:0)
如果是整数,为什么不把它变成Integer
?此外,它应该是@Min(1)
。