当前位置: 首页 > 知识库问答 >
问题:

如果违反了JSR303验证约束,如何执行要通过p:Ajax设置的p:inputText值?

冀鸿才
2023-03-14

我有一个JavaWeb7项目,在该项目中,我希望在每个p:ajax事件上,直接在支持bean中管理的实体实例上编写JSF组件值。只要添加一个JSR303验证约束,就可以很好地工作,比如在实体属性之一上添加@size(min=5)。只要违反约束,就不再在具有约束的属性上设置值。没有根据NetBeans调试器调用setter;另一个属性工作很好,这使我相信我已经隔离了问题。我想在我想要的时候执行验证,因此,如果我想要的话,可以设置无效的值。如何做到这一点?

在我的最小可复制示例中,我有实体myEntity(JPA和JSR303注释)

@Entity
public class MyEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private Long id;
    @Size(min = 5)
    private String property1;
    private String property2;

    public MyEntity() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getProperty1() {
        return property1;
    }

    public void setProperty1(String property1) {
        this.property1 = property1;
    }

    public String getProperty2() {
        return property2;
    }

    public void setProperty2(String property2) {
        this.property2 = property2;
    }
}
<?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>

和一个支持豆

@ManagedBean
@SessionScoped
public class MyManagedBean {
    private String value;
    private String textAreaValue;
    private MyEntity myEntity = new MyEntity();

    public MyManagedBean() {
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getTextAreaValue() {
        return textAreaValue;
    }

    public MyEntity getMyEntity() {
        return myEntity;
    }

    public void setMyEntity(MyEntity myEntity) {
        this.myEntity = myEntity;
    }

    public void setTextAreaValue(String textAreaValue) {
        this.textAreaValue = textAreaValue;
    }

    public void onSaveButtonClicked(AjaxBehaviorEvent event) {
        System.out.println("value: "+value);
        System.out.println("textAreaValue: "+textAreaValue);
        System.out.println("myEntity: "+myEntity);
    }
}

这个示例可以在https://github.com/krichter722/jsf-skip-entity-validation上找到。我用的是Primefaces 6.0。

共有1个答案

蔡晨
2023-03-14

它正在按照它应该的工作方式工作。如果验证失败,则不应调用setter。如果需要,可以使用以下命令禁用bean验证:

<f:validateBean disabled="true"/>
 类似资料:
  • 我正在使用JSR303的HibernateValidator实现来验证程序中的一些实体,我需要记录不正确的数据。我可以拥有JSR303验证结果的ConstraintViolation列表,但它只包含失败验证的元数据。有问题的值本身在任何地方都不可用,我无法记录它们(我必须将违反约束的情况映射回实体,这很糟糕)。 我在Hibernate的ConstraintTree类中发现了一个跟踪日志,它记录了所

  • 我有一个迁移脚本之间的2个不同的模式数据库。脚本做了3件事:1。禁用约束2。将记录从旧架构插入到新架构3。启用约束 我发现这两个约束在旧的模式中是不存在的。这2个表的表结构定义有什么问题吗?

  • JSR303Bean验证包含一些现成的约束,但也允许定义自定义约束。 我有一种感觉,对于许多没有随JSR实现一起提供的项目来说,有很多共同的约束。 日期范围 密码复杂性检查 等于交叉字段验证(堆栈溢出投票最高的'bean验证'问题) ... 所以我的问题是:是否有一个(值得信赖的)库包含commons jsr 303(Bean验证)约束?

  • 我正试图为bean验证编写一个jUnit测试。我阅读了如何使用JUnit测试类的验证注释?并编写了如下的测试代码。 我的环境: Sprint Boot 2.2.6 Java11 断言J 3.15.0 目标Bean类: JUnit测试代码: 我想检查违反了哪些约束。现在,我检查违规信息。有更好的方法吗?

  • 我使用的是Hibernate Validator5.x和javax Validation1.x(由于一些原因,无法升级)。这个场景可以在hibernate Validator6.x和Validation2.x中工作 在违反约束时,Validator会启动并显示正确的错误响应,但同时它会执行REST方法体。 我搜索了官方文件,但没有帮助。

  • 我有一个笑话模型: 现在,当我试图迁移最后一行时,我得到了错误。基本上,我想将一个用户链接到Joke对象,因为我已经有了一个数据库,所以我希望默认值为1,这是管理员用户的id(我检查过了...).Makemigrations工作正常,但是当我尝试迁移时,我得到了这个: 我真的不明白怎么了。有什么想法吗?