【问题标题】:How to configure jax-rs web service web.xml properly如何正确配置 jax-rs web service web.xml
【发布时间】:2012-09-09 05:52:14
【问题描述】:

我正在尝试使用 jersey 框架实现一个 jax-rs Web 服务。我已经编写了 Web 服务,但我不完全理解 web.xml 标记的含义,所以我不知道我是否已正确配置它,但是当我尝试访问该服务时出现错误。这是网络服务:

package org.LMS.Controller;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path ("/test")
public class Test {
    private String name = "Worked";

    @GET
    @Produces (MediaType.APPLICATION_XHTML_XML)
    public String getTest ()
    {
        return name;
    }
}

我的 web.xml 是:

 <!-- Test web service mapping -->
  <servlet> 
    <display-name>Test</display-name>
    <servlet-name>Test</servlet-name>
    <servlet-class>org.LMS.Controller</servlet-class>
    <init-param>
        <param-name>org.LMS.Controller.Test</param-name>
        <param-value>eduscope</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>Test</servlet-name>
    <url-pattern>/test</url-pattern>
  </servlet-mapping>
<!--end Test web service mapping -->

这是我在尝试访问我的应用程序时遇到的错误: HTTP 状态 500 - 类型异常报告 留言

描述服务器遇到了一个内部错误(),导致它无法完成这个请求。

异常

javax.servlet.ServletException: Wrapper cannot find servlet class org.LMS.Controller or a class it depends on
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:679)
root cause

java.lang.ClassNotFoundException: org.LMS.Controller
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:679)

你们能告诉我我做错了什么,并解释一下 web.xml 文件中每个标签的含义与 Web 服务有什么关系吗

【问题讨论】:

    标签: java web-applications servlets jax-rs


    【解决方案1】:

    您设置了错误的 servlet。 假设您使用的是Jersey,您需要按如下方式指定您的 servlet:

    <servlet>
        <servlet-name>Rest</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>org.LMS.Controller.Test</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Rest</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    

    当你想访问它时,你使用以下网址

    http://(host)[:port]/(context path)/rest/test
    e.g. 
    http://localhost:8080/MyRestProject/rest/test
    

    【讨论】:

      【解决方案2】:

      要使用 jersey 配置 jax-rs webservice,您可以在 web.xml 上使用最简单的配置,只需 2 个配置(在 java 代码和注释中使用更多步骤),请按照以下步骤操作:

      1) 编写应用程序(Java 代码):

      package your.package.example;
      
      import java.util.HashSet;
      import java.util.Set;
      
      import javax.ws.rs.core.Application;
      
      public class ExampleApplication extends Application {
      
           public Set<Class<?>> getClasses() {
                 Set<Class<?>> s = new HashSet<Class<?>>();
      
                 // Annotated @Path endpoint
                 s.add(ExampleWebServiceRestClass.class); 
      
                 return s;
             }
      }
      

      2) 在您的 web.xml 中添加配置引用(对应用程序代码):

      <web-app>
      
          <servlet>
              <servlet-name>your.package.example.ExampleApplication
              </servlet-name>
      
              <init-param>
                  <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
                  <param-value>true</param-value>
              </init-param>
      
          </servlet>
          <servlet-mapping>
              <servlet-name>your.package.example.ExampleApplication
              </servlet-name>
              <url-pattern>/wspath/*</url-pattern>
          </servlet-mapping>
      </web-app>
      

      【讨论】:

        【解决方案3】:

        当我们当时配置 REST Web 服务时,

        需要设置 init-param 和 init-value 来扫描 Web 服务类实现,如下面的 Jersey Class 进行扫描:-

        <init-param>
           <param-name>com.sun.jersey.config.property.packages</param-name>
           <param-value>yourpackegeName</param-value>
        </init-param> 
        

        【讨论】:

          猜你喜欢
          • 2012-12-29
          • 2012-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-18
          相关资源
          最近更新 更多