簡體   English   中英

使用JAX-RS創建RESTful Web服務並將其部署到tomcat

[英]Create RESTful Web Service with JAX-RS and deploy it to 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服務時,我收到以下錯誤:

--type異常報告

--message類javax.ws.rs.core.Application不是Servlet

--description服務器遇到內部錯誤,導致無法完成此請求。

任何幫助表示贊賞。

你的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>

我在這里介紹了所有這些內容。

我也很難讓它工作。 因為無論如何都必須使用web.xml ,讓restful 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的人請發布他們會發布的內容。

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

<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中的上下文中,有人請更正我 - 可以使用上下文或生命周期監聽器嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM