【问题标题】:JSF2 and JPA Validator is not working although i have a<h:messageJSF2 和 JPA 验证器不工作,虽然我有一个<h:message
【发布时间】:2012-03-30 22:48:24
【问题描述】:

我有一个模型:

@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}'}
]

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

我也试过这个,只是抛出异常,有和没有 try catch

我需要在 UserProvider 中使用哪个 Validator?

【问题讨论】:

    标签: validation jsf-2 jpa-2.0


    【解决方案1】:

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

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

    与具体问题无关,在操作方法中抛出 ValidatorException 毫无意义。你有两个选择:

    1. 让它在容器的默认错误页面或web.xml 中定义的自定义错误页面结束。

    2. 通过FacesContext#addMessage() 自己创建和添加面孔消息。

    此外,我还想知道在这种特殊情况下拥有@Stateful 服务有什么用处。就像@Stateless 一样好。 EJB 上的@RequestScoped 完全没有必要,而且只会令人困惑。 service 方法中的整个try-catchthrows Exception 也完全没有必要。 @Inject@ManagedBean 中根本不起作用。 EJB 中的那个必须是@PersistenceContext。您完全混合了 JSF/CDI/EJB 注释。请非常小心。

    【讨论】:

    • 感谢巴鲁斯。但你的意思是:@Inject 在我的控制器中不起作用?你的意思是@Inject EntityManager em; 我的控制器中有一些功能,它看起来在哪里工作? - EJB (UserProvider) 看起来也能正常工作
    • @Inject 仅适用于 @Named 类。它是 CDI 的一部分,而不是 JSF 或 EJB。
    • 如果我在模型中执行以下操作:@Column(unique=true) 它不会发送到我的 jsf... 但我会得到 Unique index or primary key violation: "CONSTRAINT_INDEX_2 ON PUBLIC.USER(EMAIL)"; SQL statement
    • 这不是来自 bean 验证。那是来自JPA。在您的操作方法中捕获异常并添加错误面孔消息。或者实现一个Validator,它会事先检查唯一性。或者,更好的是,两者都做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2014-12-11
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多