Spring MVC验证被忽略了

时间:2014-08-30 18:52:03

标签: spring validation spring-mvc

我在Tomcat上有Spring MVC应用程序。我正在尝试在其中添加验证。 出于某种原因,我的验证被忽略而未被检查。

这是我的POJO

import org.hibernate.validator.constraints.Range;
public class Goal {

    @Range(min = 1, max = 15)
    private int minutes;

    public int getMinutes() {
        return minutes;
    }

    public void setMinutes(int minutes) {
        this.minutes = minutes;
    }
}

和控制器

import org.springframework.validation.BindingResult;
import javax.validation.Valid;

@Controller
@SessionAttributes("goal")
public class GoalController {

    @RequestMapping(value = "addGoal", method = RequestMethod.POST)
    public String updGoal(@ModelAttribute("goal") @Valid Goal goal, BindingResult result) {
        System.out.println(goal.getMinutes());

        System.out.println(result.hasErrors());

        if(result.hasErrors()) {
            return "addGoal";
        }

        return "redirect:addMinutes.html";
    }
}

但即使我试图将任何负值作为“分钟”,也不会产生错误。

添加了配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven/>
    <context:component-scan base-package="com.xlab.ice.mvc.controller"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

    <mvc:resources mapping="/pdfs/**" location="pdf"/>

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="messages"/>

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" p:defaultLocale="en"/>

    <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="lang"/>
    </mvc:interceptors>

    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"/>

</beans>

3 个答案:

答案 0 :(得分:0)

免责声明:由于缺少完整的相关控制器代码并且怀疑类路径中可能缺少Validator库,这里只是一个小测试来检查配置。您可以非常快速地使用它来查找是否所有配置都已就位,只需删除会话属性部分。

我们试一试吧。为了简化使用REST客户端的测试以及不完整的代码,我没有使用SessionAttributes。我的运行时类路径上还有Hibernate验证器库。我还使用了ResponseBody注释让Spring自动将String转换为响应文本,而不使用备用视图技术(如jsp)。

import org.hibernate.validator.constraints.Range;
public class Goal {

    @Range(min = 1, max = 15)
    private int minutes;

    public int getMinutes() {
        return minutes;
    }

    public void setMinutes(int minutes) {
        this.minutes = minutes;
    }
}

然后我的控制器

@Controller
public class GoalController {

    @RequestMapping(value = "/addGoal", method = RequestMethod.POST)
    public @ResponseBody String updGoal(@ModelAttribute("goal") @Valid Goal goal, BindingResult result) {
        System.out.println(goal.getMinutes());

        System.out.println(result.hasErrors());

        if(result.hasErrors()) {
            return "Errors !";
        }

        return "No Errors !";
    }
}

使用http://localhost:8080/testApp/addGoal上的休息客户端以及minutes=1的POST参数访问应用程序时,我的回复为No Errors !,而minutes=-1则为Errors !

答案 1 :(得分:0)

您还可以确认您的课程路径中有JSR 303 implementation - 说hibernate-validator jar个文件。

您需要<mvc:annotation-driven />才能启用jsr-303验证,这需要@Valid注释实际执行任何操作。

如果没有完成,请尝试在servlet上下文XML中添加<mvc:annotation-driven/>

schemaLocation mvc条目应包含以下两个:

http://www.springframework.org/schema/mvc    
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

答案 2 :(得分:0)

解决方案很简单。 必须将验证库放入类路径中。