JAX-RS(Resteasy)中间件:Brokering Client请求



这个问题与@mario在以下链接上问的问题直接相关使用jax-rs(ResteAsy)作为中间件:将客户端的请求转到另一台服务器

我不明白为什么服务中的响应不能直接传达给客户端。考虑以下代码

postman(client)在下面的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()使用 proxy ,看起来像这样:

@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 将其回传递?有人可以给我原因吗?

javax.ws.rs.core.Response是一个抽象类。从B接收数据的实现不会与将数据发送到A的相同。

Response不是嵌入数据实体的对象实例。想想使用A的管道将数据从B传输到客户端A。A使用InputStream从B中解开消息,获取实体并使用OutputStream

将其包装给客户端。

最新更新