簡體   English   中英

RESTEasy InMemoryClient使用@FormParam拋出NPE

[英]RESTEasy InMemoryClient throws NPE with @FormParam

我正在使用RESTEasy客戶端框架版本2.3.5(我不得不使用它,但我可以稍后升級到更新的版本)來創建對數據庫服務器的請求。 我google了很多,以便更好地了解我應該如何為它編寫好的和干凈的單元測試。 我找到了InMemoryClientExecutor類,它似乎符合我的需要。

看到這個答案: 是否有RESTEasy的客戶端模擬框架?

它工作得很好,但是如果我在客戶端代碼中添加一個方法(我在生產代碼中使用相同的簽名方法)

@POST
@Produces({ "application/json" })
public abstract HighLevelDeviceGateway testMethod(@FormParam("deviceGatewayName")   String param)
            throws Exception;

拋出一個NPE,這是堆棧跟蹤:

Exception in thread "main" java.lang.RuntimeException: java.lang.NullPointerException
at org.jboss.resteasy.client.core.ClientInvoker.invoke(ClientInvoker.java:120)
at org.jboss.resteasy.client.core.ClientProxy.invoke(ClientProxy.java:88)
at com.sun.proxy.$Proxy24.testMethod(Unknown Source)
at com.mypackage.InMemoryClientExecutorExample.main(InMemoryClientExecutorExample.java:78)
Caused by: java.lang.NullPointerException
at org.jboss.resteasy.mock.MockHttpRequest.getFormParameters(MockHttpRequest.java:259)
at org.jboss.resteasy.client.core.executors.InMemoryClientExecutor.loadHttpMethod(InMemoryClientExecutor.java:147)
at org.jboss.resteasy.client.core.executors.InMemoryClientExecutor.execute(InMemoryClientExecutor.java:75)
at org.jboss.resteasy.core.interception.ClientExecutionContextImpl.proceed(ClientExecutionContextImpl.java:39)
at org.jboss.resteasy.plugins.interceptors.encoding.AcceptEncodingGZIPInterceptor.execute(AcceptEncodingGZIPInterceptor.java:40)
at org.jboss.resteasy.core.interception.ClientExecutionContextImpl.proceed(ClientExecutionContextImpl.java:45)
at org.jboss.resteasy.client.ClientRequest.execute(ClientRequest.java:443)
at org.jboss.resteasy.client.ClientRequest.httpMethod(ClientRequest.java:677)
at org.jboss.resteasy.client.core.ClientInvoker.invoke(ClientInvoker.java:111)
... 3 more

對我來說這似乎是一個錯誤,我嘗試使用最新版本的RESTEasy,NPE仍然存在但新版本卻棄用了Executor。

更多信息,這是NPE的來源:

if (getHttpHeaders().getMediaType().isCompatible(MediaType.valueOf("application/x-www-form-urlencoded")))

HTTP標頭不是null但媒體類型是,我不明白為什么..

任何幫助表示贊賞!

您可以通過在請求中添加“Content-Type”標頭來繞過第一個NPE:

_request.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED);

但是,這不會解決您的問題。

根本問題是InMemoryClientExecutor錯誤地調用

mockHttpRequest.getFormParameters().add(key, value);

添加from值而不是調用

mockHttpRequest.addFormHeader(key, value);

因為formParameters集合以null開頭,所以調用getFormParameters()導致嘗試解析為空的輸入流。

看起來addFormHeader既可以將內容類型(“application / x-www-form-urlencoded”)和表單名稱/值對設置為已解碼的表單參數集合。

遺憾的是,由於代碼的整個ClientExecutionContextImplClientRequest分支似乎被標記為已棄用,我懷疑其中任何一個都將被修復。 我希望我們得到一些進程方式來測試對資源的調度。 :S

現在,您可以使用表單參數構建MultivalueMap集合並將其設置為請求正文:

_request.body(MediaType.APPLICATION_FORM_URLENCODED_TYPE, _formData);

這將允許您“發送”表單數據:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM