Ресурс REST FileNotFoundException в JEE 6 / WebSphere 8.5 с использованием myEclipse
У меня есть два небольших веб-приложения JEE 6, развернутых на сервере WebSphere 8.5.5.5 с использованием IDE myEclipse. Оба содержат 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>
Рабочая конечная точка, которая возвращает "Здравствуйте, это работает" выше:
Вот два файла классов второго приложения, конечная точка которого не работает:
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>
Конечная точка, которая возвращает ошибку:
Мой 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>
Теперь один из моих коллег предположил, что проблема заключается в том, что второе приложение не может видеть банки JEE 6, что имеет смысл. Но я не могу понять, как это происходит.
Я был бы рад предоставить больше информации, если это необходимо. Кроме того, я знаю, что конкретная ошибка упоминается в других вопросах, но я искал эти вопросы и пробовал эти вещи безрезультатно. Поэтому я публикую новый вопрос, потому что кажется, что причина в другом.
Большое спасибо!
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.) Таким образом, хотя фактическая причина все еще немного неизвестна, по крайней мере, она более известна, чем раньше. Не стесняйтесь взвешивать проблему конфликта банок, если у вас есть больше информации!
Опять же, извиняюсь за то, что не разместил эту строку раньше... мне никогда не приходило в голову, что это может быть проблемой В будущем... я буду публиковать каждую строку кода!
Надеюсь, это кому-нибудь поможет.
В первом классе отсутствует оператор пакета, предположительно, это была проблема вырезания и вставки. Однако в последнем классе, TrymeResource, отсутствует импорт для типов MediaType и Response. Метод getTryMe объявлен как возвращающий тип Response, но вы пытаетесь вернуть тип String. Это будет отображаться как ошибка проверки / компиляции, поэтому такой класс не будет создан или развернут.