我的所有实体都有一个名为AbstractEntity
的公共超类。
实体有一个name
字段。不允许用户创建与现有实体同名的实体。
对于每个实体类型,都有一个关联的控制器,其方法是从JSF EL引用的。控制器是实体列表的已知位置。
我想创建一个验证,以便在用户输入实体名称的输入表单中,如果名称是重复的,则会收到验证错误。
<p:outputLabel for="name"/>
<p:inputText id="name" value="#{controlller.selectedEntity.name}"/>
理想情况下,如果用户尝试创建重复的实体名称,则会通过相同的视觉呈现来指示名称字段,例如,必填字段未填写:输入字段以红色突出显示等
许多标记和控制器代码都是公共代码(模板,基本控制器类等)。我希望能够拥有&#34;独特的名字&#34;验证是常见的代码,我们有很多实体,我想干,避免代码膨胀。
我的困境在于JSF验证方法似乎不允许我在基本控制器类中使用验证器。验证器选项包括:
这些是不够的,因为实体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无关。