Spring 3验证(JSR-303)@Min

时间:2011-08-17 02:25:50

标签: hibernate spring spring-mvc bean-validation

我正在尝试验证一个应该包含(如果不是空)一个自然数的输入字段(即一个正的非零整数: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中使用注释驱动标签,为什么我的其他注释(包括其中一个验证注释)没有它吗?

3 个答案:

答案 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)