Tomcat RESTful Web服务部署

4
我正在使用Java、tomcat7、jersey和IDE Eclipse编写一个简单的RESTful网络服务。
当我使用Eclipse(Servers)启动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中启动服务和在本地(或远程主机)部署的区别吗?我该如何调试或获取一些关于此的跟踪信息?

4个回答

1
我终于让它工作了。我在eclipse项目的属性中设置了上下文根。可访问的URL将类似于:localhost:8080/context-root/rest/... 但是当我使用WAR文件在Tomcat中部署时,这个配置不起作用。正确的URL仍然是:localhost:8080/project/rest/...
我必须找到如何在web.xml或其他地方设置上下文根。

1

有两个建议可以帮助您解决这个问题: 1)在您的资源文件中创建一个默认方法,以便如果没有匹配的URL,则会调用该方法,否则可能会出现404错误。

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

你可以看到 -> Rest api resource example

2)在你的web.xml文件中设置一个默认的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中测试时,它运行得非常好,所以URL不应该是问题。 - Tony DING
然后检查你使用的库是否在war包中或者缺失。 - M. M. Saleh
我已经检查了所有的库,没有问题。 - Tony DING
很奇怪:: 我测试我的应用程序,它在Eclipse中运行良好,在Tomcat部署后也能正常工作。有可能是您的Eclipse无法正确构建war文件。 - M. M. Saleh

0

使用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://localhost:8080/bae4_3_release/bae/bcpInstance

其中http://localhost:8080/bae4_3_release是上下文。 /bae/bcpInstance指向classes/io/swagger/api/BcpInstanceApi.class中定义为@bcpInstance的类。

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

指示 REST API 部署的位置。


0

我通过将正确的JDK放在环境变量中来解决了这个问题。将JAVA_HOME设置为指向Java 11而不是Java 8。

我在Tomcat 9和IntelliJ中遇到了同样的问题。通过IntelliJ部署时一切正常,但是将来自project/target/project.war的相同.war文件复制到$CATALINA_HOME/webapps中的Tomcat中会导致成功部署但所有请求都返回404。

这只是一个使用Jersey的简单的Hello World Restful应用程序,我的/api/hello-world从未工作过。我需要在我的机器上保留两个Java版本,因此IntelliJ正在使用11,而系统的其余部分正在使用8。

现在一切都正常了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接