【发布时间】: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
标签: ajax jsf jpa primefaces bean-validation