使用JAX-RS创建RESTful Web服务并将其部署到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包含:

  Web Service Servlet javax.ws.rs.core.Application   Web Service Servlet /webservice/*  

并且类文件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 "

"; } }

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

–typeexception报告

–message类javax.ws.rs.core.Application不是Servlet

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

任何帮助表示赞赏。

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

  Jersey Web Application org.glassfish.jersey.servlet.ServletContainer  jersey.config.server.provider.packages com.pluralsight  1   Jersey Web Application /webapi/*  

我在这里介绍了所有这些内容。

我也很难让它工作。 既然你必须使用web.xml ,那么让restful web服务工作的最简单方法就是忘记完全扩展javax.ws.rs.core.Application并只在那里指定上下文路径。 您仍然可以使用标准的jax-rs注释来声明实际的Web服务。

web.xml中:

    rest-test com.sun.jersey.spi.container.servlet.ServletContainer  com.sun.jersey.config.property.packages com.domain.mypackage  1    rest-test /rest/*   

两个值得注意的要点:

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

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

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

   com.sun.jersey jersey-servlet 1.18.2  ...  

在此之后,使用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中的上下文中,有人请更正我 – 可以使用上下文或生命周期监听器吗?