Bean验证VS JSF验证

时间:2010-03-19 11:24:13

标签: jsf java-ee

当面对在JSF2应用程序中验证属性的问题时,有两种主要方法。

使用Annotation定义ManagedBean上的验证

@ManagedBean
public class MyBean {
    @Size(max=8)
    private String s;

    // Getters setters and other stuff.
}

或在jsf页面上声明:

<h:inputText value="#{myBean.s}">
    <f:validateLength maximum="8"/>
</h:inputText>

碰巧我无法决定他们中的任何一个。第一个很好,因为它从jsf页面中删除了一些代码(这总是好的,因为这些页面根据定义并不友好)但是在查看jsf文件时更难以“一目了然”看到页面发生了什么

您认为哪一个更清楚?更好?更好?

5 个答案:

答案 0 :(得分:16)

我会在ManagedBean上进行验证,这会从模型视图Controller中的JSF VIEW中删除逻辑。并且应该让JSF负责显示模型。 此外,在托管bean上具有此功能可确保在何处更新验证。这更干涩(不要重复自己)。

答案 1 :(得分:3)

managedBean方法还有另一个优点。如果JSF显示的信息也可以通过Web服务(WS)获得,则可以将实际验证代码分解为验证类,并用于JSF和WS,以确保系统中的所有信息都有效。

答案 2 :(得分:2)

Richfaces允许您一起使用它们。请参阅<rich:graphValidator>(以及beanValidator)。

这些标签说:“基于javax.validation(或Hibernate验证器)规则应用JSF验证”。

答案 3 :(得分:1)

@ user1730904,您可以在资源包文件中定义消息,如Bean Validation规范文档中所述。所需的步骤很简单:

  1. 在某个类路径文件夹中创建名为ValidationMessages_xx_XX.properties的文件(例如src/main/resources/)。 xx_XXes_ESen_US等的位置。内容可以是: field.message=The number of digits must be less or equal than {max}.
  2. 然后使用bean属性注释中的值: @Size(max = 20, message="{field.message}")

答案 4 :(得分:-1)

我可能更喜欢JSF验证,因为我无法提供资源包错误消息作为bean验证的一部分。例如,你不能这样做

@NotNull(message = ResourceBundleHelper.getString("error_message"))

因为&#34;编译常量只能是原语和字符串&#34;。有定义常量消息的工作,但这看起来很难看。