我在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>
答案 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)
解决方案很简单。 必须将验证库放入类路径中。