Hibernate Validator和Spring Webflow的问题

| 我正在尝试使用Spring WebFlow和Hibernate Validator Annotations验证表单,但是我做错了事。 如果我使用Spring验证方式(ValidationContext,MessageContext,validate $ {state}等),则一切正常,但是我想使用诸如@ Email,@ NotEmpty等的Hibernate Annotations。 我已经阅读了很多论坛和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>
这是myproject.web.pojo.User POJO代码:
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方法的注释),该表单已成功验证) 最后,这是我的SignupAction代码:
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;
}

}
当我使用Hibernate Validation时,流程将到达saveUser方法,而无需进行任何验证。 我正在使用Spring 3: Spring 3.0.5。发布 Spring WebFlow 2.2.1.RELEASE 休眠验证器4.0.2.GA 我做错了什么? 非常感谢您的帮助! :)     
已邀请:
您是否在Spring配置XML文件中定义了验证器? 根据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\" />
    
尝试, 变更:
@Resource
UsrUserDAO usrUserDAO;
通过:
@Autowired
private UsrUserManager UsrUserManager;
使用MVC管理器。 和:
@Transactional
public Event lookupUser(@Valid User user) throws UserAlreadyExistsException { ...
作为Spring MVC控制器,或者重用此MVC代码(如果已经在使用它的话;)     

要回复问题请先登录注册