【问题标题】:How to solve NoSuchMethodError for javax.validation when deploying a spring boot application in weblogic server?在 weblogic 服务器中部署 spring boot 应用程序时如何解决 javax.validation 的 NoSuchMethodError?
【发布时间】:2016-04-15 18:51:01
【问题描述】:

我正在尝试部署一个简单的 Spring Boot 应用程序,该应用程序将公开一些 rest api,并且我使用 hibernate 实体管理器来操作实体对象。当我尝试将此应用程序部署到 Oracle Weblogic 12c 时,出现以下异常:

<Jan 11, 2016 6:20:14 PM BDT> <Error> <Console> <BEA-240003> <Administration Console encountered the following error: weblogic.application.ModuleException: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:216)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:211)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:73)
at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:24)
at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:729)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)
at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:258)
at weblogic.application.internal.SingleModuleDeployment.activate(SingleModuleDeployment.java:48)
at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165)
at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:80)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:587)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.activateDeployment(ActivateOperation.java:150)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doCommit(ActivateOperation.java:116)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.commit(AbstractOperation.java:339)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:846)
at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1275)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:442)
at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:176)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:195)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:13)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:68)
at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:548)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
Caused by: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:142)
at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at weblogic.validation.validator.ValidationProvider.invoke(ValidationProvider.java:75)
at weblogic.validation.validator.ValidationProvider.buildValidatorFactory(ValidationProvider.java:66)
at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:302)
.... rest of the stack trace has been omitted ....

简而言之,我得到了

java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;

我在堆栈溢出中遇到过类似的问题(如thisthis),但无法解决问题。我尝试调整对 hibernate-validator 和 javax 验证 api 的依赖关系,但没有太大帮助。这是我的 pom 文件的一些相关部分:

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.1.0.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.6.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.0.6.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.2.2.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator-annotation-processor</artifactId>
        <version>5.2.2.Final</version>
    </dependency>

还有我的 WEB-INF/weblogic.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://www.bea.com/ns/weblogic/90
              http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">

    <container-descriptor>
        <prefer-web-inf-classes>true</prefer-web-inf-classes>
        <show-archived-real-path-enabled>true</show-archived-real-path-enabled>
    </container-descriptor>

</weblogic-web-app>

目前我使用的唯一验证注解是@NotNull (javax.validation.constraints.NotNull)。 WebLogic Server 版本:在 Java7 上运行的 12.1.3.0.0。

PS:该项目在 Tomcat 8 中运行良好。

【问题讨论】:

  • 我建议您再次通过 maven 全新安装您的项目,如果您使用 Spring,请确保您启用了注释。
  • @Omoro,我试过 mvn clean package。同样的错误。启用注释是什么意思?
  • 您必须配置您的 Spring 项目以使用注释,例如,将其添加到您的应用程序上下文 xml 文件中,以下 &lt;context:annotation-config /&gt;...如果您正在使用注释。进一步检查您是否拥有所有必要的依赖项,该异常表明您缺少一些依赖项,如果您的应用程序使用的方法确实存在,请检查依赖关系。
  • @Omoro,我正在使用弹簧靴。这些配置是内置的。该项目在Tomcat中运行良好,只是无法在Weblogic中运行。

标签: spring-boot bean-validation weblogic12c hibernate-validator


【解决方案1】:

最后我能够解决问题。我不知道如果从 Weblogic 管理控制台禁用了 prefer-web-inf-classes,那么 weblogic 会忽略 weblogic.xml 文件中指定的指令。

From Oracle's documentation:

prefer-web-inf-classes 元素,如果设置为 true,将导致 Web 应用程序的 WEB-INF 目录中的类优先于应用程序或系统类加载器中加载的类进行加载。默认值为假。在管理控制台中指定的值将优先于手动设置的值。

因此,我不得不在 weblogic.xml 文件中指定首选应用程序包。这是文件的更新内容:

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    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/ejb-jar_3_0.xsd
    http://xmlns.oracle.com/weblogic/weblogic-web-app
    http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">

<wls:container-descriptor>
    <wls:prefer-application-packages>
        <package-name>org.springframework.*</package-name>
        <package-name>org.hibernate.*</package-name>
        <package-name>javax.validation.*</package-name>
        <package-name>javax.validation.spi.*</package-name>
        <package-name>org.slf4j.*</package-name>
    </wls:prefer-application-packages>
    <wls:show-archived-real-path-enabled>true</wls:show-archived-real-path-enabled>
</wls:container-descriptor>

</weblogic-web-app>

This stackoverflow post 很有帮助。

感谢所有尝试提供帮助的人。

【讨论】:

    【解决方案2】:

    我的猜测是 Weblogic 使用的是与 Hibernate Validator 4.x 一致的 Bean Validation 1.0。我不确定如何让 Weblogic 使用捆绑在您的应用程序中的 Bean Validation(也许这就是您尝试使用 prefer-web-inf-classes 做的事情)或如何将整个应用程序服务器升级到 Bean Validation 1.1。除非您使用方法验证,否则您可以尝试使用最新的 4.x 版本(4.3.2.Final)。然后,您将从 pom 中删除 validation-api 依赖项(无论如何都会被传递),或者将其设置为 1.0.0.GA

    【讨论】:

    • 您对 wls 使用旧版本的 bean 验证是正确的。我也意识到了这一点。所以我尝试了 4.3.2,但也没有用。使用 prefer-web-inf-classes,我可以告诉 wls 使用我的库,而不是捆绑的库。更新 wls 不是我的选择。
    【解决方案3】:

    在 wblogic-application 中添加以下内容

    <package-name>org.hibernate.*</package-name>
    <package-name>javax.validation.*</package-name>
    <package-name>javax.validation.spi.*</package-name>
    

    如果使用 Hibernate 5.x 及以上版本,请在 weblogic-application.xml 中添加以上内容

    谢谢,

    【讨论】:

    • 这对 WebSphere 有用吗?任何人都知道将这些配置文件名称和位置放入 WS 吗?
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2018-11-30
    • 2020-11-27
    • 2019-01-31
    相关资源
    最近更新 更多