У меня есть два небольших веб-приложения 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>
Рабочая конечная точка, которая возвращает "Здравствуйте, работает" выше:
Вот два файла классов второго приложения, конечная точка которого не работает:
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>
Один из моих коллег предположил, что проблема должна заключаться в том, что второе приложение не может видеть jar-файлы 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 . Это будет отображаться как ошибка проверки / компиляции, и поэтому такой класс не будет создан или развернут.
Похожие вопросы
Новые вопросы
rest
REST (Transfer State Transfer) - это стиль архитектуры программного обеспечения для распределенных гипермедиа систем, таких как World Wide Web. Его популярность возросла по сравнению с архитектурами RPC, такими как SOAP, из-за внутренней разобщенности клиента с сервером, возникающей из-за наличия единого интерфейса между гетерогенными системами.