当前位置: 首页 > 面试题库 >

Bean验证@ NotNull,@ NotBlank和@NotEmpty在JSF + Tomcat中不起作用

慕震博
2023-03-14
问题内容

我在JSF托管bean中使用了Hibernate
Validation批注。当我使用时@NotNull@NotBlank或者@NotEmpty它们似乎没有以任何方式被触发。

@NotBlank(message = "{name.required}")
public String name;

视图:

<h:outputLabel value="Name:" /> 
<h:inputText id="name" value="#{person.name}" size="20" />
<h:message for="name" style="color:red" />

这是怎么引起的,我该如何解决?


问题答案:

介绍

由于您未对使用的是哪个容器的问题发表评论,因此我在您的问题历史记录中进行了了解,以了解所有使用的容器。到目前为止,我只找到了Tomcat。因此,对于这个答案,我将假设您确实使用了我最初在发布评论时所猜测的Tomcat。

确保安装所有JAR

Tomcat并未附带任何JSR303 Bean验证API
/实现。您需要自己下载并安装。您可以编译这些批注,这意味着您已正确将hibernate- validator.jar文件删除了(名称可能因版本而异)在/WEB- INF/libwebapp文件夹中。这些注释反过来似乎没有任何作用,仅意味着您没有阅读readme.txt和/或忘记从/lib/requiredHibernate
Validator库zip / tgz文件的文件夹中添加JAR :slf4j-api.jarvalidation- api.jar。为了使注释真正起作用,最后一个是强制性的。因此,要使Hibernate
Validator在Tomcat中工作,您需要在webapp的以下JAR /WEB-INF/lib

  • validation-api.jar (包含抽象API和注释扫描器)
  • hibernate-validator.jar (包含具体实现)
  • slf4j-api.jar (只是为了使其记录器也能正常工作)

这种方式@NotBlank@NotEmpty必须工作。该@NotNull值得特别关注;
由于HTTP请求参数的性质,默认情况下,即从客户端(Web浏览器)将空输入字段作为空字符串接收。空字符串与并不相同null,因此@NotNull默认情况下不会插入任何字符串。但是null,只需将以下上下文参数添加到,JS​​F就可以配置为解释它们web.xml

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

这种方式也@NotNull必须工作。

BV有效,但仅空字段无效

如果它 仍然
不起作用(即3个注释中的任何一个都不起作用,但是其他注释(@Size(min=5)最小长度为5)可以正常工作),那么web.xml很有可能您还具有以下上下文参数:

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>false</param-value>
</context-param>

然后,您应该将其删除(默认为auto,即仅当在运行时类路径中找到JSR303 Bean验证API时)或将其设置为true

BV根本不起作用

当BV实际上什么都不起作用@Size@Pattern,,等也不起作用,那么您应该验证您的表单中是否
没有 以下内容:

<f:validateBean disabled="true" />

然后,您应该将其删除(默认情况下将自动踢入)或进行设置disabled="false"

确保使用最新的Mojarra

如果BV _仍然_无法正常工作,请确认您是否未使用2.2.3和2.2.6之间的旧版Mojarra。这些版本有一个类加载委托错误,导致在Tomcat和克隆上的Bean验证完全不可见。据报道,这是Mojarra问题3183,已在Mojarra2.2.7中修复。



 类似资料:
  • 问题内容: 我似乎找不到能够区分这三个注释之间区别的摘要。 问题答案: :CharSequence,Collection,Map或Array对象 不为null ,但 可以 为空。 :CharSequence,Collection,Map或Array对象不为null, 并且size > 0。 :字符串不为null ,并且修剪后的长度大于零 。 为了帮助您理解,让我们研究一下如何定义和执行这些约束(我

  • 我正在使用JSF2(MyFaces2.2.9)和Bean验证(Hibernate Validator5.2.2.final)。 我在一个bean上使用@NotNull注释,它是我的托管bean的一个属性。 (ManagedBean类) (Bean类) 预先感谢您的回答。 注意:我真的希望坚持只由JSR303完成的验证,因为这样我就有了一种处理约束的统一方法。所以没有JSF验证器(我知道它可以做同样

  • 我正在使用Primefaces客户机bean验证,但它不起作用,错误消息消失,即使验证失败也会调用Listener。 示例-xhtml- 我正在使用-Primefaces 4 Jsf 2.2.6(mojarra)tomcat 7 请帮帮我。谢了。

  • 我尝试将JSF与Bean验证结合使用。基本上,一切正常,验证工作如预期,我得到了正确的消息,但我的Glassfish控制台上有一个例外: 如果我使用自定义约束和预定义约束,则会发生此异常。 这是我的示例代码。 示例实体: 自定义约束: 自定义验证器: 样品控制器: jsf页面示例: MyEntityFacade仅从实体管理器进行持久化调用。 如前所述,应用程序运行良好,正确的消息已显示,但我希望在

  • 我有一个使用SpringDataREST的非常简单的SpringBoot2.0.3项目。 当我尝试使用http:localhost:8080/users上的POST添加电子邮件地址无效的用户时,会返回以下JSON: 波姆。XML 用户应用。JAVA 使用者JAVA 用户存储库。JAVA 我在谷歌上搜索过,几年前似乎有很多相关的问题,我在这里尝试过建议的解决方案 但这些都不起作用。 我已经花了很多时

  • 我正在使用model属性来获取employee对象。xml文件包含hibernate验证器依赖项。