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" />