Bean验证与JSF验证

Bean验证与JSF验证,jsf,jakarta-ee,Jsf,Jakarta Ee,在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 max

在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文件时,很难“一目了然”地看到页面上发生了什么


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

我希望在ManagedBean上进行验证,这将从JSF中删除逻辑,并在模型视图控制器中查看。并且应该让JSF负责显示模型。
在托管bean上也有这样的功能可以确保在任何时候都会应用更新的验证。这更干燥(不要重复你自己)

Richfaces允许您一起使用它们。请参阅(以及
beanValidator


这些标记表示:“基于
javax.validation
(或Hibernate validator)规则应用JSF验证”。

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

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

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

因为“编译常量只能是原语和字符串”。有一些方法可以定义常量消息,但这看起来很难看。

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

  • 在某些类路径文件夹(例如
    src/main/resources/
    )中创建一个名为
    ValidationMessages\u xx\u xx.properties
    的文件。其中
    xx_xx
    es_es
    en_US
    ,等等。其中内容可以是:
    field.message=位数必须小于或等于{max}。
  • 然后使用bean属性注释中的值:
    @Size(max=20,message=“{field.message}”)

  • 但在大多数情况下,您必须在gui中重复,例如将maxlength或size或任何其他visal值限制为验证中使用的相同值。@David Waters,bean验证和jsf验证是在同一生命周期中还是在不同的生命周期中进行的,我的意思是jsf验证是在bean验证之前进行的吗?jsf验证是在客户端进行的吗?@MahmoudSaleh-嗨,Mahmoud,我建议你把问题作为一个问题而不是一个评论来提问,你会从更广泛的人群中得到更好的反应和答案。bean验证和jsf验证是在同一个生命周期还是在不同的生命周期中进行的,我的意思是jsf验证发生在bean验证之前吗?jsf验证是否发生在客户端?您可以使用omnifaces和来自deltaspike的自定义包解析器进行验证