【问题标题】:servlet-class path in web.xmlweb.xml 中的 servlet 类路径
【发布时间】:2014-09-10 11:02:37
【问题描述】:

我正在关注http://www.vogella.com/tutorials/REST/article.html 教程。

我创建了名为“JerseyDemoProject”的项目(Dynamic web 项目),创建了一个名为“Package1”的包,并在这个包中编写了程序 Hello.java(教程中给出)。

我已将 web.xml 修改如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>JerseyDemoProject</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>HelloServlet</servlet-name>
    <servlet-class>Package1.Hello</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>Package1</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>


</web-app>

当我尝试“在服务器上运行”时,它给了我 404- 未找到错误。 我正在使用Tomcat服务器

你好类:

package Package1;


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

// Plain old Java Object it does not extend as class or implements 
// an interface

// The class registers its methods for the HTTP GET request using the @GET annotation. 
// Using the @Produces annotation, it defines that it can deliver several MIME types,
// text, XML and HTML. 

// The browser requests per default the HTML MIME type.

//Sets the path to base URL + /hello
@Path("/hello")
public class Hello {

  // This method is called if TEXT_PLAIN is request
  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String sayPlainTextHello() {
    return "Hello Jersey";
  }

  // This method is called if XML is request
  @GET
  @Produces(MediaType.TEXT_XML)
  public String sayXMLHello() {
    return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
  }

  // This method is called if HTML is request
  @GET
  @Produces(MediaType.TEXT_HTML)
  public String sayHtmlHello() {
    return "<html> " + "<title>" + "Hello Jersey" + "</title>"
        + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
  }

}

更新:

xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>JerseyDemoProject</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>HelloServlet</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
     <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
         <param-value>Package1</param-value>
      </init-param>

</servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>


</web-app>

类文件

@Path("/hello")
public class Hello {

  // This method is called if TEXT_PLAIN is request
  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String sayPlainTextHello() {
    return "Hello Jersey";
  }

  // This method is called if XML is request
  @GET
  @Produces(MediaType.TEXT_XML)
  public String sayXMLHello() {
    return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
  }

  // This method is called if HTML is request
  @GET
  @Path("/inhtmlform")
  @Produces(MediaType.TEXT_HTML)
  public String sayHtmlHello() {
    return "<html> " + "<title>" + "Hello Jersey" + "</title>"
        + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
  }

}

使用的网址

http://localhost:8080/JerseyDemoProject/rest/hello/inhtmlform

显示错误

HTTP Status 500 - Error instantiating servlet class com.sun.jersey.spi.container.servlet.ServletContainer

堆栈跟踪:

Exception:
javax.servlet.ServletException: Error instantiating servlet class com.sun.jersey.spi.container.servlet.ServletContainer
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Unknown Source)

Rootcause:

java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Unknown Source)

我在控制台中发现了一些警告

INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files (x86)\Java\jre7\bin;C:\windows\Sun\Java\bin;C:\windows\system32;C:\windows;C:/Program Files (x86)/Java/jre7/bin/client;C:/Program Files (x86)/Java/jre7/bin;C:/Program Files (x86)/Java/jre7/lib/i386;C:\product\11.2.0\client_1\bin;C:\Informatica\961_989\961_Install\java\jre\bin\server;C:\Informatica\961_989\961_Install\tools\odbcdrv;C:\Informatica\961_989\961_Install\tools\jdbcdrv;C:\Informatica\961_989\961_Install\tools\datadirect;C:\app\vpalagum\product\11.2.0\client_2\bin;C:\app\vpalagum\product\11.2.0\client_1;C:\Program Files (x86)\RSA SecurID Token Common;C:\Program Files\Common Files\Microsoft Shared\Microsoft Online Services;C:\Program Files (x86)\Common Files\Microsoft Shared\Microsoft Online Services;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Box\Box Edit\;C:\Program Files (x86)\Java\jdk7_u15\bin;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\Perforce;C:\Softwares\eclipse4.2;;.

WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:JerseyDemoProject' did not find a matching property.

【问题讨论】:

  • 你得到 404 的 URL 是什么?粘贴在服务器上运行时在浏览器上生成的 URL
  • 我是从eclipse运行的。右键“Hello.java”->在服务器上运行
  • 您需要右键单击您的项目并在服务器而不是您的 java 文件上运行它吗?运行它,看看问题是否仍然存在,将 URL 粘贴到此处
  • 我也试过了。网址是localhost:8080/JerseyDemoProject

标签: java xml rest servlets jersey


【解决方案1】:

因为指定的url模式是

<url-pattern>/rest/*</url-pattern>

而且你的servlet标签应该是这样的

<servlet>
  <servlet-name>HelloServlet</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
     <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
         <param-value>Package1</param-value>
      </init-param>
</servlet>

你可以在你的资源方法中指定额外的路径来单独调用它

    @Path("/hello")
    public class Hello {

    @GET
    @Path("/intextform")
    @Produces(MediaType.TEXT_PLAIN)
    public String helloWorld(){
        return "Hello from Jersey!";

       }
   }

然后右键项目并在服务器上运行

试试这个网址

http://localhost:8080/JerseyDemoProject/rest/hello/intextform

【讨论】:

  • 你做了我在答案中指定的任何事情并添加了映射路径
  • 完全限定的包名是什么意思?
  • 在服务器上运行后在servlet顶部指定的包的名称访问资源方法上方的路径注释指定的路径
  • 所以在我的情况下,完全限定的包名将是“Package1”。对吗?
  • 我们如何知道您没有发布您的课程,无论您需要指定哪个课程
【解决方案2】:

问题不在于 Jersey 2.1,问题在于您的 servlet 类。 您应该在 web.xml 中使用以下 servlet 类(适用于所有 Jersey 2.x 应用程序)

<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

而不是:

<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

那么一切都会好起来的。

最后,你的 servlet 应该是:

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>    
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>Package1</param-value>
    </init-param>
</servlet>

【讨论】:

    【解决方案3】:

    首先请将您的 web.xml 中的 &lt;servlet-class&gt;Package1.Hello&lt;/servlet-class&gt; 替换为 &lt;servlet-class&gt;com.sun.jersey.spi.container.servlet.ServletContainer&lt;/servlet-cl‌​ass&gt; 并重新运行应用程序

    请尝试以下网址,它应该可以工作:

    http://localhost:8080/JerseyDemoProject/Package1/rest/hello
    

    前提是您已将控制器映射到@PATH("/hello")

    【讨论】:

      【解决方案4】:

      我认为问题是因为我使用的是 jersey 2.1。我删除了它,从 https://jersey.java.net/download.html 安装了 Jersey 1.18 JARbundle。我在我的 WEB-INF lib 文件夹中添加了这个 jar,并且还在这个文件夹中添加了 asm.jar。 (这个 jar 可以在从同一站点下载的 Jersey1.18 Zip 包中找到)。然后按照@SparkOn 的回答。它奏效了!

      【讨论】:

        猜你喜欢
        • 2014-05-24
        • 1970-01-01
        • 2010-09-20
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 2018-01-24
        相关资源
        最近更新 更多