Jsf 2 忽略bean validation.xml

Jsf 2 忽略bean validation.xml,jsf-2,bean-validation,Jsf 2,Bean Validation,我在JSF2.0Web应用程序中使用JSR303bean验证,它可以很好地处理注释。现在我想忽略注释,并使用validation.xml文件配置验证规则,所以我就是这么做的(我使用的是eclipse动态web项目): 在WebContent/META-INF/validation.xml下添加了validation.xml <?xml version="1.0" encoding="UTF-8"?> <validation-config xmlns="http://jboss.

我在JSF2.0Web应用程序中使用JSR303bean验证,它可以很好地处理注释。现在我想忽略注释,并使用validation.xml文件配置验证规则,所以我就是这么做的(我使用的是eclipse动态web项目):

  • 在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>
    
    <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>
    
    
    META-INF/validation/constraint-mapping.xml
    
  • 然后在WebContent/META-INF/validation/constraint-mapping.xml下创建文件constraint-mapping.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>
    
    <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中的注释应该被忽略,但这不会发生,这使我假设validation.xml文件未加载

    有什么想法吗?谢谢

    环境:

  • ApacheTomcat 7.0.23
  • javax.faces-2.1.4.jar
  • hibernate-validator-4.2.0.Final.jar
  • hibernate-validator-annotation-processor-4.2.0.Final.jar
  • validation-api-1.0.0.GA.jar
  • slf4j-api-1.6.1.jar
  • 来自规范:第4.4.6节。XML配置:META-INF/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>
    
    <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>
    
    除非通过调用 ignoreXMLConfiguration(),该配置将 帐户META-INF/validation.xml中提供的配置。这 配置文件是可选的,但可由应用程序用于 优化一些Bean验证行为。如果不止一个 META-INF/validation.xml文件位于类路径中 引发ValidationException


    尝试将validation.xml直接放入WEB-INF/目录。

    为了解决我的问题,我必须在项目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文件中,并在另一个项目中重用它,那么它可能不会工作,我会在以后这样做时通知您。

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

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

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


    希望这能帮助其他遇到这种情况并感到困惑的人。

    尝试过这种方法,但没有效果,bean验证规范说META-INF/validation。xml@OmarAlKababji是的,说明书上是这么说的,但对我来说,它不起作用。我不得不把它放到我的WEB-INF/目录中,但我无法解释为什么。尝试从类路径中删除validation-api-1.0.0.GA.jar,可能您的应用程序中存在冲突。这对我也不起作用,您使用的是什么版本的tomcat、jsf?映射文件放在哪里?我正在WAS8上使用JSF2.0。我的所有配置文件都在WEB-INF中,因此可以在类/文件夹中找到,因为它位于类路径中。我猜您的应用程序正在类路径中寻找META-INF/validation.xml,可能是因为某个地方有一个配置指定了它。在WEB-INF目录中包含文件并不意味着在运行时(至少在eclipse中)将它们放在WEB-INF/classes目录中。在java类org.hibernate.validator.xml.ValidationXmlParser中有一个常量变量,名为:VALIDATION\u xml\u FILE=“META-INF/VALIDATION.xml”;所以我觉得这个文件应该在META-INF下,我试着把validation.xml放在任何地方,但它仍然不适合我。除了写在这里之外,你还发现了什么吗?我把它放在“ROOT--META-INF”下面,让它工作。这正是我需要的答案。我把它放到src->main->resources->META-INF中,剩下的由mvn处理