为什么<f:validateBean />不起作用?

Ios*_* M. 5 jsf bean-validation jsf-2

我使用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)
Run Code Online (Sandbox Code Playgroud)

为什么?(这只在我放标签时出现)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

虽然<f:validateBean/>在这种情况下空标签完全是多余的,但它应该可以正常工作.它应该用于更多地进行"微调"验证,例如通过指定所需的标记属性,在每个输入的基础上对验证进行分组和/或禁用隐式bean验证.但是,您对该标记没有任何属性,因此只需删除该标记即可.在默认的JSF 2 + JSR 303项目设置中,只要在属性上有JSR 303注释(例如@Size和喜欢),它就应该完全透明地启动而不添加更多JSF标记.

但我认为删除标记不会解决这个特殊的异常.你的问题更深层次.该验证器应该在启动时自动注册.但是,该异常基本上告诉验证器根本没有注册.根据目前给出的信息,无法给出有针对性的答案.我可以想到以下可能的原因:

  1. 您正在使用的JSF实现中存在一个错误.将其升级到更新版本.
  2. 您的类路径中有多个不同版本的JSF库.清理它.
  3. faces-config.xml根声明未声明符合JSF 2.x版本 修理它.