想将JSF验证器编码为基本控制器类中的方法

时间:2016-02-11 16:47:55

标签: jsf primefaces

我的所有实体都有一个名为AbstractEntity的公共超类。

实体有一个name字段。不允许用户创建与现有实体同名的实体。

对于每个实体类型,都有一个关联的控制器,其方法是从JSF EL引用的。控制器是实体列表的已知位置。

我想创建一个验证,以便在用户输入实体名称的输入表单中,如果名称是重复的,则会收到验证错误。

<p:outputLabel for="name"/>
<p:inputText id="name" value="#{controlller.selectedEntity.name}"/>

理想情况下,如果用户尝试创建重复的实体名称,则会通过相同的视觉呈现来指示名称字段,例如,必填字段未填写:输入字段以红色突出显示等

许多标记和控制器代码都是公共代码(模板,基本控制器类等)。我希望能够拥有&#34;独特的名字&#34;验证是常见的代码,我们有很多实体,我想干,避免代码膨胀。

我的困境在于JSF验证方法似乎不允许我在基本控制器类中使用验证器。验证器选项包括:

  • 声明性JSR 303 Bean验证 - bean本身并不知道其他实体的列表,因此无法正常工作。
  • 验证使用Backing bean中的方法

这些是不够的,因为实体bean没有该实体的实例列表。

  • 可通过<f:validateXXX>代码
  • 表示的验证

这还不够,因为没有办法表达&#34;唯一的名字&#34;验证要求。

  • 势在必行的验证

这是不够的,因为@FacesValidator必须是类。因此,我必须为每个实体编写一个单独的验证器类,将控制器注入该类,等等。这会导致代码膨胀和效率低下。

我想要的是这样的事情:

<p:outputLabel for="name"/>
<p:inputText id="name" value="#{controlller.selectedEntity.name}">
    <f:validateXXX method=#{controller.validateNameField}/>
</p:inputText>

validateNameField将是控制器基类中的一个方法。

这里的关键观察是验证器和现有实体列表确实需要在同一个类中。对于实体bean而言,情况并非如此,也不是单独的@FacesValidator类。

如果没有代码膨胀,有没有办法做到这一点?

有人将此标记为重复,StackOverflow坚持要解释为什么不重复。因为所谓的副本必须处理JPA数据库中的唯一约束。这与JPA无关。

0 个答案:

没有答案