【问题标题】:Rest Service URI mapping to Java Inner ClassesRest Service URI 映射到 Java 内部类
【发布时间】:2014-12-02 09:52:30
【问题描述】:

我必须对尝试创建 URI 以访问 Java 内部类的其余服务操作进行建模。让我知道这是否可以使用 Rest Web Service 来实现?我正在为我的服务使用 rest easy。

编辑:(使用 peeskillet 回答提供的代码)

javax.ws.rs.ProcessingException: Unable to invoke request
at  org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:287)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:407)

Caused by: org.apache.http.conn.HttpHostConnectException: Connection to http://localhost:8081 refused
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:190)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:643)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:283)
... 26 more
Caused by: java.net.ConnectException: Connection refused

【问题讨论】:

  • 抱歉,您的问题有点不清楚。请发布一些演示问题的代码,以及您想要的预期输出
  • 如果说 /rest/message/123 是我获取 123 ID 数据的休息 URI。现在我想创建一个 URI,以便在 Message 中有一个名为 Comment 的内部类。所以我想知道我是否可以创建像 /rest/message/comment/12 这样的服务。如果我听起来很清楚,请告诉我。
  • 所以 Comment 只是一个模型类吧(对传入的 JSON 进行建模)?不是资源类?
  • 评论应该是资源类
  • 请告知资源类是否可以作为其他类的内部类

标签: java rest jax-rs resteasy


【解决方案1】:

请告知资源类是否可以作为其他类的内部类

是的,这是可能的,但我们不能简单地注释内部类路径 @Path 并期望调用到达那里。我们需要使用“子资源定位器”。基本上,它可以是一个只用@Path 注释的方法,它将返回内部资源类的一个实例。类似的东西

@Path("/messages")
public class MessageResource {

    @GET
    @Path("/{id}")
    public Response getMessage(@PathParam("id") int id) {
        return Response.ok("messages, id: " + id).build();
    }

    @Path("/{id}/comments")
    public CommentsResource getComments() {
        return new CommentsResource();
    }

    public class CommentsResource {

        @GET
        @Path("/{id}")
        public Response getComment(@PathParam("id") int id) {
            return Response.ok("Hello Sub-Resource Locators").build();
        }
    }
}

我们可以测试一下

@Test
public void testResteasy() {
    WebTarget target = client.target(TestPortProvider.generateURL(BASE_URI))
            .path("messages").path("1234").path("comments").path("5678");
    Response response = target.request().get();
    System.out.println("Status:" + response.getStatus());
    System.out.println("Response: " + response.readEntity(String.class));
    response.close();
}

我们会收到回复Hello Sub-Resource Locators


进一步阅读


编辑:

根据您提供的错误,TestPortProvider 将使用端口 8081,并以 http://localhost:8081 开始您的 URI。您传递给gererateURL 的内容将被附加。通常我将它与嵌入式服务器测试一起使用。但是,如果您正在运行实际的服务器,它很可能在端口 8080 上。我建议只传递字符串基本 URL,例如:

WebTarget target = client.target("http://localhost:8080/MyApp/rest")
        .path("messages").path("1234").path("comments").path("5678");

【讨论】:

  • 谢谢!这就是我一直在寻找的,但是在编译测试代码时,我收到了发布的错误。请指教。
  • 抱歉,测试代码TestPortProvider 是我喜欢使用的测试框架的一部分。您可以将TestPortProvider.generateURL(BASE_URI) 替换为完整的基本URI,例如http://localhost:8080/api。 URI 的其余部分通过path 方法链接以编程方式设置。所以最终的 URI 将类似于http://localhost:8080/api/messages/1234/comments/5678。您需要自己确定基础是什么
  • 您也可以尝试在浏览器中输入 url 以查看它是否有效。
  • 是的,我也这样做了。但是我在收到在线响应时出现错误 Response response = target.request().get();关于这些的任何想法。请指教
  • 在浏览器或任何 restclients 上工作它工作得很好。
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 2013-07-20
  • 2012-05-14
  • 1970-01-01
相关资源
最近更新 更多