簡體   English   中英

從命令行程序訪問REST服務的問題

[英]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.

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