【问题标题】:JAX-RS on Tomcat by using RestEasyTomcat 上的 JAX-RS 使用 RestEasy
【发布时间】:2018-12-08 22:08:00
【问题描述】:

我是使用 JAX-RS 标准的 REST 应用程序的新手,我想了解如何使用此标准。 所以我下载并设置了 Apache Tomcat 9.0 并添加了<Context> 像这样:

<Context docBase="...\RestEasyApp\target\RestEasyApp" path="/example" reloadable="true"/>

然后使用Maven 我创建了具有以下结构的项目:

然后进入pom.xml,我通过这个依赖添加了RestEasy

<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-jaxrs -->
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <version>3.5.1.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-servlet-initializer -->
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-servlet-initializer</artifactId>
    <version>3.5.1.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-jackson2-provider -->
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson2-provider</artifactId>
    <version>3.5.1.Final</version>
</dependency>

然后进入web.xml,我创建了Servlet,它看起来像这样:

<web-app>
    <listener>
      <listener-class>
         org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
      </listener-class>
   </listener>

  <display-name>Archetype Created Web Application</display-name>
  <servlet>
      <servlet-name>Resteasy</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
  </servlet>

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

</web-app>

最后我创建了一个处理请求的 Hello.java 类,它看起来像这样:

package com.pisi.resteasyapp;

import javax.ws.rs.*;

@Path("/api")
class Hello {

    @GET
    @Path("/hello")
    public String hello() {
        return "HELLO";
    }

}

但是当我用这个 uri http://localhost:8080/example/rest/api/hello 运行这个应用程序时,它给了我这个:

我不知道为什么它不起作用。

【问题讨论】:

  • 尝试用@Path("/rest/api")改变@Path("/api")
  • @RobertHume,不,它不起作用
  • 请看我的回答,我现在测试了;我希望它可以帮助。

标签: java tomcat jax-rs resteasy tomcat9


【解决方案1】:

您必须在您的项目中添加一个Application 类:

package com.pisi.resteasyapp;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("")
public class HelloApplication extends Application {

    @Override
    public Set<Object> getSingletons() {
        Set<Object> set = new HashSet<>();
        set.add(new Hello());
        return set;
    }

}

您还必须将 Helloclass 的映射从 @Path("/api") 更改为 @Path("/rest/api") 并创建类 public 以允许 RESTEasy 反映 hello() 方法:

@Path("/rest/api")
public class Hello {

一般来说,更好的解决方案是:

  1. web.xml 中删除&lt;servlet-mapping&gt;
  2. HelloApplication 类中将@ApplicationPath("") 更改为@ApplicationPath("/rest")
  3. Hello 类中使用@Path("/api") 而不是@Path("/rest/api")

【讨论】:

  • 通过这种方法,它给了我这个 Tomcat 错误imgur.com/a/eMQVikX
  • @Pisi 请验证您的 Context docBase 配置是否正确,特别是您可以尝试指定绝对路径(即 c:/path/to/target/target/RestEasyApp)
  • Context 的 docBase 是 "C:\Users\Filippo\Desktop\Heroku\RestEasyApp\target\RestEasyApp" 是绝对的
  • 你有没有尝试过制造战争并直接放入tomcat/webapps?我想了解这是否是部署问题。
  • 这不是部署错误,因为如果我部署 .war 也会给我同样的错误
猜你喜欢
  • 1970-01-01
  • 2014-02-03
  • 2016-09-11
  • 2013-11-21
  • 2020-09-08
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
相关资源
最近更新 更多