虽然我有一个,但JSF2和JPA Validator不工作

时间:2012-03-14 13:07:45

标签: validation jsf-2 jpa-2.0

我有一个模特:

@Entity
@Table(name = "User")
public class User implements Serializable  {

    private static final long serialVersionUID = 546951187473649176L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Size(min = 3, max = 25)
    @Pattern(regexp = "[A-Za-z ]*", message = " wroooooong")
    private String name;

    /** some setters and getters **/
}

我有一个UserController.java

@ManagedBean(name = "userController")
@SessionScoped
public class UserController implements Serializable {

    private static final long serialVersionUID = -4210819542193607967L;

    @EJB
    private UserProvider userProvider;

    @Inject
    EntityManager entityManager;

    @PostConstruct
    public void initNewUser() {
        user = new User();
    }

    private User user;

    public void registerUser() throws ValidatorException  {
        try {
            userProvider.registerUser(new User(),user);
        } catch (Exception e) {
            throw new ValidatorException(new FacesMessage(e.getMessage()));

        }
    }

    private String name;
    /** some setters and getters **/

}

UserProvider如下所示:

@RequestScoped
@Stateful
public class UserProvider {

    @Inject
    private EntityManager entityManager;

    public void registerUser (User newUser, String name) throws Exception {
        try {
            newUser.setName(name);
            entityManager.persist(newUser);
        } catch (Exception e){
            throw e;
        }
    }
}

,最后我的register.xhtml:

<h:form>
    <label for="name">name</label>
    <h:inputText id="name" value="#{userController.name}" required="true"  />
    <h:message id="register_name_error" for="name" errorClass="invalid"/>
    <h:commandButton action="#{userController.registerUser()}" id="submit" value="send" />
</h:form>

当我在名字字段中输入要缩短的内容时,我在我的堆栈中输入了这个内容:

 javax.validation.ConstraintViolationException: Validation failed for classes [de.liedl.bachelor.model.User] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='muss zwischen 3 und 25 liegen', propertyPath=accountName, rootBeanClass=class de.demotest.model.User, messageTemplate='{javax.validation.constraints.Size.message}'}
]

但错误永远不会被发回我的<h:message 怎么了? 我下载了一个演示应用程序,它的工作非常简单,但这有点不同,没有提供者和控制器和模型,它只是模型和混合类......

我也尝试过抛出异常并使用和不使用try catch

我在UserProvider中需要哪个Validator?

1 个答案:

答案 0 :(得分:2)

您需要将字段绑定到模型的属性,而不是绑定到控制器的属性。

<h:inputText id="name" value="#{userController.user.name}" required="true"  />

对于具体问题

无关,在操作方法中抛出ValidatorException毫无意义。您有两个选择:

  1. 让它走,以便它最终出现在容器的默认错误页面或web.xml中定义的自定义错误页面。

  2. FacesContext#addMessage()自行创建并添加面孔消息。

  3. 此外,我也想知道在这种特殊情况下如何提供@Stateful服务是有用的。它可以是@Stateless一样好。 EJB上的@RequestScoped完全没有必要,只会令人困惑。服务方法中的整个try-catchthrows Exception也是完全没必要的。 @Inject@ManagedBean旁边@PersistenceContext根本不起作用。 EJB内部的那个必须是{{1}}。您完全混合了JSF / CDI / EJB注释。请小心这一点。