【问题标题】:Bean Validation ( JSR 303 ) and Hibernate validation not triggers when inside an EARBean Validation (JSR 303) 和 Hibernate 验证在 EAR 内时不会触发
【发布时间】:2013-02-11 17:20:28
【问题描述】:

我缺少一些非常基本的东西(与 EAR 或 EAR 配置中的类加载有关)。我想不通,为什么我的 JSR 303 验证和 Hibernate 验证没有从 EAR 内部触发……如果我创建一个新的 WAR 项目,它确实会触发。

我正在 Weblogic Server 10.3 上使用 Maven、JSF 2.0、Open-JPA、EJB 3.0 建立一个新项目。我使用 Maven 原型创建了所有项目。我有一个最终的 EAR 版本,其结构如下:

  • 项目名称
    • ejb
    • 网络
    • 库
    • 元信息

在 Web 中,我有一个 login.xhtml 与 userName 和 Password 字段映射到 TestMPB 变量和 poms 具有依赖关系:validation-api 1.0.0.GA,hibernate-validator 4.2.0.Final…

页面支持 bean 的 (TestMPB) 变量具有 @Pattern 和 @NotEmpty 注释,但它们不会被 JSF 验证阶段触发。 JSF 验证工作正常,但我想使用 JSR 303 和 Hibernate 验证。

login.xhtml 包含以下提示行:

<h:messages layout="table" showDetail="false" showSummary="true"/>
<h:inputText class="textbox" id="userId" value="#{testMPB.userId}"></h:inputText>
<h:commandButton id="button" action="#{testMPB.login}" value="Login" ></h:commandButton>

TestMPB 包含:

@Pattern(regexp = "^(?=.*[a-zA-Z])[a-zA-Z0-9_]{2,15}\\s*$", message = "userId invalid")
@NotEmpty(message = "userId empty")
private String userId = "";

public String login(){ System.out.println("User Login ::"+getUserId());
    return "/web/ui/s/home/home.xhtml";
}

Application.xml 包含

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5">
<display-name>ear</display-name>
  <module>
    <web>
      <web-uri>web</web-uri>
      <context-root>/NewAccountsWeb</context-root>
    </web>
  </module>
  <module>
    <ejb>ejb</ejb>
  </module>
  <library-directory>lib</library-directory>
</application>

为了调试,我确定:

  • JSF 托管页面 bean (TestMPB) 在页面加载时初始化(通过在构造函数中添加 SOP)
  • 在提交页面时,调用该方法并打印 userName 值。
  • 在 POM 中添加的 JAR 依赖项是正确的,并且它们存在于最终的 EAR 构建中。
  • 当我创建 WAR 项目时,相同的 JSR 303 和 Hibernate 验证适用于同一组 login.xhtml 和 TestMPB.java。
  • 创建了阶段侦听器并打印了所有阶段以确保调用阶段。
  • 为了测试,我还添加了 JSF 验证 (required=true),它可以工作并在 h:message 中显示消息。

能想出什么办法来解决这个问题吗?

【问题讨论】:

  • 您能否展示 bean 验证 api 和 hibernate 验证器 jar 在您最后的耳朵中的最终位置?当在类路径上检测到 Bean Validation API 时,确实应该自动启用 Bean Validation。我的猜测是存在类加载问题。

标签: jakarta-ee jsf-2 bean-validation ear hibernate-validator


【解决方案1】:

我自己解决了这个问题...

我在我的项目类路径中添加了 slf4j-log4j12 1.6.4 jar 并且 bean 和 hibernate 字段级验证开始工作...... jboss-logging-3.1.0.GA.jar 也可能工作...... Log4j jar 已经在类路径中。

似乎,出于日志记录的目的,Hibernate Validator 使用了一些 Logging API,这是一个支持某些日志记录解决方案作为实现的抽象层。因此,如果您只是将受支持的日志库添加到类路径中,那么日志记录会将任何日志请求委托给该提供程序。

奇怪的是,我的服务器日志或编译时没有错误,Hibernate(或 Bean JSR 303)验证缺少日志依赖项......我浪费了 3 天时间,但很高兴它现在工作...

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 2015-01-10
    • 2015-12-19
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多