本文介紹了如何使用RESTEasy代理客戶端發送查詢參數圖的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在尋找一種將包含參數名稱和值的映射傳遞給Get Web Target的方法。我希望RESTEasy將我的映射轉換為URL查詢參數列表;然而,RESTEasy拋出了一個異常,說明Caused by: javax.ws.rs.ProcessingException: RESTEASY004565: A GET request cannot have a body.
。如何告訴RESTEasy將此映射轉換為URL查詢參數?
這是代理接口:
@Path("/")
@Consumes(MediaType.APPLICATION_JSON)
public interface ExampleClient {
@GET
@Path("/example/{name}")
@Produces(MediaType.APPLICATION_JSON)
Object getObject(@PathParam("name") String name, MultivaluedMap<String, String> multiValueMap);
}
用法如下:
@Controller
public class ExampleController {
@Inject
ExampleClient exampleClient; // injected correctly by spring DI
// this runs inside a spring controller
public String action(String objectName) {
MultivaluedMap<String, String> params = new MultivaluedHashMap<>();
// in the real code I get the params and values from a DB
params.add("foo", "bar")
params.add("jar", "car")
//.. keep adding
exampleClient.getObject(objectName, params); // throws exception
}
}
推薦答案
深入研究RESTEasy源代碼幾個小時后,我發現通過接口注釋無法做到這一點。簡而言之,RESTEasy從org.jboss.resteasy.client.jaxrs.internal.proxy.processors.ProcessorFactory
創建一個稱為‘處理器’的東西來將注釋映射到目標URI。
然而,通過創建一個ClientRequestFilter
來解決這個問題真的很簡單,它從請求主體(當然是在執行請求之前)獲取Map,并將它們放在URI查詢參數中。檢查以下代碼:
篩選器:
@Provider
@Component // because I'm using spring boot
public class GetMessageBodyFilter implements ClientRequestFilter {
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
if (requestContext.getEntity() instanceof Map && requestContext.getMethod().equals(HttpMethod.GET)) {
UriBuilder uriBuilder = UriBuilder.fromUri(requestContext.getUri());
Map allParam = (Map)requestContext.getEntity();
for (Object key : allParam.keySet()) {
uriBuilder.queryParam(key.toString(), allParam.get(key));
}
requestContext.setUri(uriBuilder.build());
requestContext.setEntity(null);
}
}
}
PS:為簡單起見,我使用了Map
而不是MultivaluedMap
這篇關于如何使用RESTEasy代理客戶端發送查詢參數圖的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,