使用Bean验证与JSF和Omnifaces重复的消息

时间:2017-06-28 21:08:41

标签: java jsf primefaces omnifaces

我遇到了JSF 2.2,Omnifaces 2.6.3和带有客户端验证的PrimeFaces 6.1的问题,导致Bean Validation的验证消息显示两次。

如果在某个按钮中我使用

sizeof

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

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

我将问题追溯到正在执行Omnifaces org.omnifaces.taghandler.ValidateBean 旁边的验证的 javax.faces.validator.BeanValidator 类。

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

我做了一个解决方法,在注释中使用了一些组,默认的BeanValidator不会验证,但我想知道是否有办法没有义务使用组。

谢谢!

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

编辑2:

SomeController.class

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

让Foo.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;
    }

}

XHTML

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

}

WEB.XML

<?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>

1 个答案:

答案 0 :(得分:0)

使用showMessageFor=""属性控制消息的显示方式o:validateBean,同时将globalOnly p:messaages属性设置为true

<强>已更新

使用您的用例,o:messages提供了这样做的可能性:

例如

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

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