Формы, не работающие с Hibernate Validation 4.1, Spring 3.0.7 и Tiles 2 - PullRequest
1 голос
/ 19 марта 2012

Я схожу с ума от этого.

Краткий обзор моих зависимостей и их версии:

    <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 его работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...