2016-12-20 35 views
0

這個問題直接關係到這個問題通過以下鏈接通過@Mario問 Using JAX-RS (RESTEasy) as middleware: brokering a client's request to another serverJAX-RS(RestEasy的)中間件:經紀客戶端請求

我不明白,爲什麼從服務的響應不能直接轉達回客戶端。請看下面的代碼

郵差(客戶​​端),使資源ServiceA GET請求的URI如下:

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() using 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將其中繼嗎?有人能爲我提供理由嗎?

回答

0

javax.ws.rs.core.Response是一個抽象類。從B接收數據的實現與向A發送數據的實現不同。儘管接口相同,但它們不能互換。

Response不是嵌入數據實體的對象實例。想想管道通過A將數據從B傳輸到客戶端。使用InputStream從B解開消息,獲取實體並將其包裝到客戶端,並使用OutputStream

+0

非常感謝您的明確解釋。它非常有意義。事實上,這也回答了我有一個客戶端(郵遞員)直接訪問資源** ServiceB **的相關問題,並按預期提供XML響應。查看**響應**參考,可以看出實體**員工**被序列化;在** ServiceA **代碼中,所收到的**響應**似乎不同。這是因爲您提到的** Response **的不同實現,因此在客戶端顯示爲空。我對麼? –

+0

這兩種情況下的響應都是'application/xml',所以最終內容相同。如果您在對象中查看不同的序列化,原因可能是處理流的不同類實現 – pedrofb