【问题标题】:bean-validation validation.xml ignoredbean-validation 验证.xml 被忽略
【发布时间】:2012-01-31 20:32:46
【问题描述】:

我在我的 JSF 2.0 Web 应用程序中使用 JSR 303 Bean 验证,它与注释一起工作得很好。现在我想忽略注释并使用 validation.xml 文件配置验证规则,所以这就是我所做的(我正在使用 eclipse 动态 Web 项目):

  1. WebContent/META-INF/validation.xml

    下添加了 validation.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <validation-config
    xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration validation-configuration-1.0.xsd"
    >
    
      <constraint-mapping>META-INF/validation/constraint-mapping.xml</constraint-mapping>
    
    </validation-config>
    
  2. 然后在WebContent/META-INF/validation/constraint-mapping.xml

    下创建文件constraint-mapping.xml
    <constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd"
                 xmlns="http://jboss.org/xml/ns/javax/validation/mapping">
    
    <bean class="my.full.path.ValidationMB" ignore-annotations="true">
    
    </bean>
    
    </constraint-mappings>
    

有了这些配置,我想我的 bean 类 ValidationMB 中的注释应该被忽略,但这没有发生!,这让我假设验证.xml 文件没有被加载.

有什么想法吗?谢谢。

环境:

  1. Apache Tomcat 7.0.23
  2. javax.faces-2.1.4.jar
  3. hibernate-validator-4.2.0.Final.jar
  4. hibernate-validator-annotation-processor-4.2.0.Final.jar
  5. 验证-api-1.0.0.GA.jar
  6. slf4j-api-1.6.1.jar

来自规范:第 4.4.6 节。 XML 配置:META-INF/validation.xml

除非通过调用显式忽略 Configuration.ignoreXMLConfiguration(),一个Configuration接受 记下 META-INF/validation.xml 中可用的配置。这 配置文件是可选的,但可以由应用程序使用 改进一些 Bean Validation 行为。如果不止一个 在类路径中找到 META-INF/validation.xml 文件,一个 引发了 ValidationException。

【问题讨论】:

  • 我尝试将validation.xml 放在任何地方,但它仍然对我不起作用。除了这里写的,你还发现了什么?

标签: jsf-2 bean-validation


【解决方案1】:

为了解决我的问题,我必须在项目 src 文件夹下创建一个 META-INF 文件夹,该文件夹以 WEB-INF/classes/META-INF 结尾。

web应用的结构是:

ROOT
|_META-INF -- don't put validation.xml here
|_WEB-INF
    |__ classes
           |_META-INF
                |__validation.xml

但是我觉得如果我把我的web应用打包到一个jar文件中再用在另一个项目中可能不行,等我做完再告诉你。

【讨论】:

  • 我把它放在 'ROOT--META-INF' 下让它工作。
  • 正是我需要的答案。我把它放到 src -> main -> resources -> META-INF 和 mvn 处理其余的
【解决方案2】:

尝试把你的validation.xml直接放到WEB-INF/目录下。

【讨论】:

  • 试过了还是不行,bean验证的规范说META-INF/validation.xml
  • @OmarAlKababji 是的,规范是这么说的,但对我来说它并没有那么好用。我不得不把它放到我的 WEB-INF/ 目录中,但我无法解释为什么。尝试从类路径中删除您的 validation-api-1.0.0.GA.jar,也许您的应用程序中有冲突。
  • 这对我也不起作用,你用的是什么版本的tomcat,jsf?你把映射文件放在哪里?
  • 我在 WAS 8 上使用 JSF 2.0。我所有的配置文件都在 WEB-INF 中,因此可以在 classes/ 文件夹中找到,因为它位于类路径中。我猜您的应用程序正在您的类路径中寻找 META-INF/validation.xml,可能是因为某处的配置指定了它。
  • 在 WEB-INF 目录中拥有文件并不意味着您在运行时(至少在 eclipse 中)将它们放在 WEB-INF/classes 目录中。在 java 类 org.hibernate.validator.xml.ValidationXmlParser 中有一个常量变量,名为:VALIDATION_XML_FILE = "META-INF/validation.xml";所以在我看来,这个文件应该在 META-INF 下。
【解决方案3】:

我在寻找其他东西时偶然发现了这一点,但想向 OP 澄清正在发生的事情。实际上,您确实需要该文件存在于 META-INF/validation.xml 中;但是,这与类路径相关,这就是为什么当您将其放在 WEB-INF/classes/META-INF/validation.xml 下时它起作用的原因。

更简洁的方法是让文件为您放在那里。您的 Eclipse 项目应该已经以某种方式为您将源目录中的任何内容输出到 WEB-INF/classes,否则将不会运行任何内容。但有时它输出的内容有过滤器,因此它可能会排除某些内容。您可能需要检查您的 src 目录并确保它们没有排除项。

举个例子,如果你有一个 Maven war 项目,你所有的 java 源代码都会放在 src/main/java 中,而生成的类最终会放在 WEB-INF/classes 目录中。包含非源文件的 src/main/resources 也会发生相同的情况。当我希望 *.xml、*.properties 等最终出现在 WEB-INF/classes 中时,我将它们放在 src/main/resources 中。对于您的示例,我将有一个 src/main/resources/META-INF/validation.xml 文件。

希望这对遇到此问题并感到困惑的其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2014-03-08
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多