如果违反 JSR 303 验证约束,如何强制通过 p:ajax 设置 p:inputText 值?

Posted

技术标签:

【中文标题】如果违反 JSR 303 验证约束,如何强制通过 p:ajax 设置 p:inputText 值?【英文标题】:How enforce a p:inputText value to be set through p:ajax if the JSR 303 validation constraint is violated? 【发布时间】:2017-09-15 20:49:08 【问题描述】:

我有一个 Java Web 7 项目,我想在每个 p:ajax 事件上将 JSF 组件值直接写入在支持 bean 中管理的实体实例上。只要我在其中一个实体属性上添加 JSR 303 验证约束(例如 @Size(min=5)),它就可以正常工作。只要违反了约束,就不再在具有约束的属性上设置该值。根据 NetBeans 调试器不调用 setter;另一个属性工作得很好,这让我相信我已经隔离了这个问题。我想在需要时执行验证,因此如果需要,可以获取和设置无效值。如何实现?

在我的最小可重现示例中,我有实体 MyEntity(JPA 和 JSR 303 注释)

@实体 公共类 MyEntity 实现 Serializable 私有静态最终长序列版本UID = 1L; @ID @GeneratedValue 私人长ID; @大小(最小 = 5) 私有字符串属性1; 私有字符串属性2; 公共我的实体() 公共长 getId() 返回标识; 公共无效setId(长ID) 这个.id = id; 公共字符串 getProperty1() 返回属性1; 公共无效 setProperty1(字符串属性 1) this.property1 = 属性 1; 公共字符串 getProperty2() 返回属性2; 公共无效 setProperty2(字符串属性 2) this.property2 = property2;

一个 JSF 页面

<?xml version='1.0' encoding='UTF-8' ?>
<!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">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:inputText value="#myManagedBean.myEntity.property1">
                <p:ajax/>
            </p:inputText>
            <p:inputTextarea value="#myManagedBean.myEntity.property2">
                <p:ajax/>
            </p:inputTextarea>
            <p:commandButton value="Save">
                <p:ajax listener="#myManagedBean.onSaveButtonClicked"/>
            </p:commandButton>
        </h:form>
    </h:body>
</html>

和一个支持 bean

@ManagedBean @SessionScoped 公共类 MyManagedBean 私有字符串值; 私有字符串文本区域值; 私人 MyEntity myEntity = new MyEntity(); 公共 MyManagedBean() 公共字符串 getValue() 返回值; 公共无效setValue(字符串值) this.value = 值; 公共字符串 getTextAreaValue() 返回文本区域值; 公共我的实体 getMyEntity() 返回我的实体; 公共无效 setMyEntity(MyEntity myEntity) this.myEntity = 我的实体; 公共无效 setTextAreaValue(字符串 textAreaValue) this.textAreaValue = textAreaValue; 公共无效 onSaveButtonClicked(AjaxBehaviorEvent 事件) System.out.println("值:"+值); System.out.println("textAreaValue: "+textAreaValue); System.out.println("myEntity: "+myEntity);

可以在https://github.com/krichter722/jsf-skip-entity-validation 找到该示例。我正在使用 Primefaces 6.0。

【问题讨论】:

嗯,如果你向 p:ajax 添加一个事件?根据文档,默认“由行为附加到的父 ClientBehaviorHolder 组件定义”,不管那会是什么......但我认为当你实际添加验证注释时,这个默认值会改变。可能是。 (反正没有人理解 jsf 生命周期的事情)。 那我的名字是nobody JSF 2.0: How to skip JSR-303 bean validation?的可能重复 【参考方案1】:

它正在按应有的方式工作。如果验证失败,则不应调用 setter。如果您愿意,可以使用以下方法禁用 bean 验证:

<f:validateBean disabled="true"/>

【讨论】:

这正是副本中(其中一个)答案中的内容......请标记问题

以上是关于如果违反 JSR 303 验证约束,如何强制通过 p:ajax 设置 p:inputText 值?的主要内容,如果未能解决你的问题,请参考以下文章

Java Hibernate Validator JSR-303验证

Java Hibernate Validator JSR-303验证

使用 Spring 的 JSR-303 约束验证器中的依赖注入失败

使用 JSR 303 在 JSF 中使用内联消息进行跨字段验证

JSR303定义的校验类型

使用 Hibernate Validator (JSR 303) 进行跨字段验证