我有一个简单的应用程序,我使用验证(它完美地工作)但是我有问题将错误消息传回表单。在示例中,我看到它看起来像是“神奇地”传回形式而无需手动设置任何属性或任何属性。
这是我的控制器代码:
@RequestMapping(value = "/createMember", method = RequestMethod.GET)
public ModelAndView showContacts() {
return new ModelAndView("createMember", "command", new Member());
}
@RequestMapping(value = "/createMember", method = RequestMethod.POST)
public ModelAndView addContact(@ModelAttribute("member")
@Valid Member member, BindingResult result) {
if(result.hasErrors()) {
return new ModelAndView("createMember", "command", member);
}
mba.addMember(member);
return getPages();
}
这是我的createMember.jsp:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head>
<script src="<c:url value="/resources/core/jquery.1.10.2.min.js" />"></script>
<script src="<c:url value="/resources/core/jquery.autocomplete.min.js" />"></script>
<link href="<c:url value="/resources/core/main.css" />" rel="stylesheet">
</head>
<body>
<form:form method="post" action="createMember.html">
<table>
<tr>
<td><form:label path="firstName">First Name</form:label></td>
<td><form:input path="firstName" value="${member.firstName}" /></td>
<form:errors path="firstName" cssclass="error"></form:errors>
</tr>
<tr>
<td><form:label path="lastName">Last Name</form:label></td>
<td><form:input path="lastName" value="${member.lastName}" /></td>
<form:errors path="lastName" cssclass="error"></form:errors>
</tr>
<tr>
<td><form:label path="email1">Email</form:label></td>
<td><form:input value="${member.email1}" path="email1" /></td>
<form:errors path="email1" cssclass="error"></form:errors>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Add Contact"/>
</td>
</tr>
</table>
</form:form>
<a href="${pageContext.servletContext.contextPath}"> Back to main page </a>
</body>
</html>
我使用的是Spring 3.2.2,Tomcat 7,hibernate-validator
验证类:
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
public class Member {
private int memberID;
private int gender;
@Size(min=2, max=30)
private String firstName;
@Size(min=2, max=30)
private String lastName;
@NotEmpty @Email
private String email1;
//...getters and setters here
}
答案 0 :(得分:1)
抱歉,我无法直接解决这个问题,但这里有一个log4j配置文件,可能有所帮助。只需确保将其部署到WAR文件中的WEB-INF / classes:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c{1} - %m%n" />
</layout>
</appender>
<!-- Log levels:
ALL,
TRACE,
DEBUG,
INFO,
WARN,
ERROR,
FATAL
-->
<!-- 3rdparty Loggers -->
<logger name="org.springframework">
<level value="TRACE" />
</logger>
<logger name="org.springframework.context">
<level value="TRACE" />
</logger>
<logger name="org.springframework.http">
<level value="TRACE" />
</logger>
<logger name="org.springframework.web">
<level value="TRACE" />
</logger>
<logger name="org.springframework.core">
<level value="TRACE" />
</logger>
<root>
<priority value ="TRACE" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
还要检查你的pom.xml或gradle配置文件。 Spring版本不匹配会导致各种奇怪的问题。
答案 1 :(得分:1)
在控制器类中尝试@ModelAttribute("command")
而不是@ModelAttribute("member")
。
答案 2 :(得分:0)
您的表单没有模型支持(要做验证Spring必须知道模型中的哪个字段属于视图中的哪些字段)。要做到这一点,您需要添加modelAttribute
属性是您的Spring表单。所以这些是您需要担心的问题。
在控制器中
@RequestMapping(value = "/createMember", method = RequestMethod.POST)
public ModelAndView addContact(@ModelAttribute("member") @Valid Member member, BindingResult result)
您应该在表单中提及您为@ModelAttribute("member")
提供的值。
在视图中
<form:form method="post" modelAttribute="member" action="createMember.html">
如果您不想在控制器中提及modelAttribute="whateveryournamehere"
,请使用@ModelAttribute("command")
。那么你不想使用modelAttribute="command"
。