2012-03-14 16 views
1

我有一個型號:JSF2和JPA驗證不工作,雖然我有一個的<h:消息

@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
有什麼不對? 我下載了一個演示應用程序,它的工作非常容易,但是這有點不同,沒有提供商和控制器和模型,它只是模型和混合類...

我也試過這個只是拋出異常,有和沒有嘗試捕獲

Validator我需要在UserProvider?

回答

2

您需要將字段綁定到模型的屬性,而不是控制器的屬性。

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

無關的具體問題,拋出一個ValidatorException的操作方法中是沒有意義的。你有兩個選擇:

  1. 隨它去吧,使其在容器的默認錯誤頁結束或web.xml definied一個自定義的。

  2. 通過FacesContext#addMessage()自己創建並添加面孔消息。

此外我還想知道在這種特殊情況下如何有@Stateful服務是有用的。它可能是一樣好@Stateless。對一個EJB來說,這個@RequestScoped是完全不必要的,只會讓人困惑。服務方法中的整個try-catchthrows Exception也完全沒有必要。 @Inject將不會在@ManagedBean中工作。 EJB中的一個必須是@PersistenceContext。您完全混合了JSF/CDI/EJB註釋。請對此非常小心。

+0

感謝Balus。 但你的意思是:@Inject ist不工作​​在我的控制器?你的意思是'@Inject EntityManager em;'我的控制器中有一些功能,它看起來像在工作? - EJB(UserProvider)看起來像它的工作 – Joerg 2012-03-14 15:53:59

+0

'@Inject'只能在'@ Named'類中使用。它是CDI的一部分,而不是JSF或EJB。 – BalusC 2012-03-14 15:58:25

+0

,如果我在模型中做的是這樣的:\t'@Column(unique = true)'它不會發送給我的jsf ...但是我得到'唯一索引或主鍵違例:「CONSTRAINT_INDEX_2 ON PUBLIC。USER(EMAIL)「; SQL語句' – Joerg 2012-03-14 16:48:42

相關問題