如果违反 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 注释)
一个 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 约束验证器中的依赖注入失败