如果实体的所有字段都为空,我如何跳过bean验证?

mab*_*abi 4 bean-validation jsf-2 omnifaces

我有一个像这样的地址实体:

@Entity
public class Address implements java.io.Serializable {
    @Id @GeneratedValue(strategy = IDENTITY)
    private Long id;

    @Size(max = 100)
    private String street;

    @Size(max = 15)
    private String nr;

    @Field
    @Size(min = 1, max = 20) @NotBlank
    private String city;
}
Run Code Online (Sandbox Code Playgroud)

这是其他几个实体的一部分.对于一个这样的实体,地址是可选的.我有一个视图,我们的用户可以通过几个表单输入编辑整个实体,包括几个地址字段.

为了能够编辑地址,我使用空地址实体初始化父实体.

现在问题是:Address当所有地址字段都为空时,我不想在实体上持久存在.为了实现这一点,我需要跳过实体的验证,如果(并且仅当)所有字段Address都为空.我该如何以最优雅的方式做到这一点?

我目前正在做的是完全跳过bean验证和<o:validateBean disabled="true" />提交按钮,null如果它是空的,则设置地址.但这听起来像是一个完全黑客,因为它在所有情况下禁用所有验证.我怎么能做得更好?

Bal*_*usC 6

你可以在(和)的disabled属性中使用EL .您可以使用EL检查是否已填写任何字段.您可以使用属性来引用EL中的组件.您可以通过检查与组件的客户端ID关联的请求参数的值来检查字段是否已填满.<f:validateBean><o:validateBean>binding

然后,要在#{addressIsEmpty}评估时禁用这些字段上的bean验证true,它更容易使用,<f:validateBean>而不是<o:validateBean>前者可用于包装多个输入组件.

所有这一切,这应该做:

<c:set var="addressIsEmpty" value="#{empty param[street.clientId] and empty param[nr.clientId] and empty param[city.clientId]}" />

<f:validateBean disabled="#{addressIsEmpty}">
    <h:inputText binding="#{street}" value="#{bean.address.street}" />
    <h:inputText binding="#{nr}" value="#{bean.address.nr}" />
    <h:inputText binding="#{city}" value="#{bean.address.city}" />
</f:validateBean>
Run Code Online (Sandbox Code Playgroud)

<o:validateBean>仅容易,如果你打算控制它在每个输入或每个命令的基础上使用.