JAX-RS(RestEasy)中间件:代理客户端请求

时间:2016-12-20 16:02:34

标签: java jax-rs resteasy

此问题与@Mario在以下链接中提出的问题直接相关 Using JAX-RS (RESTEasy) as middleware: brokering a client's request to another server

我不明白为什么服务的响应无法直接转发回客户端。请考虑以下代码

Postman(客户)在以下URI上对资源 ServiceA 发出GET请求:

http://localhost:8080/A/ServiceA

ServiceA 如下所示:

@Path("ServiceA")
public class ServiceA {

    private static final String BASE_URI = "http://localhost:8080/B/";
    // call ServiceB at localhost:8080/B/ServiceB
    // <ServiceB> path is resolved via Proxy

    @GET
    @Formatted
    @Produces({MediaType.APPLICATION_XML})
    public Response show() {

        ResteasyClient resteasyClient = new ResteasyClientBuilder().build();
        ResteasyWebTarget webTarget = resteasyClient.target(BASE_URI);
        ServiceBProxy serviceBProxy = webTarget.proxy(ServiceBProxy.class);
        return serviceBProxy.show();
    }
}

ServiceA 使用代理调用REST方法 show(),如下所示:

@Path("ServiceB")
public interface ServiceBProxy {
    @GET
    @Formatted
    @Produces({ MediaType.APPLICATION_XML})
    public Response show();
}

最后 ServiceB 看起来像这样:

@Path("ServiceB")
public class ServiceB {

@GET
@Formatted
@Produces({MediaType.APPLICATION_XML})
public Response show() {
    return Response.status(200).entity(new  Employee("John", "Doe", 32)).build();
}

我认为ServiceA只是将响应返回给客户端,一切都很顺利。但客户却什么都没有回来。

当然,我尝试过以上帖子中提到的解决方案。它有效。

@GET
@Formatted
@Produces({MediaType.APPLICATION_XML})
public Response show() {

    ResteasyClient resteasyClient = new ResteasyClientBuilder().build();
    ResteasyWebTarget webTarget = resteasyClient.target(BASE_URI);
    ServiceBProxy serviceBProxy = webTarget.proxy(ServiceBProxy.class);
    Response response = serviceBProxy.show()
    Employee employee = response.readEntity(Employee.class);
    response.close();
    return Response.status(200).entity(employee).build();
}

我不明白为什么?直接访问 ServiceB 会返回结果;使用 ServiceA 重新发送回来不是吗?有人可以告诉我原因吗?

1 个答案:

答案 0 :(得分:0)

javax.ws.rs.core.Response是一个抽象类。从B接收数据的实现与将数据发送到A的实现相同。虽然接口是相同的,但它们不能互换

Response不是嵌入了数据实体的对象实例。考虑通过A将数据从B传输到客户端的管道。使用{​​{1}}从B中解包消息,获取实体并使用InputStream

将其包装到客户端