2

Я пытаюсь развернуть простое приложение загрузки весны, которое выведет некоторый отдых api, и я использую диспетчер сущности hibernate для управления объектами сущности. При попытке развернуть это приложение для Oracle WebLogic 12c, я получаю следующее исключение:Как решить NoSuchMethodError для javax.validation при развертывании приложения загрузки весны на сервере weblogic?

<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;

Я прошел через подобные вопросы об этой проблеме в переполнение стека (например, this, и, this), но решить эту проблему не удалось. Я пробовал настраивать зависимости от hibernate-validator и javax validation api, но это мало помогло. Вот некоторая соответствующая часть моего файла п:

<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: 12.1.3.0.0, работающая на Java7.

PS: Проект работает нормально в Tomcat 8.

+0

Я рекомендую вам снова очистить проект через maven, а также включить аннотации, если вы используете Spring. – Omoro

+0

@ Omoro, я попробовал mvn чистый пакет. Такая же ошибка. Что вы подразумеваете, добавляя аннотации? –

+0

Вы должны настроить проект Spring для использования аннотаций, например, добавив в xml-файл вашего контекстного контекста контекст: '...that, если вы используете аннотации. Кроме того, проверьте, есть ли у вас все необходимые зависимости, это исключение указывает на то, что вам не хватает какой-либо зависимости и проверка на степень, если метод, используемый вашим приложением, существует. – Omoro

ответ

7

Наконец-то я смог решить эту проблему. Я не знал о том, что если prefer-web-inf-classes отключен из консоли администратора Weblogic, то weblogic игнорирует директиву, указанную в файле weblogic.xml.

From Oracle's documentation:

The prefer-web-inf-classes element, if set to true, will cause classes located in the WEB-INF directory of a Web application to be loaded in preference to classes loaded in the application or system classloader. The default value is false. A value specified in the Administration Console will take precedence over a value set manually.

Таким образом, вместо того, я должен был указать предпочитать-приложения-пакеты в 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 был весьма полезным.

Спасибо всем, кто пытался помочь.

1

Я предполагаю, что Weblogic использует Bean Validation 1.0, который выравнивается с Hibernate Validator 4.x. Я не уверен, как заставить Weblogic использовать Bean Validation в комплекте с вашим приложением (возможно, это то, что вы пытаетесь сделать с prefer-web-inf-classes) или как обновить весь сервер приложений до проверки Bean 1.1. Если вы не используете проверку методов, вы можете попробовать использовать последнюю версию 4.x (4.3.2.Final). Затем вы удалили бы зависимость validation-api от pom (в любом случае будет втянута транзитно) или вы установите ее на 1.0.0.GA.

+0

Вы правы относительно wls, используя более старую версию проверки бобов.Я тоже об этом знал. Поэтому я пробовал с 4.3.2, и это тоже не сработало. С prefer-web-inf-классами я могу сказать, что wls использует мои библиотеки, а не связанные с ними. Обновление wls для меня не является вариантом. –

Смежные вопросы