使用JAX-RS创建RESTful Web服务并将其部署到tomcat

时间:2013-12-07 14:43:29

标签: java web-services rest tomcat

我正在尝试使用JAX-RS创建和部署RESTful Web服务并将其部署到tomcat。我不想使用任何IDE。 在Tomcat中,我在webapps \

中有以下目录结构
notifire\WEB-INF\
                 |
                 ---> web.xml
                 |
                 ---> \classes/Notifier.class
                 |
                 ---> \lib\javax.ws.rs-api-2.0

我的web.xml包含:

<servlet>
<servlet-name>Web Service Servlet</servlet-name>
<servlet-class>javax.ws.rs.core.Application</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Web Service Servlet</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>

,类文件Notifier.class是从文件Notifier.java编译而来的。

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;

@Path("notifier")
public class Notifier {

    @Context
    private UriInfo context;

    @GET
    @Produces("text/html")
    public String getHTML() {

         return "<p></p>";
    }
}

当我尝试在http://localhost:8080/notifire/webservice/notifier访问Web服务时,出现以下错误:

  

- 输入例外报告

     

- 消息类javax.ws.rs.core.Application不是Servlet

     

- 说明服务器遇到内部错误,导致无法完成此请求。

感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

你的Servlet有一个错误的类。不确定为什么你不想使用IDE,但有一个maven原型会使用Jersey开发人员定义的相应类来为你布局项目结构。我的web.xml看起来像这样:

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.pluralsight</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/webapi/*</url-pattern>
</servlet-mapping>

我在本课程here中涵盖了所有这些内容。

答案 1 :(得分:1)

我也无法让这个工作。因为无论如何必须使用web.xml,让最安静的Web服务工作的最简单方法是忘记完全扩展javax.ws.rs.core.Application并在那里指定上下文路径。您仍然可以使用标准的jax-rs注释来声明实际的Web服务。

的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
  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"
  version="3.0"
>
  <servlet>
    <servlet-name>rest-test</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>com.domain.mypackage</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name> rest-test</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

两个值得注意的要点:

  1. 您需要在WAR文件中捆绑REST实现,因为servlet容器通常不包含一个。由于Jersey是JAX-RS的参考实现,因此我在上面的servlet-class元素中使用了它。如果需要,可以将其替换为Apache CXF实现。

  2. init-param元素告诉Jersey哪些软件包要搜索带有Web服务注释的Java文件。编辑此项以指向您的Web服务。请注意,如果您选择使用apache CXF而不是Jersey,则任何init-param元素中所需的内容都会有所不同。知道CXF的人请发布他们会发布的内容。

  3. 如果您正在使用Maven,只需在jersey-servlet文件的dependencies部分中向pom.xml添加依赖关系:

    <dependencies>
      <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-servlet</artifactId>
        <version>1.18.2</version>
      </dependency>
      ...
    </dependencies>
    

    在此之后,使用Java类中的标准JAX-RS注释直接声明Web服务:

    package com.domain.mypackage;
    import javax.ws.rs.Consumes;
    import javax.ws.rs.Produces;
    import javax.ws.rs.GET;
    import javax.ws.rs.MatrixParam;
    import javax.ws.rs.Path;
    
    // It's good practice to include a version number in the path so you can have
    // multiple versions deployed at once. That way consumers don't need to upgrade
    // right away if things are working for them.
    @Path("calc/1.0")
    public class CalculatorV1_0 {
      @GET
      @Consumes("text/plain")
      @Produces("text/plain")
      @Path("addTwoNumbers")
      public String add(@MatrixParam("firstNumber") int n1, @MatrixParam("secondNumber") int n2) {
        return String.valueOf(n1 + n2);
      }
    }
    

    这应该是你所需要的。如果您的Tomcat安装在端口8080上本地运行,并且您将WAR文件部署到上下文myContext,请转到

    http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3
    

    ...应该产生预期的结果(5)。

    干杯!

    *如果您知道如何在不使用web.xml的情况下将Jersey servlet添加到Tomcat中的上下文中,有人可以解释一下 - 可能是通过使用上下文或生命周期监听器?