当前位置: 首页 > 知识库问答 >
问题:

使用JSF和Omniface进行Bean验证的重复消息

澹台欣怿
2023-03-14

我对JSF2.2、Omnifaces 2.6.3和PrimeFaces 6.1的客户端验证有一个问题,这导致来自Bean验证的验证消息显示两次。

如果在我使用的某个按钮中

<p:commandButton value="Some Action" ajax="false" action="#{someController.action}" validateClient="false"> <!-- validation disabled to test server side validation -->
     <o:validateBean value="#{someController.bean}" showMessageFor="@violating" />
</p:commandButton>

验证有效,但每次验证都会产生两条消息:

NotNull validation failed
NotNull validation failed
Max validation failed
Max validation failed

我将问题追溯到类javax.faces.validator.BeanValidator,它正在与Omnifaces org.omnifaces.taghandler.ValidateBean一起执行验证。

我试图删除JSF的默认bean验证,但PrimeFaces客户端验证依赖于启用的bean验证将ValidatorID发送到客户端,因此这不是一个选项。

我做了一个变通方法,在注释中使用一些组,默认的BeanValidator不会验证,但是我想知道是否有一种方法可以不使用组。

谢谢!

编辑:示例项目 https://github.com/marcelopio/duplicatederror

编辑2:

SomeController.class

@Named
@ViewScoped
public class SomeController implements Serializable {

    private static final long serialVersionUID = 6184842672181799938L;

    private Foo foo = new Foo();

    public void someAction() {
        System.out.println("action");
    }

    public Foo getFoo() {
        return foo;
    }

    public void setFoo(Foo foo) {
        this.foo = foo;
    }

}

Foo.class

public class Foo implements Serializable {

    private static final long serialVersionUID = -7334434752280744719L;

    @Max(5)
    private Integer bar;

    public Integer getBar() {
        return bar;
    }

    public void setBar(Integer bar) {
        this.bar = bar;
    }

}

可扩展的超文本标记语言

<?xml version="1.0" encoding="ISO-8859-1"?>
<!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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:o="http://omnifaces.org/ui">

    <h:head>
        <title>Teste</title>
    </h:head>

    <h:body>
        <h:form>
            <p:messages />
            <p:outputLabel value="Bar" for="bar"/>
            <p:inputText id="bar" value="#{someController.foo.bar}" />
            <p:message for="bar" />
            <p:commandButton value="Action" action="#{someController.someAction()}" ajax="false" validateClient="false">
                <o:validateBean value="#{someController.foo}" showMessageFor="@violating" />
            </p:commandButton>

        </h:form>
    </h:body>

</html>

WEB.XML

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
    <display-name>Duplicated Error</display-name>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>primefaces.TRANSFORM_METADATA</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>primefaces.CLIENT_SIDE_VALIDATION</param-name>
        <param-value>true</param-value>
    </context-param>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>


    <welcome-file-list>
        <welcome-file>initial.xhtml</welcome-file>
    </welcome-file-list>

</web-app>

共有1个答案

梁祯
2023-03-14

使用< code>showMessageFor=""属性控制消息如何显示o:validateBean,同时将< code>p:messaages的< code>globalOnly属性设置为< code>true。

更新

对于您的用例,o:消息提供了这样做的可能性:

eg

<o:messages for="fooBar" />
<h:form id="fooBar">
      <p:outputLabel value="Bar" for="bar"/>
      <p:inputText id="bar" value="#{someController.foo.bar}" />
    <p:message for="bar" />
    <p:outputLabel value="Bar" for="foo"/>
      <p:inputText id="foo" value="#{someController.foo.bar}" />
    <p:message for="foo" />
</h:form>

如上所述,您可以在两个级别上显示您的消息。

 类似资料:
  • 因此,很明显,它识别出输入的名称太短,但我在视图中没有得到任何错误消息,正如这里所预期的:。

  • 我尝试将JSF与Bean验证结合使用。基本上,一切正常,验证工作如预期,我得到了正确的消息,但我的Glassfish控制台上有一个例外: 如果我使用自定义约束和预定义约束,则会发生此异常。 这是我的示例代码。 示例实体: 自定义约束: 自定义验证器: 样品控制器: jsf页面示例: MyEntityFacade仅从实体管理器进行持久化调用。 如前所述,应用程序运行良好,正确的消息已显示,但我希望在

  • 但是,当我执行以下测试时,不会引发验证异常: 当保存一个已经持久化的对象时,我如何使验证器触发器?最好是通过Java配置。 我的验证依赖项:

  • 我想验证社会安全号码是否存在于数据库中。这是我的验证器。 在Validator中,我有一个@EJB userDao,我有一个方法此方法: 但是当我执行此方法时,我有一个错误: 警告:StandardWrapperValve[面向Servlet]:PWC1406:Servlet。servlet Faces的service()servlet引发了异常java。pl.ePrzychodnia处的lang

  • 我必须使用jsf配置Spring Security 5,此下面的代码在Spring Security 4中工作正常,但当我迁移到版本5时,身份验证过程不会触发: 登录表单如下所示: JSF Bean: 以及安全配置: 当我提交登录表单时,身份验证未被触发!我在这个配置中忘记了什么吗? 在Spring Security 4中,触发登录和注销的操作如下所示: 和注销: 我尝试将j_spring_sec

  • 问题内容: 我注意到有人问过这个问题,但是没有正确回答。 我有一个数据表,其中有两列 开始日期 和 结束日期 。两者都包含总理字符p:calendar控件。我需要确保每一行中column1中的日期都不晚于column2中的日期。我想将其绑定到JSF验证框架中,但是遇到了麻烦。 我尝试将数据表标记为rowStatePreserved =“ true”,这使我能够获取值,但是还是有些错误,因为当它失败