Bean验证与JSF验证的区别

16

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

使用注释在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个回答

18

我建议在ManagedBean上进行验证,这样可以将逻辑从JSF视图中移除,使得JSF仅负责显示模型(MVC中的Model)。同时,将验证逻辑放在ManagedBean上可以确保无论何时更新都会应用验证,避免了重复代码(DRY原则)。


1
在大多数情况下,您仍然需要在GUI中重复操作,例如将最大长度、大小或任何其他可视化值限制为与验证使用的相同值。 - djmj
@David Waters,Bean验证和JSF验证是在同一个生命周期中还是在不同的生命周期中进行的?我的意思是JSF验证是否在Bean验证之前进行?JSF验证是否在客户端进行? - Mahmoud Saleh
@MahmoudSaleh - 你好,Mahmoud,我可以建议你把你的问题作为一个问题而不是一个评论来问,这样你会得到更好的反应和来自更广泛的人的答案。 - David Waters

4

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


2

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

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


Bean验证和JSF验证是否在同一个生命周期中发生,还是在不同的生命周期中发生?我的意思是JSF验证是否在Bean验证之前发生?JSF验证是否在客户端进行? - Mahmoud Saleh

1

@user1730904,您可以按照Bean Validation规范文档中的说明在资源束文件中定义消息。所需步骤如下:

  1. 在某个classpath文件夹(例如 src/main/resources/)中创建一个名为ValidationMessages_xx_XX.properties的文件。其中xx_XXes_ESen_US等。其中内容可以是:field.message=数字位数必须小于等于{max}。
  2. 然后在bean属性注释中使用该值:@Size(max = 20, message="{field.message}")

-1

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

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

因为“编译常量只能是基本类型和字符串”。虽然有一些解决方案来定义常量消息,但那看起来会很丑陋。


你可以使用Omnifaces和Deltaspike的自定义Bundle解析器来实现。 - Kukeltje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接