Spring MVC验证被忽略

Spring MVC验证被忽略,spring,validation,spring-mvc,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;

我在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";
    }
}
@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 !";
    }
}
但即使我尝试将任何负值作为“分钟”,也不会产生错误

添加了配置

<?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>

免责声明:在缺少完整的相关控制器代码以及怀疑类路径中可能缺少验证程序库的情况下,这里有一个小测试来检查配置。您可以非常快速地使用它,只需删除会话属性部分,即可确定所有配置是否都已就绪

让我们试一试。为了简化REST客户机和不完整代码的测试,我没有使用SessionAttributes。在我的运行时类路径上还有Hibernate验证程序库。我还使用了ResponseBody注释,让Spring自动将字符串转换为响应文本,而无需使用其他视图技术(如jsp)

然后我的控制器

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";
    }
}
@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
POST参数为
minutes=1
给我的响应为
无错误minutes=-1
时,code>会给我
错误

您是否可以确认您的类路径中有一个
jsr303实现
——比如
hibernate validator jar
文件

您需要
来启用jsr-303验证,这是@Valid注释实际执行任何操作所必需的

如果未完成,请尝试在servlet上下文XML中添加

schemaLocationmvc条目应包含以下两个:

http://www.springframework.org/schema/mvc    
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
解决办法很简单。
验证库必须放在类路径中。

您可以使用您的配置。您的应用程序中是否有Bean验证实现(例如Hibernate验证)?您是否已经配置了一些东西(请发布web stuff的spring配置)请确认您的应用程序的web-INF/lib目录中是否存在bean验证实现。它适合您,祝贺您。但是,作为一个答案,这有什么帮助呢?巴特-我试图让我的答案中的配置尽可能接近这个问题,因为代码共享,特别是控制器不完整。由于SessionAttributes在图片中,所以GET请求的控制器方法和带有@ModelAttribute注释的方法(如果有)丢失。其次,在没有完整代码的情况下,通过使用我的代码可以很容易地验证适当的验证器库是否真的在类路径中,以及是否有必要的配置。所以,在提供所需的代码之前,我想这绝对可以作为一个指针。@Bart-我已经添加了更多的信息来理解这如何作为一个答案,我想你不明白我的意思。您只是发布了一个适合您的解决方案,而不知道或不理解OP存在的问题。很遗憾,您的更新没有改变这一点。让我们等待@ICE,看看这是否有助于调试他的问题,或者他会提供其他信息。我的观点是,若有人不知道他的问题是什么,那个么其他人可以插手一个有效的解决方案,帮助他后退。如果有人很难找到真正的根本原因,那么也许你认为等待更好。如果他知道实际原因,他就不会发布在这里让我们注意。我认为如果没有,Spring MVC请求调度机制(通过使用@Controller/RequestMapping注释)将无法工作,因此我们可以安全地假设它存在。我的配置中有。我还有“