Glassfish 3.1 — Клиенты CXF и Джерси, развернутые в одной войне?

#java #jersey #cxf #glassfish-3

#java #джерси #cxf #glassfish-3

Вопрос:

Я пытаюсь развернуть войну в Glassfish 3.1.1, которая использует клиентскую библиотеку веб-сервиса CXF и клиентскую библиотеку веб-сервиса Джерси. Чтобы заставить Glassfish использовать CXF вместо Metro в качестве реализации JAX-WS, я включаю glassfish-web.xml файл со следующим содержимым:

 <?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN' 
    'http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd'>

<glassfish-web-app>
    <!-- Need this to tell Glassfish not to load the JAX-WS RI classes so it will 
        use the CXF ones instead -->
    <class-loader delegate="false" />
</glassfish-web-app> 
  

Это приводит к нежелательным последствиям, вызывающим проблемы для моего клиента Джерси:

 2011 Oct 19 15:04:16,994 MDT [http-thread-pool-80(3)] ERROR my.company.MyServlet - Error testing JerseyClient
java.lang.NoSuchMethodError: com.sun.jersey.core.spi.component.ProviderServices.<init>(Ljava/lang/Class;Lcom/sun/jersey/core/spi/component/ProviderFactory;Ljava/util/Set;Ljava/util/Set;)V
        at com.sun.jersey.api.client.Client.init(Client.java:242)
        at com.sun.jersey.api.client.Client.access$000(Client.java:118)
        at com.sun.jersey.api.client.Client$1.f(Client.java:191)
        at com.sun.jersey.api.client.Client$1.f(Client.java:187)
        at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
        at com.sun.jersey.api.client.Client.<init>(Client.java:187)
        at com.sun.jersey.api.client.Client.<init>(Client.java:170)
        at com.sun.jersey.api.client.Client.create(Client.java:679)
        at my.company.MyJerseyClient.<init>(MyJerseyClient.java:93)
  

Поскольку библиотеки Джерси включены в войну (и не ожидается, что они будут предоставлены в Glassfish), я этого не понимаю.

Если я не включаю glassfish-web.xml файл, клиент Джерси работает нормально, но я получаю эту ошибку на клиенте CXF:

 2011-10-19T15:00:53.993-0600|WARNING|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=32;_ThreadName=Thread-2;|StandardWrapperValve[my-servlet]: PWC1406: Servlet.service() for servlet my-servlet threw exception
java.lang.ClassCastException: com.sun.xml.ws.client.sei.SEIStub cannot be cast to org.apache.cxf.frontend.ClientProxy
        at org.apache.cxf.frontend.ClientProxy.getClient(ClientProxy.java:93)
        at my.company.MyCXFClient.<init>(MyCXFClient.java:53)
  

Возможно ли заставить эти две библиотеки развертываться (и работать) в одной войне?

Ответ №1:

Это невозможно. Поскольку клиентская часть зависит от api jax-rs, и у вас не может быть двух разных реализаций jax-rs, используемых одним war, если вы полностью не изолируете их с помощью отдельных загрузчиков классов, поскольку сам api jax-rs указывает на реализацию (и не может указывать на две реализации) для некоторых заводских объектов.

ОБНОВЛЕНИЕ: Упс, я вижу, вы используете один для SOAP, а другой для REST. Это может сработать, но я не уверен. Попробуйте выполнить следующее:

  1. Убедитесь, что вы включили jersey-core.jar и в вашем военном досье тоже
  2. Установите свойство JVM в GF, как описано в главе Переопределение Джерси с файлами войны руководства пользователя Джерси

Комментарии:

1. Привет, извините за задержку с ответом; Я болел несколько дней. Моя война включает в себя jersey-core.jar и я попытался установить свойство JVM в моем Glassfish (как в конфигурации по умолчанию, так и в конфигурации сервера), и я получаю те же проблемы. Итак, я думаю, ответ заключается в том, что это невозможно.