[英]Issues with accessing REST service from command line program
我正在嘗試創建一個命令行Java程序,它必須訪問一些REST服務。 我推薦了一個使用自動裝配的彈簧webapp。 我可以在webapp的spring配置文件中看到以下內容。
<bean id="jacksonJsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
<util:list id="webClientProviders">
<ref bean="jacksonJsonProvider"/>
</util:list>
<bean id="jsonWebClient" class="org.apache.cxf.jaxrs.client.WebClient" factory-method="create">
<constructor-arg type="java.lang.String" value="http://localhost:8080/"/>
<constructor-arg ref="webClientProviders" />
</bean>
這告訴我spring將使用參數' http:// localhost:8080 / '和一個具有JacksonJsonProvider實例的List創建一個WbClient實例。 我的理解是否正確?
我還在webapp代碼中看到了以下用法。
@Controller
public class ABController {
@Autowired
@Qualifier("jsonWebClient")
private WebClient webclient;
@RequestMapping(value = "/abc.action", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public String getABCD(HttpServletRequest request, HttpServletResponse response) {
...
...
WebClient wc = WebClient.create(webclient.getBaseURI());
wc.path("abcdservices/rest/restservices/cart/gettotal");
Response res = wc.get();
...
...
}
}
但是當我在我的Java程序中執行相同操作時,如下所示(以及一些變體):
List<Object> providers = new ArrayList<Object>();
JacksonJsonProvider j = new JacksonJsonProvider();
providers.add(j);
WebClient webclient = WebClient.create("http://localhost:8080/",
providers);
WebClient wc = webclient.create(webclient.getBaseURI());
wc.path("crmitsm/rest/cirestservices/crmitsm/warrantystatus");
Response res = wc.get();
我得到以下異常/錯誤。
java -jar target/CmdLine-0.0.1-SNAPSHOT-jar-with-dependencies.jar
Exception in thread "main" java.lang.NullPointerException
at org.apache.cxf.jaxrs.client.AbstractClient.setupOutInterceptorChain(AbstractClient.java:887)
at org.apache.cxf.jaxrs.client.AbstractClient.createMessage(AbstractClient.java:958)
at org.apache.cxf.jaxrs.client.WebClient.finalizeMessage(WebClient.java:1118)
at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1091)
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:894)
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:865)
at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:331)
at org.apache.cxf.jaxrs.client.WebClient.get(WebClient.java:357)
at org.CmdLine.App.main(App.java:37)
有人可以幫我。 我無法理解我在這里缺少的東西。
我發布的問題可能是一些依賴問題。 我嘗試了針對類似問題發布的多個解決方案 - 所有都是添加更多依賴項,嘗試使用shred插件而不是匯編等,但沒有一個工作。
最后我決定使用HttpClient,它工作正常。 我還決定使用Google的Gson來進行JSON到Java的轉換。 我的程序現在運行正常。 有關Gson的更多信息,請參閱Converting JSON to Java 。
您在spring config中看到的util:List與您在代碼中使用的java.util.List不完全相同。 在運行時,util:list轉換為spring代理后面的列表。 您可以打印出它的類並驗證這一點。 因此,WebClient創建失敗並出現NullPointerException,因為spring可能需要一個傳遞juList的代理。
為什么以編程方式創建jsonprovider和webclient? 可能你有理由,但讓它可配置更“可重用”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.