【问题标题】:How enforce a p:inputText value to be set through p:ajax if the JSR 303 validation constraint is violated?如果违反 JSR 303 验证约束,如何强制通过 p:ajax 设置 p:inputText 值?
【发布时间】: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

标签: ajax jsf jpa primefaces bean-validation


【解决方案1】:

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

<f:validateBean disabled="true"/>

【讨论】:

  • 这正是副本中(其中一个)答案中的内容......请标记问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2015-01-10
  • 2013-06-13
  • 2012-03-06
  • 2015-12-19
相关资源
最近更新 更多