Ресурс 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>

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

HTTP: // локальный: 9081 / hellosvc / тест-услуги / привет

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

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: // локальный: 9081 / MDR / ресурсы / 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>

Теперь один из моих коллег предположил, что проблема заключается в том, что второе приложение не может видеть банки 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. Это будет отображаться как ошибка проверки / компиляции, поэтому такой класс не будет создан или развернут.

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