Автоматическая регистрация Jax-RS в Weblogic 12.2.1 при добавлении артефакта eclipselink

Я наблюдал очень странное поведение на последнем сервере Weblogic, версия 12.2.1.2. Когда в ваше приложение Java-сервлета добавляется зависимость eclipselink, сервер Weblogic автоматически запускает службу REST Jax-RS Jersey по пути /resources/*.

Чтобы устранить любые сомнения, я создал очень простой файл войны helloworld. Образец файла войны можно создать, следуя инструкциям на этой странице ( http://geekabyte.blogspot.com/2015/07/how-to-create-war-files-with-intellij.html)

Если вы следовали приведенным выше инструкциям, в основном единственная зависимость

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

И Helloworld как единственный класс в приложении. Вы можете развернуть его на любом сервере, и он будет работать нормально.

Теперь вы добавляете еще одну зависимость в ваш файл maven pom. Это артефакт eclipselink, как вы можете видеть ниже:

    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.5.2</version>
    </dependency>

При развертывании файла war сервер регистрирует следующее:

<May 23, 2017, 2:42:47,343 PM MST> <Warning> <JAXRSIntegration> <BEA-2192511> 
<The list of resource packages: org.eclipse.persistence.jpa.rs.exceptions;org.eclipse.persistence.jpa.rs.resources;org.eclipse.persistence.jpa.rs.resources.unversioned> 

И вы увидите следующее из вашей консоли администратора Weblogic Автоматическая регистрация услуги JAX-RS / Jersey REST

Результатом этого является то, что если вы следуете соглашению и сохраняете все свои файлы javascript и css в каталоге / resources / path, вместо того, чтобы обслуживать эти статические файлы, сервер попытается обработать эти запросы через службу JAX-RS, которая в итоге возвращает 404 не найдено.

Я пробовал разные конфигурации: другой сервер, другую версию сервера Weblogic, Toplink вместо eclipselink, другую версию eclipselink и кучу других вещей, которые я не буду здесь упоминать, чтобы упростить его. Очевидно, у нас есть работающее приложение, работающее в предыдущей версии Weblogic, которое нам нужно для перехода на последнюю версию Weblogic. Потребовалось много дней, чтобы точно определить проблему с этой зависимостью. В любом случае, эта проблема существует только для Weblogic 12.2.* С eclipselink любой версии в качестве зависимости.

Мой очевидный вопрос ко всем: почему это происходит? Кто-нибудь сталкивался с такой же проблемой? Каково было ваше решение?

2 ответа

Решение

Просто чтобы прояснить мою ошибку и решение, у меня не было этой ошибки (/resources/* path) в Weblogic 12.2.1.2, но она была в 12.2.1.3, и я заметил этот новый путь /resoures/* после того, как моя организация получила он обновлен (до 12.2.1.3).

Так как в мою войну был включен eclipselink.jar, я попробовал предложение из "oracode", поэтому я определил сферу "предоставлено" в моем POM, затем я строю новую войну, но это не повлияло на результат. У меня все еще была проблема.

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.5.1</version>
  <scope>provided</scope>
</dependency>

Тем не менее, решение, которое работало для меня, было: добавить раздел init-param в мой web.xml.

В моей организации у нас есть N веб-сервисов, поэтому я начал сравнивать их, и я заметил, что у одного из этих сервисов (тот, который не работал с этим /resources/*) НЕ был явно указан раздел init-param, поэтому я добавил его и мой веб-сервис теперь работает нормально под / *.

<servlet>
  <servlet-name>jersey</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>com.xxxxxx.xxx.xxx.xxx</param-value>
  </init-param>   
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>jersey</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>  

Джерси просканирует аннотацию @Provider, чтобы определить, учитывает ли этот пакет остальные ресурсы или поставщика. Вам не нужно добавлять eclipse.jar в ваше веб-приложение, так как WLS уже имеет его в classpath.

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