У меня есть два небольших веб-приложения JEE 6, развернутых на сервере WebSphere 8.5.5.5 с использованием myEclipse IDE. Оба содержат по 1 простой конечной точке REST. Конечная точка работает с одним из них, а не с другим. Я использую встроенную реализацию Wink JAX-RS в комплекте с WAS 8.5. Вот ошибка, которую я получаю во втором приложении:

Exception:java.io.FileNotFoundException SourceId:com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters -IOE ProbeId:1044
java.io.FileNotFoundException: SRVE0190E: File not found: /resources/tryme
    at com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor._processEDR(DefaultExtensionProcessor.java:949)
    at com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor.processEDR(DefaultExtensionProcessor.java:930)
    at com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor.handleRequest(DefaultExtensionProcessor.java:484)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1114)

Вот два файла классов первого приложения, имеющего рабочую конечную точку:

package com.somewhere.jee6.hello;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("test-services")
public class HelloApplication extends Application {

}

package com.somewhere.jee6.hello.resource;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("/hello")
public class HelloResource {

    @GET
    public String check() {
        return "Hello, it works";
    }
}

Мой путь к классам для рабочего приложения выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="con" path="melibrary.com.genuitec.eclipse.j2eedt.core.MYECLIPSE_JAVAEE_6_CONTAINER"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
    <classpathentry kind="output" path="WebContent/WEB-INF/classes"/>
</classpath>

Рабочая конечная точка, которая возвращает "Здравствуйте, работает" выше:

http://localhost:9081/hellosvc/test-services/hello

Вот два файла классов второго приложения, конечная точка которого не работает:

package com.somewhere.mdr.rest;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; 

@ApplicationPath("resources")
public class MdrApplication extends Application {

   private static final Logger logger =
   LoggerFactory.getLogger(MdrApplication.class);
}

package com.somewhere.mdr.rest.resource;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/tryme")
public class TrymeResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String getTryMe() throws Exception {

     return "Hello, this doesn't work!!";
}

Путь к классам для неработающего приложения выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="con" path="melibrary.com.genuitec.eclipse.j2eedt.core.MYECLIPSE_JAVAEE_6_CONTAINER"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
    <classpathentry combineaccessrules="false" kind="src" path="/mdr-message"/>
    <classpathentry combineaccessrules="false" kind="src" path="/mbr-stub"/>
    <classpathentry combineaccessrules="false" kind="src" path="/mdr-config"/>
    <classpathentry kind="output" path="WebContent/WEB-INF/classes"/>
</classpath>

Конечная точка, которая возвращает ошибку:

http://localhost:9081/mdr/resources/tryme

Мой web.xml для обоих приложений выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    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_3_0.xsd">
  <display-name></display-name> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Один из моих коллег предположил, что проблема должна заключаться в том, что второе приложение не может видеть jar-файлы JEE 6, что имеет смысл. Но я не могу понять, как это происходит.

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

Большое спасибо!

0
risingTide 3 Май 2016 в 19:31

2 ответа

Лучший ответ

Прежде всего ... мои извинения. Фактическая проблема здесь заключалась в том, что я изначально не включил в приведенный выше фрагмент кода:

 private static final Logger logger =    
 LoggerFactory.getLogger(MdrApplication.class);

Я внес правку, и она отображается выше.

Таким образом, очевидно, что класс MdrApplication не очень хорошо работает с созданием экземпляра регистратора slf4j. И я буквально имею в виду только создание экземпляра . Я вообще-то не использую регистратор в классе ... просто создаю его экземпляр. Удаление этой единственной строки выше позволяет остальной конечной точке работать правильно.

Если у кого-то есть понимание, почему это могло вызвать эту проблему, было бы здорово, но, по крайней мере, реальная проблема была решена.


ОБНОВЛЕНИЕ: проблема с регистратором slf4j возникла из-за очевидного конфликта видов с внутренним jar-файлом slf4j, который поставляется вместе с WebSphere. По-видимому, версия WebSphere была достаточно хороша для компиляции через Eclipse, но либо не была найдена, либо вызывала проблемы во время выполнения, о чем свидетельствует ошибка при создании экземпляра регистратора. Я обнаружил это, потому что я также столкнулся с другими странными проблемами при попытке включить регистратор в свой класс ресурсов. Исправление состояло в том, чтобы фактически добавить slf4j-api-1.7.12.jar в мою папку WEB-INF / lib. (У меня также мой загрузчик классов WebSphere установлен на родительский последний, чего он стоит, хотя ни один из этих параметров не работает без jar в папке lib.) Итак, хотя фактическая причина все еще немного неизвестна, по крайней мере, она известна более полно, чем раньше. Если у вас есть дополнительная информация, не стесняйтесь взвесить вопрос о конфликте фляги!


Опять же, извиняюсь за то, что не опубликовал эту строку раньше ... мне никогда не приходило в голову, что это может быть проблемой. В будущем ... я буду публиковать каждую строчку кода!

Надеюсь, это кому-то поможет.

0
risingTide 5 Май 2016 в 13:58

В первом классе отсутствует оператор пакета, по-видимому, это проблема вырезания и вставки. Однако последний класс, TrymeResource , не имеет импорта для типов MediaType и Response . Метод getTryMe объявлен для возврата типа Response , но вы пытаетесь вернуть тип String . Это будет отображаться как ошибка проверки / компиляции, и поэтому такой класс не будет создан или развернут.

0
Tony Weddle 4 Май 2016 в 06:10