Wildfly 15 и Jersey - Попытка зарегистрировать несколько локаторов услуг в одном приложении локатора услуг - PullRequest
3 голосов
/ 21 марта 2019

Мы расследуем перемещение приложения, в настоящее время работающего над Weblogic, на Wildfly 15.0.1.Final.

Наш проект - это ухо, которое содержит несколько войн, две из которых используют Джерси (2.27) для спокойных веб-сервисов. Это война «api» и война «web», конечные точки которой доступны соответственно в «host_name / application / api /» и «host_name / application / web /».

В настоящее время мы добавляем наши библиотеки jersey в папку lib на ухе, используя оператор gradle 'earlib', в то время как в наших войнах используется 'connectedCompile'. Чтобы мы могли продолжить использовать эту настройку, мы удалили jax-rs из нашего standalone.xml.

Если я удаляю одну из этих войн из развертывания, она развертывается нормально, и веб-службы работают как положено. Однако, если я попытаюсь развернуть оба, мы получим сообщение об ошибке Trying to register multiple service locators into single service locator application. Полная трассировка стека приведена ниже, и я включил наши файлы web.xml для двух рассматриваемых войн.

Любые предложения о том, как обойти эту проблему? Я был бы рад предоставить любые другие фрагменты кода или информацию, которая может быть полезна.

Приветствия

StackTrace:

17:14:15,716 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 68) MSC000001: Failed to start service jboss.deployment.subunit."application-core.ear"."application-api.war".undertow-deployment: org.jboss.msc.service.StartException in service jboss.deployment.subunit."application-core.ear"."application-api.war".undertow-deployment: javax.ws.rs.WebApplicationException: Trying to register multiple service locators into single service locator application.  
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:81)  
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)  
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)  
at java.util.concurrent.FutureTask.run(FutureTask.java)  
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)  
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)  
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)  
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)  
at java.lang.Thread.run(Thread.java:748)  
at org.jboss.threads.JBossThread.run(JBossThread.java:485)  
Caused by: javax.ws.rs.WebApplicationException: Trying to register multiple service locators into single service locator application.  
at org.glassfish.jersey.ext.cdi1x.internal.SingleInjectionManagerStore.registerInjectionManager(SingleInjectionManagerStore.java:64)  
at org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.addInjectionManager(CdiComponentProvider.java:778)  
at org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.initialize(CdiComponentProvider.java:197)  
at org.glassfish.jersey.server.ComponentProviderConfigurator.lambda$null$0(ComponentProviderConfigurator.java:79)  
at java.util.stream.ReferencePipeline$11$1.accept(ReferencePipeline.java:372)  
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)  
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)  
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)  
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)  
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)  
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)  
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)  
at org.glassfish.jersey.server.ComponentProviderConfigurator.lambda$init$1(ComponentProviderConfigurator.java:80)  
at org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:341)  
at org.glassfish.jersey.server.ApplicationConfigurator.createApplication(ApplicationConfigurator.java:122)  
at org.glassfish.jersey.server.ApplicationConfigurator.init(ApplicationConfigurator.java:96)  
at org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$0(ApplicationHandler.java:313)  
at java.util.Arrays$ArrayList.forEach(Arrays.java:3880)  
at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:313)  
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:282)  
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:335)  
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:178)  
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:370)  
at javax.servlet.GenericServlet.init(GenericServlet.java:244)  
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)  
at org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:78)  
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103)  
at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:303)  
at io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:143)  
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:583)  
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:554)  
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)  
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)  
at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)  
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)  
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)  
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)  
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)  
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)  
at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:596)  
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:97)  
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:78)  
... 9 more  


17:14:18,429 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 1) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "application-core.ear")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.subunit.\"application-core.ear\".\"application-api.war\".undertow-deployment" => "javax.ws.rs.WebApplicationException: Trying to register multiple service locators into single service locator application.  
    Caused by: javax.ws.rs.WebApplicationException: Trying to register multiple service locators into single service locator application."}}  
17:14:18,429 ERROR [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0021: Deploy of deployment "application-core.ear" was rolled back with the following failure message:   
{"WFLYCTL0080: Failed services" => {"jboss.deployment.subunit.\"application-core.ear\".\"application-api.war\".undertow-deployment" => "javax.ws.rs.WebApplicationException: Trying to register multiple service locators into single service locator application.  
    Caused by: javax.ws.rs.WebApplicationException: Trying to register multiple service locators into single service locator application."}}  
[2019-03-20 05:14:18,850] Artifact application-core.ear: Error during artifact deployment. See server log for details.  
[2019-03-20 05:14:18,850] Artifact application-core.ear: java.lang.Exception: {"WFLYCTL0080: Failed services" => {"jboss.deployment.subunit.\"application-core.ear\".\"application-api.war\".undertow-deployment" => "javax.ws.rs.WebApplicationException: Trying to register multiple service locators into single service locator application.  
    Caused by: javax.ws.rs.WebApplicationException: Trying to register multiple service locators into single service locator application."}}  

API web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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/web-app_2_5.xsd" version="2.5">


  <display-name>Application REST API</display-name>


  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  ...
  <servlet>
    <display-name>REST API</display-name>
    <servlet-name>ApplicationApiApp</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>com.test.application.core.apiservice.api.app.ApplicationApiApp</param-value>
    </init-param>
    <!-- Register resources and providers under  "infrastructure" package. -->
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>
        io.swagger.v3.jaxrs2.integration.resources, com.test.application.core.apiservice.api.infrastructure
      </param-value>
    </init-param>
    <init-param>
      <param-name>openApi.configuration.prettyPrint</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.classnames</param-name>
      <param-value>
      org.glassfish.jersey.jackson.JacksonFeature;org.glassfish.jersey.media.multipart.MultiPartFeature
      </param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.monitoring.statistics.enabled</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ApplicationApiApp</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

WEB web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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/web-app_2_5.xsd" version="2.5">


  <display-name>Application WEB</display-name>


  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  ...

  <servlet>
    <display-name>Application Web App</display-name>
    <servlet-name>ApplicationWebApp</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>com.test.application.web.app.ApplicationWebApp</param-value>
    </init-param>
    <!-- Register resources and providers under  "infrastructure" package. -->
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>
        io.swagger.v3.jaxrs2.integration.resources, com.test.application.web
      </param-value>
    </init-param>
    <init-param>
      <param-name>openApi.configuration.prettyPrint</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.classnames</param-name>
      <param-value>
      org.glassfish.jersey.jackson.JacksonFeature;org.glassfish.jersey.media.multipart.MultiPartFeature
      </param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.monitoring.statistics.enabled</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ApplicationWebApp</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

1 Ответ

1 голос
/ 21 марта 2019

По умолчанию на Джерси используется *Single*InjectionManagerStore:

/**
 * Default {@link InjectionManagerStore injection manager} that assumes only one
 * {@link InjectionManager injection manager} per application is used.
 */

. Вы можете переключиться на альтернативное значение, создав плоский файл "org.glassfish.jersey.ext.cdi1x.internal.spi.InjectionManagerStore"помещен под МЕТА-ИНФ / услуги.Этот файл должен содержать одну строку с именем класса выбранного impl.Возможно, вы могли бы попытаться использовать 'ServletInjectionManagerStore' one.

См. Полный пример здесь .

Обратите также внимание на комментарии: " Включено несколько приложений Джерси в пределаходин WAR / JVM": -)

Удачи

...