[英]Spring MVC form validation not working
我正在使用 Spring 4. 我的表單包含以下變量:
@NotNull
@Email
private String email;
@NotNull
private String firstName;
@NotNull
private String lastName;
@Digits(fraction = 0, integer = 10)
private String phoneNo;
@NotNull
private String role;
我的 controller:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/add", method = RequestMethod.POST)
public ModelAndView add(@ModelAttribute("user") @Valid UserBean user, BindingResult result) {
String message;
if (result.hasErrors() && user != null)
return new ModelAndView("userAdd");
else {
userService.addUser(user);
message = "Successfully added user";
}
return new ModelAndView("success", "message", message);
}
@RequestMapping(value = "/register")
public ModelAndView register(@ModelAttribute("user") UserBean user, BindingResult result) {
List<String> roles = new ArrayList<String>();
roles.add("Receiver");
roles.add("Resolver");
roles.add("Logger");
Map<String, List<String>> model = new HashMap<String, List<String>>();
model.put("roles", roles);
return new ModelAndView("userAdd", "model", model);
}
}
我的 jsp:
<c:url var="userAdd" value="user/add.do" />
<sf:form method="post" action="${userAdd}" modelAttribute="user">
<table>
<tr>
<td>First Name</td>
<td><sf:input path="firstName" /><br /> <sf:errors
path="firstName" cssClass="error" /></td>
</tr>
<tr>
<td>Last Name</td>
<td><sf:input path="lastName" /><br /> <sf:errors
path="lastName" cssClass="error" /></td>
</tr>
<tr>
<td>Email</td>
<td><sf:input path="email" /><br /> <sf:errors
path="email" cssClass="error" /></td>
</tr>
<tr>
<td>Phone No.</td>
<td><sf:input path="phoneNo" /><br /> <sf:errors
path="phoneNo" cssClass="error" /></td>
</tr>
<tr>
<td>Role</td>
<td><sf:select path="role" items="${model.roles}" /><br /> <sf:errors
path="role" cssClass="error" /></td>
</tr>
<tr>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
</sf:form>
當我將輸入留空時,表單不會驗證並且不會引發任何錯誤。 BindingResult
中沒有任何錯誤。
我的圖書館是:
我的dispatcher-serlvet.xml
是:
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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">
<!-- Scans for annotated @Controllers in the classpath -->
<context:component-scan base-package="com.mj.cchp.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<bean id="myBeansValidator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<mvc:annotation-driven validator="myBeansValidator" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
我的applicationContext
是:
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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">
<!-- Scans for annotated @Controllers in the classpath -->
<context:component-scan base-package="com.mj.cchp">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver" />
<property name="url" value="jdbc:db2://172.16.2.181:60000/CCHP" />
<property name="username" value="db2inst1" />
<property name="password" value="db2inst1" />
</bean>
</beans>
我的web.xml
是:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>CCHP</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/application-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
你需要添加
<bean id="myBeansValidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
和
<mvc:annotation-driven validator="myBeansValidator">
和
<!-- Hibernate Validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
應該管用!
我有一個類似的問題,在我的情況下,只需為 hibernate 驗證器添加依賴項就足夠了: org.hibernate:hibernate-validator:5.2.4.Final 。
驗證由LocalValidatorFactoryBean bean 完成,有關它的文檔很方便( 這里)。
但同時值得一提的是,只要您使用 @EnableWebMvc 注釋,您就不必顯式實例化LocalValidatorFactoryBean : http ://docs.spring.io/spring/docs/current/spring-framework-reference/html /mvc.html#mvc-config-validation
默認情況下使用@EnableWebMvc 或在類路徑上檢測到 Bean 驗證提供程序(例如 Hibernate Validator)時通過 LocalValidatorFactoryBean 在 Spring MVC 中自動注冊 Bean 驗證支持。
希望這可以幫助。
我不確定您是否找到了解決此問題的方法。 我也面臨同樣的問題。 我設法解決了它。 我的設置問題完全是手動的,我犯了大錯,將整個 hibernate-validator-5.1.3.Final-dist.zip 放在 lib 文件夾中。
所以我所做的是在 dist 文件夾中的“hibernate-validator-5.1.3.Final-dist.zip”中獲取這 6 個文件,並將其放置在 Web 應用程序庫中。
這解決了我的問題。
我也遇到了同樣的問題,我的整個代碼都被正確編寫。
問題是我使用的 jar 文件版本不同。
我有 hibernate-validator-cdi-5.0.7.Final 和 hibernate-validator-6.0.2.Final。
只需確保您的 jar 文件的版本相同。
當我保留所有相同版本的罐子時,我的問題得到了解決。 我希望這能幫到您 。
我遇到了同樣的問題。 我通過在 dispatcher-serlvet.xml 文件中添加以下語句來解決。
<mvc:annotation-driven />
在我的情況下,hibernate-validator jars 在運行時不可用。 我已將它們復制到 .../WEB-INF/lib/ 然后它正常工作。
我添加了您所做的常用內容(pom 中的庫,RequestBody 上的 @Valid 等)
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b11</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
Spring 文檔(和許多博客)的微妙之處在於 Spring 會尋找一個退出點來拋出錯誤,但如果該退出點不存在,它將回復 404。在閱讀了很多特別是這個博客之后,添加這個類讓 Spring 識別 @Valid 並找到一個退出點來拋出錯誤
@RestControllerAdvice
@Order(1)
public class RestControllerExceptionHandler {
@RequestMapping(value = { "error/404" }, method = RequestMethod.GET)
@ExceptionHandler(Exception.class)
public String handleUnexpectedException(Exception e) {
return "views/base/rest-error";
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public String handlemethodArgumentNotValid(MethodArgumentNotValidException exception) { //
// TODO you can choose to return your custom object here, which will then get transformed to json/xml etc.
return "Sorry, that was not quite right: " + exception.getMessage();
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ConstraintViolationException.class)
public String handleConstraintViolation(ConstraintViolationException exception) { //
// TODO you can choose to return your custom object here, which will then get transformed to json/xml etc.
return "Sorry, that was not quite right: " + exception.getMessage();
}
}
我花了將近 2 天的時間解決了同樣的問題,最終找到了一個解決方案,如果您仍然遇到這個問題,我想建議您一個答案,就我而言,我嘗試使用hibernate-validator-5.1.3.Final-dist.zip,5.2.4.Final-dist.zip, 7.0.0.Final-dist.zip
但這些都不適合我,但是當我使用*hibernate-validator-6.2.0.Final-dist*
,它支持 jarkarta 驗證但是即使人們說因為 Jakarta Bean Validation 它在 hibernate-validator's version post 5 中不起作用,它也能完美工作。它奇跡般地工作,相信我,它也可能對你有用。
您需要在注冊方法中添加@Valid
@RequestMapping(value = "\/register") public ModelAndView register(@Valid @ModelAttribute("user") UserBean user, BindingResult result) {<\/code>
"
如果您使用的是hibernate-validator ,請使用版本6.2.4版本 7 可能無法正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.