【问题标题】:Java rest API returns HTTP status 404Java REST API 返回 HTTP 状态 404
【发布时间】:2015-11-16 11:49:32
【问题描述】:

我有一个简单的 REST API 正在尝试运行,但它给了我一个 HTTP 404 错误。 AFAICS 看起来不错,但事实并非如此...... Tomcat 正在运行,我让 Eclipse 浏览器提供 HTTP404。 Tomcat 对它的所有错误都没有帮助,但它们都只是警告,但如果需要,我可以在这里弹出它们,但会使问题变得混乱。

我认为这与球衣格式、xml 或两者有关,但不确定。

*****更新了问题以包含 xml 更新和 tomcat 错误。******

我的课是这样的:

package WS;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

//annotations
@Path("/book")
public class Book{
    @GET
    @Produces(MediaType.TEXT_XML)
    public String sayHelloXML(){
        String response = "<?xml version='1.0'?><hello>Hello there</hello>";
        return response;
    }
}

我的 Xml 是这样的:(注意我认为我使用的是球衣 2.0,所以我不必在这里有任何东西吗?)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>RestApi</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>



  <servlet>
    <servlet-name>MyApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <!-- The package where your resource classes are -->
        <param-value>WS</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>MyApplication</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>
</web-app>

... 我导入的库是这样的:

严重:为 servlet MyApplication 分配异常 java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) 在 org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520) 在 org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501) 在 org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:120) 在 org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1095) 在 org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:817) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source)

当我点击http://localhost:8080/PK_WS/api/时,我返回浏览器时出错

javax.servlet.ServletException:实例化 servlet 类时出错 org.glassfish.jersey.servlet.ServletContainer org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(未知来源)

根本原因 java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(未知来源)

【问题讨论】:

  • 您在什么环境下部署它?您要访问的 URL 是什么?你的 tomcat 的输出在哪里?
  • Tomcat:将其添加到我的问题中。上下文 - 我不确定你的意思,但我正在使用浏览器进行测试,只是想要一个 hello world 回来
  • URL:我想访问任何 url 会给我在 olnly java 类/方法中编码的响应 - 书

标签: java web-services jersey-2.0


【解决方案1】:

在 web.xml 中这还不够。您仍然需要配置 Jersey,因为它是处理 JAX-RS 处理的运行时。您可以使用 web.xml 来完成

<servlet>
    <servlet-name>MyApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <!-- The package where your resource classes are -->
        <param-value>WS</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>MyApplication</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

或者没有 web.xml

@ApplicationPath("/api")
public class MyApplication extends ResourceConfig {
    public MyApplication() {
        packages("WS");
    }
}

使用这两个选项,/api 将是应用程序的 url 前缀。你可以改变它。

有关更多信息,请查看 Jersey 用户指南中的 Servlet Based Deployment

【讨论】:

  • 感谢您的回复...我应该测试什么本地网址? localhost:8080/PK_WS/api/book?
  • 我以localhost:8080/PK_WS/api/book 的身份提问,我能想到的每一个变化都只返回 http 404 错误,我认为我得到了一个 tomcat 空指针错误,我会发布它
  • 我看到很多与 Eclipse 没有将项目 jar 加载到服务器有关的问题,这太荒谬了。这就是问题所在。我停止使用 Eclipse,所以我无法帮助您。但是你可以尝试把所有的jar包放到WEB-INF/lib下。
  • 它们在 WEB-INF/lib 中并导入到属性等中的 java 构建路径中。
  • 看最后一张导入jar包的截图,看对不对?
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2014-03-05
  • 2013-12-28
  • 2014-02-08
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多