簡體   English   中英

Tomcat RESTful Web 服務部署

[英]Tomcat RESTful Web service deployment

我正在使用 Java、tomcat7、jersey 和 IDE eclipse 編寫一個簡單的 RESTful web 服務。

當我使用 eclipse(服務器)啟動 web 服務時,它運行良好。 我測試了 GET 和 POST 方法。 但是當我在 WAR 文件中導出應用程序並使用 tomcat 管理 UI 進行部署時。 它返回狀態 404 未找到。

這是示例:

@Path("/webservice")
public class WebService {

    @POST
    @Path("/post")
    @Produces(MediaType.APPLICATION_JSON)
    public Response helloWorld(String inputJson) {
        return Response.ok().entity("Hello World").build();
    }

    @GET  
    @Path("/{param}")  
    public Response getMessage(@PathParam("param") String message) {  
        String output = "Jersey say Hello World!!! : " + message;  
        return Response.status(200).entity(output).build();  
    }
}

這是 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" 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>WebService</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>jersey-servlet</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>package.webservice</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

誰能解釋在 eclipse 中啟動服務和在本地主機(或遠程主機)中部署有什么區別? 我怎樣才能調試或得到一些關於這個的痕跡?

有2個建議讓你擺脫這個問題1)在你的資源文件中制作一個默認方法,這樣如果沒有url匹配,那么它將調用否則它可能會給404

@GET
@Produces({ MediaType.TEXT_HTML, MediaType.TEXT_PLAIN })
public String default() {
    return "Hello Rest Api";
}

你可以看到 - > Rest api資源示例

2)在下面的web.xml lke中設置默認的rest api路徑

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

你可以看到 - > Rest api默認路徑集

所以,當你打電話給你的api - > http://something.com/project/rest然后你的資源文件的默認方法將被觸發。 所以沒有404發生。

我終於開始工作了。 我在eclipse項目的屬性中設置了context-root。 可訪問的URL將類似於:localhost:8080 / context-root / rest / ...但是當我在Tomcat中使用WAR文件部署它時,不會考慮此配置。 正確的URL仍然是:localhost:8080 / project / rest / ...

我必須找到如何在web.xml或其他地方設置context-root。

使用Jersey運行REST Api的web.xml設置最好在以下URL中進行說明。

http://www.vogella.com/tutorials/REST/article.html#jerseyprojectsetup_gradle

我正在開發REST Api,以下是web.xml設置。

<servlet>
    <servlet-name>BOARDWALK REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <!-- Register resources and providers under com.vogella.jersey.first package. -->
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>io.swagger.api</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>BOARDWALK REST Service</servlet-name>
    <url-pattern>/bae/*</url-pattern>
</servlet-mapping>

所有REST API服務類都存儲在classes / io / swagger / api文件夾下。 當我調用REST api時,我使用以下URL並且它可以工作。

HTTP://本地主機:8080 / bae4_3_release / BAE / bcpInstance

其中http:// localhost:8080 / bae4_3_release是上下文。 / bae / bcpInstance指向classes / io / swagger / api / BcpInstanceApi.class中的一個類,其中PATH定義為@bcpInstance。

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>io.swagger.api</param-value>
    </init-param>

表示REST API部署的位置。

我通過將正確的 JDK 放在 env 變量上來修復它。 將 JAVA_HOME 設置為指向 Java 11 而不是 Java 8。

我對 Tomcat 9 和 IntelliJ 也有同樣的問題。 當通過 IntelliJ 部署時,它一切都會工作,但是通過將來自project/target/project.war的 same.war 復制到$CATALINA_HOME/webapps來部署 same.war 到 tomcat 將導致部署成功,但我的所有請求都是 404。

它只是一個簡單的 hello world restful 應用程序,使用 jersey 而我的 /api/hello-world 從未工作過。 我需要在我的機器上保留兩個 java 版本,所以 IntelliJ 使用 11 而系統的 rest 使用 8。

現在都在工作。

暫無
暫無

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

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