Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation JSF2和JPA验证器不工作,尽管我有一个<;h:留言_Validation_Jsf 2_Jpa 2.0 - Fatal编程技术网

Validation JSF2和JPA验证器不工作,尽管我有一个<;h:留言

Validation JSF2和JPA验证器不工作,尽管我有一个<;h:留言,validation,jsf-2,jpa-2.0,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

我有一个模型:

@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;
        }
    }
}
最后是my 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>

但是错误永远不会返回到我的
,您需要将字段绑定到模型的属性,而不是控制器的属性

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


与具体问题无关,在action方法中抛出
ValidatorException
没有任何意义。您有两种选择:

  • 放开它,这样它就会出现在容器的默认错误页面中,或者出现在
    web.xml
    中定义的自定义错误页面中

  • 通过
    FacesContext#addMessage()
    自己创建并添加faces消息


  • 此外,我还想知道在这种特殊情况下使用
    @Stateful
    服务有何用处。只要
    @无状态
    ,就可以了。EJB上的
    @RequestScoped
    是完全不必要的,只是令人困惑。服务方法中的整个
    try-catch
    抛出异常也完全没有必要。
    @Inject
    @ManagedBean
    端根本不起作用。EJB中的一个必须是
    @PersistenceContext
    。您完全混合了JSF/CDI/EJB注释。请小心处理。

    谢谢你,巴卢斯。但你的意思是:@Inject不在我的控制器中工作?您是指
    @injectentitymanager em我的控制器中有一些函数,它看起来在哪里工作此外,EJB(UserProvider)看起来像是其工作的
    @Inject
    只在
    @命名的
    类中工作。它是CDI的一部分,而不是JSF或EJB。如果我在模型中这样做:
    @Column(unique=true)
    它不会发送到我的JSF。。。但是我得到了
    唯一索引或主键冲突:“PUBLIC.USER(EMAIL)上的CONSTRAINT_index_2”;不是来自bean验证的SQL语句
    。那是JPA的。捕获操作方法中的异常并添加错误面消息。或者实现一个
    验证器
    ,它预先检查唯一性。或者,最好两者都做。
    <h:inputText id="name" value="#{userController.user.name}" required="true"  />