Rest服务URI映射到Java内部类

时间:2014-12-02 09:52:30

标签: java rest jax-rs resteasy

我必须为其他服务操作建模,我正在尝试创建一个URI来访问Java Inner类。如果可以使用Rest Web Service实现这一点,请告诉我们?我正在为我的服务轻松休息。

编辑(使用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

1 个答案:

答案 0 :(得分:2)

  

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

是的,这是可能的,但我们不能只是注释内部类路径@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上。我建议只传递String基本URL,如:

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