JSF2 и JPA Validator не работают, хотя у меня есть сообщение <h: - PullRequest
1 голос
/ 14 марта 2012

У меня есть модель:

@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
Что случилось? Я скачал демо-приложение, где оно работало совершенно легко, но это было немного по-другому, без провайдера, контроллера и модели, это была просто модель и класс миксов ...

Я также пытался это сделать, только с исключением throw и с и без try catch

какой валидатор мне нужен в UserProvider?

1 Ответ

2 голосов
/ 14 марта 2012

Необходимо связать поле со свойством модели, а не со свойством контроллера.

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

Не связано с конкретной проблемой, бросаяValidatorException внутри метода действия не имеет смысла.У вас есть 2 варианта:

  1. Отпустите его, чтобы он оказался на странице ошибок контейнера по умолчанию или на пользовательской странице, определенной в web.xml.

  2. Создание и добавление сообщения о лицах самостоятельно с помощью FacesContext#addMessage().

Кроме того, я также удивляюсь, как полезно иметь службу @Stateful в данном конкретном случае.Это может быть так же хорошо, только @Stateless.То, что @RequestScoped на EJB, совершенно не нужно и только сбивает с толку.Все эти try-catch и throws Exception в методе обслуживания также совершенно не нужны.Это @Inject не будет работать вообще в сторону @ManagedBean.Вместо этого внутри EJB должно быть @PersistenceContext.Вы полностью смешиваете аннотации JSF / CDI / EJB.Пожалуйста, будьте очень осторожны с этим.

...