Можно ли выставлять классы JAX RS внутри jar, не объявляя их в подклассе web.xml / Application? - PullRequest
1 голос
/ 24 октября 2019

мы пытаемся создать проект .ear с веб-приложением, предоставляющим некоторые остальные API. Проект включает в себя «микро-банки», представляющие некоторую логику работы (аннотированная @Path), каждая банка содержит некоторый класс отдыха (аннотированный @Path). Приложение совместимо с Java EE 7 и развернуто на экземпляре WAS 9 , структурированный .ear следующий:

project.ear
|
|- META-INF
|    |- application.xml
|
|-lib
|    |- service1.jar                (with rest classes)
|    |              |- META-INF
|    |                      |- beans.xml
|    |              
|    |              
|    |
|    |- service2.jar  (with rest classes, same structure as service1.jar)
|    |   
|    |- core.jar      (with Application subclass, same structure as service1.jar)
|    
|    
|- app.war
|    |- classes (empty)
|    |- web.xml
|    |- beans.xml

web.xml в .war содержит ссылку на подкласс пользовательского приложения:

<servlet>
  <description>JAX-RS Tools Generated - Do not modify</description>
  <servlet-name>JAX-RS Servlet</servlet-name>
  <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
  <init-param>
    <param-name>javax.ws.rs.Application</param-name>
    <param-value>com.example.MyApplicationSubclass</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>


<servlet-mapping>
  <servlet-name>JAX-RS Servlet</servlet-name>
  <url-pattern>/resources/*</url-pattern>
</servlet-mapping>

И каждый bean.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
     http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
     bean-discovery-mode="all">
 </beans>

MyApplicationSubclass пусто, у него есть какой-либо переопределенный метод и аннотируется базовой @ApplicationPath аннотацией.

В других AS, таких как WebLogic и JBOSS, нет необходимости явного сервлетадекларация, все обнаруживается автоматически, но в WAS мы обнаружили следующие основные проблемы:

  1. Автоматическое обнаружение полностью отключено, классы @ApplicationPath и @Path не обнаруживаются автоматически.
  2. MyApplicationSubclass должен быть включен в web.xml .war
  3. Даже если MyApplicationSubclass объявлен в web.xml, остальные конечные точки не обнаруживаются автоматически
  4. Дажечерез отражение, из MyApplicationSubclass невозможно найти покойклассы npoint

Есть советы? Почему эта структура подходит для других AS? Связаны ли эти проблемы с Apache CXF?

ПРИМЕЧАНИЕ: Мы также попытались запустить приложение с родительской политикой последней загрузки, но проблема остается.

1 Ответ

0 голосов
/ 24 октября 2019

Скорее всего, проблема в том, что классы приложения не упакованы в WAR-файл. В соответствии с разделом 2.3.2 спецификации JAX-RS (я использую спецификацию JAX-RS 2.1, но я верю, что те же правила применяются в 2.0):

Упаковано приложение JAX-RSкак веб-приложение в .war-файле. Классы приложений упакованы в WEB-INF / classes или WEB-INF / lib, а необходимые библиотеки упакованы в WEB-INF / lib.

Похоже, WebSphere воспринимает эту строку более буквально, чем некоторые издругие серверы приложений, с которыми вы экспериментировали.

Итак, самое простое, наиболее надежное решение - это упаковать классы приложений JAX-RS в WEB-INF / классы WAR или в JAR в WEB-INF. Каталог / lib вместо каталога lib EAR.

Другой вариант (который я сам не проверял) может состоять в добавлении атрибута Class-Path: в файл манифеста WAR для явной ссылки на JAR-файлы, содержащие JAX-RS. application - iiuc, который должен поместить эти JAR-файлы в тот же путь к классам, что и остальная часть веб-модуля, что позволяет загружать его.

Третий вариант (также который я не тестировал) может заключаться в том, чтобы поместить приложениеклассы в общую библиотеку, а затем связать эту общую библиотеку с веб-модулем.

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

...