Использование веб-сервиса Jersey 2.x в Weblogic 12.1.1

Я пытаюсь развернуть веб-сервисы Jersey 2.13 в Weblogic 12.1.1. Эта версия weblogic соответствует спецификации JSR-311 JAX-RS 1.1, тогда как Jersey 2.x обеспечивает реализацию для JAX-RS 2.0.

У Oracle есть инструкция по обновлению версии JAX-RS RI на Джерси: http://docs.oracle.com/cd/E24329_01/web.1211/e24983/version.htm

Однако даже это не помогает решить все проблемы развертывания.

Я упаковываю заявку в EAR, содержащую WAR. Чтобы переопределить jar- файлы weblogic, я добавил следующий файл weblogic-application.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
  <prefer-application-packages>
    <!-- apis -->
    <package-name>javax.ws.rs.*</package-name>
    <!-- guava -->
    <package-name>com.google.common.*</package-name>
    <!-- jersey1 providers -->
    <package-name>com.sun.jersey.*</package-name>
    <!-- media providers -->
    <package-name>org.eclipse.persistence.jaxb.rs.*</package-name>
    <package-name>org.codehaus.jackson.jaxrs.*</package-name>
    <!-- wls -->
    <package-name>weblogic.jaxrs.api.client.*</package-name>
    <package-name>weblogic.jaxrs.internal.api.client.*</package-name>
    <package-name>weblogic.jaxrs.dispatch.*</package-name>
    <package-name>weblogic.jaxrs.monitoring.util.*</package-name>

   </prefer-application-packages>
</weblogic-application>

Эта конфигурация выдает мне следующее сообщение об ошибке при развертывании:

Caused By: java.lang.NoSuchMethodError: org.glassfish.hk2.api.ServiceLocatorFactory.create(Ljava/lang/String;Lorg/glassfish/hk2/api/ServiceLocator;Lorg/glassfish/hk2/extension/ServiceLocatorGenerator;Lorg/glassfish/hk2/api/ServiceLocatorFactory$CreatePolicy;)Lorg/glassfish/hk2/api/ServiceLocator;

Если я пытаюсь заменить классы org.glassfish.hk2. *, Добавив его в предпочитаемые пакеты приложений, я получаю новые ошибки, и это продолжается вечно...

Кто-нибудь мигрировал Джерси до версии 2.x на weblogic 12.1.1 или ниже?

Спасибо!

4 ответа

Решение

В конце концов оказалось, что вам на самом деле нужно заменить больше банок, чем предлагает Oracle. Вот как выглядит мой weblogic-application.xml:

 <prefer-application-packages>
    <package-name>com.sun.jersey.*</package-name>
    <package-name>org.glassfish.jersey.*</package-name>
    <package-name>org.glassfish.hk2.*</package-name>
    <package-name>org.jvnet.hk2.*</package-name>
    <package-name>jersey.repackaged.org.objectweb.asm.*</package-name>

    <package-name>com.sun.research.ws.wadl.*</package-name>
    <package-name>com.sun.ws.rs.ext.*</package-name>

    <package-name>org.codehaus.jackson.*</package-name>
    <package-name>com.fasterxml.jackson.*</package-name>

    <package-name>org.codehaus.jettison.*</package-name>

    <package-name>javax.ws.rs.*</package-name>

    <package-name>org.objectweb.asm.*</package-name>

    <package-name>antlr.*</package-name>

  </prefer-application-packages>

Надеюсь, поможет.

Для тех, кто хотел бы использовать еще более новую версию Джерси (работает с 2.15 до 2.20, которая в настоящее время находится в версии SNAPSHOT), это еще одна версия weblogic.xml, Обратите внимание, что этот набор имен пакетов определяется одной зависимостью от

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
</dependency>

файл weblogic.xml (включает в себя также ресурсы, которые не описаны в ответе Андрея Бавта и даже в официальном документе):

<wls:container-descriptor>
    <wls:prefer-application-packages>
        <!-- jsr311 -->
        <wls:package-name>javax.ws.rs.*</wls:package-name>
        <!-- javassist -->
        <wls:package-name>javassist.*</wls:package-name>
        <!-- aop repackaged -->
        <wls:package-name>org.aopalliance.*</wls:package-name>

        <!-- jersey 2 -->
        <wls:package-name>jersey.repackaged.*</wls:package-name>
        <wls:package-name>org.glassfish.jersey.*</wls:package-name>
        <wls:package-name>com.sun.research.ws.wadl.*</wls:package-name>

        <!-- hk2 -->
        <wls:package-name>org.glassfish.hk2.*</wls:package-name>
        <wls:package-name>org.jvnet.hk2.*</wls:package-name>
        <wls:package-name>org.jvnet.tiger_types.*</wls:package-name>
    </wls:prefer-application-packages>

    <wls:prefer-application-resources>
        <wls:resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</wls:resource-name>
        <wls:resource-name>META-INF/services/javax.ws.rs.ext.RuntimeDelegate</wls:resource-name>

        <!-- jersey -->
        <wls:resource-name>META-INF/services/org.glassfish.jersey.*</wls:resource-name>
        <wls:resource-name>org.glassfish.jersey.*</wls:resource-name>
        <wls:resource-name>jersey.repackaged.*</wls:resource-name>

        <!-- hk2 -->
        <wls:resource-name>META-INF/services/org.glassfish.hk2.*</wls:resource-name>
    </wls:prefer-application-resources>
</wls:container-descriptor>

Протестировано с Weblogic 12.2.1

У меня была такая же проблема, когда я обновил свой Джерси до 2.22.

Weblogic 12.1.3 использует версию Джерси 1.18. Чтобы перейти на другую, вы можете развернуть Jersey 2.x как библиотеку в Weblogic и предоставить к ней общий доступ с вашими приложениями или настроить Weblogic для использования Jersey из вашего приложения с помощью weblogic.xml.

В моем случае я выбираю второй вариант:

weblogic.xml:

<prefer-application-packages>
    <package-name>javax.ws.rs.*</package-name>
    <package-name>com.sun.jersey.*</package-name>
    <package-name>org.glassfish.*</package-name>
    <package-name>org.jvnet.hk2.*</package-name>
    <package-name>jersey.repackaged.org.objectweb.asm.*</package-name>
</prefer-application-packages>

Я создал простой проект maven для создания файла war с общей библиотекой jersey 2.19 для weblogic.
Вы можете клонировать отсюда weblogic-jax-rs
После клонирования беги mvn package произвести войну, а затем развернуть ее на сервере

Начиная с weblogic 12.2.1 - с ним связан джерси 2.21.1, поэтому никаких дополнительных установок не требуется.

WebLogic 12.2.1.1 поставляется с Джерси 2.22.1

Другие вопросы по тегам