使用 myEclipse 的 JEE 6/WebSphere 8.5 中的 REST 资源 FileNotFoundException

REST Resource FileNotFoundException in JEE 6 / WebSphere 8.5 using myEclipse

我使用 myEclipse IDE 在 WebSphere 8.5.5.5 服务器上部署了两个小型 JEE 6 Web 应用程序。两者都包含 1 个简单的 REST 端点。端点在其中一个上工作,而不在另一个上工作。我正在使用与 WAS 8.5 捆绑在一起的 JAX-RS 的固有 Wink 实现。这是我在第二个应用程序上收到的错误:

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)

这是第一个具有工作端点的应用程序的两个 class 文件:

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";
    }
}

我的 class 工作应用程序的路径如下所示:

<?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>

上面returns"Hello, it works"的工作端点是:

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

这是端点不起作用的第二个应用程序的两个 class 文件:

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!!";
}

非工作应用程序的class路径如下所示:

<?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>

returns 错误的端点是:

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>

现在,我的一位同事建议问题一定是第二个应用程序看不到 JEE 6 jar,这是有道理的。但我似乎无法弄清楚这是怎么回事。

如果需要,我很乐意提供更多信息。另外,我知道其他问题中提到了具体错误,但我已经搜索了这些问题并尝试了这些方法但无济于事。因此我发布了一个新问题,因为看起来根本原因不同。

非常感谢!

第一个 class 缺少其包声明,大概是剪切和粘贴问题。但是,最后一个 class、TrymeResource 缺少 MediaTypeResponse 类型的导入. getTryMe 方法被声明为 return 一个 Response 类型,但你试图 return 一个 String 类型。这将显示为 validation/compilation 错误,因此不会生成或部署此类 class。

首先,我很抱歉。这里的实际问题是我最初忽略在上面的代码片段中包含的内容:

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

我现在已经进行了编辑,它出现在上面。

很明显,MdrApplication class 不能很好地处理 slf4j 记录器的实例化。我的字面意思是 instantiation 而已。我实际上根本没有在 class 中使用记录器...只是实例化它。删除上面的那一行允许其余端点正常工作。

如果有人对 为什么 可能导致此问题有任何见解,那就太好了,但至少实际问题已经解决。


更新: slf4j 记录器的问题是由于与 WebSphere 捆绑的固有 slf4j jar 存在明显的冲突。显然,WebSphere 版本足以通过 Eclipse 进行编译,但在运行时未找到或导致问题,实例化记录器时的错误证明了这一点。我发现这个是因为当我试图将记录器包含在我的资源 class 中时,我也 运行 遇到了其他奇怪的问题。解决这个问题的方法是在我的 WEB-INF/lib 文件夹中实际添加 slf4j-api-1.7.12.jar 。 (我也将我的 WebSphere classloader 设置为 parent last 以获得它的价值,尽管如果没有 lib 文件夹中的 jar,这两种设置都不起作用。)所以虽然实际原因仍然有点未知,但至少它更多比以前完全知道。如果您有更多信息,请随时权衡 jar 冲突问题!


再次为没有早点发布该行表示歉意...我从来没有想过这可能是问题所在。将来...我将发布 行代码!

希望这对某人有所帮助。