Почему <f: validateBean /> не будет работать? - PullRequest
5 голосов
/ 14 декабря 2011

Я использую JSF 2.0, hibernate-validator4.2.jar validation-api.jar tomcat и Eclipse.

Я помещаю @Size(min=3, message="xxx") аннотацию в @ManagedBean и <f:validateBean /> между <h:inputText value="#{user.name}"></h:inputText>

Когда я пытаюсь запустить проект, я получаю эту ошибку ...

exception

javax.servlet.ServletException: Expression Error: Named Object: javax.faces.Bean not found.
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

root cause

javax.faces.FacesException: Expression Error: Named Object: javax.faces.Bean not found.
    com.sun.faces.application.ApplicationImpl.createValidator(ApplicationImpl.java:1593)
    com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl.createValidator(ValidatorTagHandlerDelegateImpl.java:244)
    com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl.applyAttachedObject(ValidatorTagHandlerDelegateImpl.java:132)
    com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl.applyNested(ValidatorTagHandlerDelegateImpl.java:211)
    com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl.apply(ValidatorTagHandlerDelegateImpl.java:87)
    javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
    javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)

почему? (это появляется только когда я ставлю тег)

User.java

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.validation.constraints.Size;

@ManagedBean(name="user")
@SessionScoped
public class User{
    @Size(min=3, message="At least 3 characters!")
    private String name;


    public String getName() {
        return nume;
    }
        public void setName(String name){
                this.name=name;
    }

}

adduser.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="/templates/master_layout.xhtml">
    <ui:define name="text_header" >Panou de control: Adauga user    </ui:define>
    <ui:define name="content">
        <h:panelGrid columns="3">
            <h:outputText value="Name"></h:outputText>
            <h:inputText  value="#{user.name}"> 
                <f:validateBean />
             </h:inputText>

            <h:commandButton value="Inregistreaza" action="index.xhtml"></h:commandButton>
        </h:panelGrid>
    </ui:define>
</ui:composition>
</html>

1 Ответ

5 голосов
/ 14 декабря 2011

Должно работать идеально, хотя пустой тег <f:validateBean/> в этом контексте совершенно лишний.Предполагается, что он будет использоваться для более «точной настройки» проверки, такой как группировка проверки и / или отключение неявной проверки bean-компонента для каждого входа путем указания требуемых атрибутов тега.Однако у вас нет атрибутов для этого тега, поэтому просто удалите этот тег.При настройке проекта JSF 2 + JSR 303 по умолчанию он должен включаться полностью прозрачно, без добавления дополнительных тегов JSF, когда есть аннотация JSR 303 для свойства, например @Size и лайки.

Но я неНе думаю, что удаление тега решит это конкретное исключение.Ваша проблема лежит таким образом глубже.Предполагается, что этот валидатор автоматически регистрируется при запуске.Однако исключение в основном говорит о том, что валидатор вообще не зарегистрирован.С информацией, предоставленной до сих пор, невозможно дать целевой ответ.Я могу представить себе следующие возможные причины:

  1. В реализации JSF есть ошибка, которую вы используете.Обновите его до более новой версии.
  2. В вашем пути к классам есть несколько библиотек JSF разных версий.Очистите его.
  3. Корневое объявление faces-config.xml не объявлено как JSF 2.x.Исправьте это.
...