Я схожу с ума от этого.
Краткий обзор моих зависимостей и их версии:
<spring.version>3.0.7.RELEASE</spring.version>
<tiles.version>2.2.2</tiles.version>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.1.0.Final</version>
<scope>compile</scope>
</dependency>
Также они есть в моем контексте сервлета:
<mvc:annotation-driven />
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:i18n/messages" />
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
У меня есть простая форма регистра:
<c:if test="${not empty message}">
<div class="${message.type.cssClass}">${message.text}</div>
</c:if>
<c:url value="/register" var="signupUrl" />
<form:form id="signup" action="${signupUrl}" method="post" commandName="userRegisterForm">
<div class="formInfo">
<spring:bind path="*">
<c:choose>
<c:when test="${status.error}">
<div class="error">Unable to sign up. Please fix the errors below and resubmit.</div>
</c:when>
</c:choose>
</spring:bind>
</div>
<fieldset>
<form:label path="firstName"><spring:message code="registerform.firstname" text="First Name"/><form:errors path="firstName" cssClass="error" /></form:label>
<form:input path="firstName" />
<form:label path="secondName"><spring:message code="registerform.secondName" text="Second Name"/><form:errors path="secondName" cssClass="error" /></form:label>
<form:input path="secondName" />
<form:label path="gender"><spring:message code="registerform.gender" text="Gender"/><form:errors path="gender" cssClass="error" /></form:label>
<form:radiobutton path="gender" value="male" label="Male" />
<form:radiobutton path="gender" value="female" label="Female" />
<form:label path="email"><spring:message code="registerform.email" text="Email"/><form:errors path="email" cssClass="error" /></form:label>
<form:password path="email" />
<form:label path="password"><spring:message code="registerform.password" text="Password"/><form:errors path="password" cssClass="error" /></form:label>
<form:password path="password" />
<form:label path="cpassword"><spring:message code="registerform.cpassword" text="Confirm Password" /><form:errors path="cpassword" cssClass="error" /></form:label>
<form:password path="cpassword" />
<button class="big fullBorderRadius" type="submit">Register</button>
</fieldset>
Также у меня есть Бин для этой формы:
import javax.persistence.Entity;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import de.***.***.model.entity.User;
public class UserRegisterForm {
@NotBlank
@NotEmpty
private String firstName;
@NotBlank
@NotEmpty
private String secondName;
@NotBlank
@NotEmpty
private String gender;
@NotBlank
@NotEmpty
@Email
private String email;
@NotBlank
@NotEmpty
@Size(min = 6)
private String password;
@NotBlank
@NotEmpty
private String cpassword;
@NotBlank
@NotEmpty
public String getFirstName() {
return firstName;
}
@NotBlank
@NotEmpty
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@NotBlank
@NotEmpty
public String getSecondName() {
return secondName;
}
@NotBlank
@NotEmpty
public void setSecondName(String secondName) {
this.secondName = secondName;
}
@NotBlank
@NotEmpty
public String getGender() {
return gender;
}
@NotBlank
@NotEmpty
public void setGender(String gender) {
this.gender = gender;
}
@NotBlank
@NotEmpty
@Email
public String getEmail() {
return email;
}
@NotBlank
@NotEmpty
@Email
public void setEmail(String email) {
this.email = email;
}
@NotBlank
@NotEmpty
public String getPassword() {
return password;
}
@NotBlank
@NotEmpty
public void setPassword(String password) {
this.password = password;
}
@NotBlank
@NotEmpty
public String getCpassword() {
return cpassword;
}
@NotBlank
@NotEmpty
public void setCpassword(String cpassword) {
this.cpassword = cpassword;
}
public static UserRegisterForm fromProviderUser(User providerUser) {
UserRegisterForm form = new UserRegisterForm();
form.setFirstName(providerUser.getFirstName());
form.setSecondName(providerUser.getSecondName());
form.setGender(providerUser.getGender());
form.setEmail(providerUser.getEmail());
return form;
}
@Override
public String toString() {
return "UserRegisterForm [firstName=" + firstName + ", secondName="
+ secondName + ", gender=" + gender + ", email=" + email
+ ", password=" + password + ", cpassword=" + cpassword + "]";
}
}
Итак, теперь давайте перейдем к моему контроллеру:
@Controller
@RequestMapping(value = "/")
public class UserAccountController {
@Autowired
private UserDao userDao;
/**
* Handles and retrieves the main JSP page
*
* @return the name of the JSP page
*/
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView getLoginForm() {
LoggerUtil.get(this.getClass()).debug("Received request to show login form");
ModelAndView mv = new ModelAndView("login");
mv.addObject("subHeadline", "Login form");
return mv;
}
@RequestMapping(value="/register", method=RequestMethod.GET)
public ModelAndView signupForm() {
LoggerUtil.get(this.getClass()).debug("Received request to show register form");
ModelAndView mv = new ModelAndView("registerform");
mv.addObject("userRegisterForm", new UserRegisterForm());
mv.addObject("subHeadline", "Register");
return mv;
}
@RequestMapping(value="/register", method=RequestMethod.POST)
public String register(@ModelAttribute("userRegisterForm") @Valid UserRegisterForm userRegisterForm, BindingResult formBinding) {
LoggerUtil.get(this.getClass()).debug("Received post request from register form");
LoggerUtil.get(this.getClass()).debug("Has Erros: "+ formBinding.hasErrors());
LoggerUtil.get(this.getClass()).debug("Errors: " + formBinding.getErrorCount());
LoggerUtil.get(this.getClass()).debug("Object: " + userRegisterForm.toString());
if (formBinding.hasErrors()) {
return null;
}
//TODO: save user
//TODO: login user
// redirect Startpage bzw. configured startpage
return "redirect:/register";
}
}
Так что все время я отправляю «пустую» форму, в ней нет ошибок!В журнале показывается следующее:
INFO : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [//login/] onto handler 'userAccountController'
DEBUG: org.hibernate.validator.engine.resolver.DefaultTraversableResolver - Found javax.persistence.PersistenceUtil on classpath.
INFO : org.hibernate.validator.engine.resolver.DefaultTraversableResolver - Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
DEBUG: org.hibernate.validator.xml.ValidationXmlParser - No META-INF/validation.xml found. Using annotation based configuration only
INFO : org.springframework.web.servlet.view.tiles2.TilesConfigurer - TilesConfigurer: adding definitions [/WEB-INF/spring/app/tiles-definitions.xml]
INFO : org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/cdn/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#2'
INFO : org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'appServlet': initialization completed in 2368 ms
DEBUG: de.***.***.controller.user.UserAccountController - Received request to show register form
DEBUG: de.***.***.controller.user.UserAccountController - Received post request from register form
DEBUG: de.***.***.controller.user.UserAccountController - Has Erros: false
DEBUG: de.***.***.controller.user.UserAccountController - Errors: 0
DEBUG: de.***.***.controller.user.UserAccountController - Object: UserRegisterForm [firstName=, secondName=, gender=null, email=, password=, cpassword=]
DEBUG: de.***.***.controller.HomeController - Received request to show startpage
0 Ошибки в форме ?!Если я вызываю валидатор с формой в качестве параметра, он возвращает 7 ошибок.Но у formBinding есть 0 ошибок.
Я следовал этому учебнику и попробовал гораздо больше, что я нашел в интернете также в stackoverflow.
Но все, что я пробовал, не работает,Кто-нибудь может мне помочь, пожалуйста?
Это решено.Мой Джексон ObjectMapper делает это не работает.После удаления ObjectMapper его работы.