Web Services Tomcat REST风格的Web服务部署

3okqufwl  于 2022-11-15  发布在  其他
关注(0)|答案(4)|浏览(205)

我正在使用Java、tomcat7、jersey和IDE eclipse编写一个简单的REST风格的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中启动服务和在localhost(或远程主机)中部署服务有什么区别吗?我如何调试或获得一些跟踪信息?

jjjwad0x

jjjwad0x1#

有两个建议给你摆脱这个问题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 default path set
这样当你调用你的api比如-〉http://something.com/project/rest时,你的资源文件的默认方法就会被触发,所以不会发生404。

unftdfkk

unftdfkk2#

我终于让它工作了。我在eclipse项目的属性中设置了context-root。可访问的URL将类似于:localhost:8080/context-root/rest/...但是当我在Tomcat中用WAR文件部署这个时,这个配置没有被考虑进去,正确的URL仍然是:本地主机:8080/项目/剩余/...
我必须找到如何在web.xml或其他地方设置context-root。

vpfxa7rd

vpfxa7rd3#

使用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部署的位置。

r9f1avp5

r9f1avp54#

我已经通过在env变量上放置正确的JDK修复了它。设置JAVA_HOME指向Java 11而不是Java 8。
我在使用Tomcat 9和IntelliJ时遇到了同样的问题。通过IntelliJ部署时,一切都可以正常工作,但是通过将来自project/target/project.war的.war复制到$CATALINA_HOME/webapps来将其部署到tomcat,会导致部署成功,但我的所有请求都出现404。
这只是一个简单的hello world restful应用程序,使用了jersey,而我的/api/hello-world从来没有工作过。我需要在我的机器上保留两个java版本,所以IntelliJ使用11,系统的其他部分使用8。
现在一切正常。

相关问题