我有一个模特:
@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?
答案 0 :(得分:2)
您需要将字段绑定到模型的属性,而不是绑定到控制器的属性。
<h:inputText id="name" value="#{userController.user.name}" required="true" />
无关,在操作方法中抛出ValidatorException
毫无意义。您有两个选择:
让它走,以便它最终出现在容器的默认错误页面或web.xml
中定义的自定义错误页面。
按FacesContext#addMessage()
自行创建并添加面孔消息。
此外,我也想知道在这种特殊情况下如何提供@Stateful
服务是有用的。它可以是@Stateless
一样好。 EJB上的@RequestScoped
完全没有必要,只会令人困惑。服务方法中的整个try-catch
和throws Exception
也是完全没必要的。 @Inject
在@ManagedBean
旁边@PersistenceContext
根本不起作用。 EJB内部的那个必须是{{1}}。您完全混合了JSF / CDI / EJB注释。请小心这一点。