Проблемы с Hibernate Validator и Spring Webflow - PullRequest
2 голосов
/ 15 апреля 2011

Я пытаюсь проверить форму с помощью Spring WebFlow и Hibernate Validator Annotations, но я делаю что-то не так.

Если я использую способ проверки Spring (ValidationContext, MessageContext, validate $ {state}и т. д.), все работает нормально, но я хочу использовать аннотации Hibernate, такие как @Email, @NotEmpty и т. д.

Я прочитал много форумов, документацию Spring, но я не знаю, чтоЯ делаю не так.

В данный момент это мое состояние просмотра и следующий код действия:

<var name="user" class="myproject.web.pojo.User"/>

<view-state id="startSignup" model="user">
    <binder>
        <binding property="email" />
        <binding property="name" />
        <binding property="lastName" />
        <binding property="password" />
    </binder>
    <on-entry>
        <set name="flowScope.user" value="new info.teaming.web.pojo.User()" />
    </on-entry>
    <transition on="dataEntered" to="lookupUser" />
</view-state>

<action-state id="lookupUser">
    <evaluate expression="signupActions.lookupUser(user)" />
    <transition to="startSignup" on-exception="myproject.web.service.exception.UserAlreadyExistsException" />
    <transition to="saveOrder" />
</action-state>
    (...)

Это код startSignup.jsp:

<!--  sf:form method="POST" modelAttribute="user" -->
<sf:form method="POST" commandName="user" >
<input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}" />
<fieldset>
    <table cellspacing="0">
        <tr>
            <th>
                <label for="name"><fmt:message key="signUp.name"/></label>
            </th>
            <td>
                <sf:input path="name" size="25" id="name" />
            </td>
            <sf:errors path="name" />
        </tr>
        <tr>
            <th>
                <label for="lastName"><fmt:message key="signUp.lastName"/></label>
            </th>
            <td>
                <sf:input path="lastName" size="45" maxlength="45" id="lastName" />
            </td>
        </tr>
        <tr>
            <th>
                <label for="password"><fmt:message key="signUp.password"/></label>
            </th>
            <td>
                <sf:password path="password" size="20" showPassword="true" id="password" />
            </td>
        </tr>
        <tr>
            <th>
                <label for="email"><fmt:message key="signUp.email"/></label>
            </th>
            <td>
                <sf:input path="email" size="30" id="email" />
            </td>
        </tr>
        <tr>
            <td>
                <input type="submit" name="_eventId_dataEntered" value="<fmt:message key="signUp.register"/>"/>
            </td>
        </tr>
    </table>
</fieldset>
 </sf:form>

Это код POJO myproject.web.pojo.User:

import java.io.Serializable;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;

public class User implements Serializable {

private static final long serialVersionUID = 1L;

@NotEmpty
@Length(min = 2, max = 25)  
private String name;  

@NotEmpty
@Email
private String email;  

@NotEmpty
@Length(min = 2, max = 45)  
private String lastName;  

@NotEmpty
@Length(min = 6, max = 20)
private String password;

public String getName() {  
    return name;  
}  

public void setName(String name) {  
    this.name = name;  
}  

public String getEmail() {  
    return email;  
}  

public void setEmail(String email) {  
    this.email = email;  
}  

public void setPassword(String password) {
    this.password = password;
}

public String getPassword() {
    return password;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getLastName() {
    return lastName;
}  

    //  public void validateStartSignup(ValidationContext context) {
    //      MessageContext messages = context.getMessageContext();
    //      
    //      messages.addMessage(new   MessageBuilder().error().source("name").code("user.name.notEmpty").build());
    //  }

  }

(примечание: как вы можете видеть, когда я работаю с Spring Validation (раскомментируйте метод validate), форма успешно проверяется)

И, наконец, это мой код RegistrationAction:

import myproject.web.model.UsrUser;
import myproject.web.model.dao.UsrUserDAO;
import myproject.web.pojo.User;
import myproject.web.service.exception.UserAlreadyExistsException;

import javax.annotation.Resource;
import javax.validation.Valid;

import org.springframework.stereotype.Component;
import org.springframework.webflow.action.MultiAction;
import org.springframework.webflow.execution.Event;

@Component
public class SignupActions extends MultiAction {

@Resource
UsrUserDAO usrUserDAO;

private static final long serialVersionUID = 1L;

public Event lookupUser(@Valid User user) throws UserAlreadyExistsException {
    try {
        usrUserDAO.findByEmail(user.getEmail());
    } catch (javax.persistence.NoResultException e) {
        return success();
    }

    throw new UserAlreadyExistsException();
}

public void saveUser(UsrUser user) {
    return;
}

}

Когда я работаю с проверкой гибернации, поток поступает в метод saveUser без проверки.

Я использую Spring 3:

  • Spring 3.0.5.RELEASE
  • Spring WebFlow 2.2.1.RELEASE
  • Hibernate Validator 4.0.2.GA

Что я делаю не так?

Спасибомного за помощь мне!:)

Ответы [ 2 ]

0 голосов
/ 08 марта 2015

Попробуйте, изменив:

@Resource
UsrUserDAO usrUserDAO;

По:

@Autowired
private UsrUserManager UsrUserManager;

Использование менеджера MVC.

И:

@Transactional
public Event lookupUser(@Valid User user) throws UserAlreadyExistsException { ...

какSpring MVC контроллер или повторное использование этого кода MVC, если вы его уже создали;)

0 голосов
/ 09 июля 2014

вы определили свой валидатор в XML-файле конфигурации Spring?

Согласно Spring Webflow ссылка это должно быть определено так:

<webflow:flow-registry flow-builder-services="flowBuilderServices" />

<webflow:flow-builder-services id="flowBuilderServices" validator="validator" />

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
...