2016-09-05 87 views
1

我想創建一個命令行Java程序,它必須訪問某些REST服務。我提到了使用自動裝配完成相同功能的其中一種彈簧webapp。我可以在webapp的spring配置文件中看到下面的內容。從命令行程序訪問REST服務的問題

<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> 

這告訴我,春天會創建一個使用參數「http://localhost:8080/」,並具有JacksonJsonProvider的實例列表的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) 

有沒有人請幫我這裏。我無法理解我在這裏失去的東西。

回答

0

我發佈的問題可能是一些依賴性問題。我嘗試了多個針對類似問題的解決方案 - 所有這些都增加了更多的依賴關係,嘗試使用碎片插件而不是組裝等,但都沒有成功。

最後我決定去HttpClient,它工作正常。此外,我決定使用Google的Gson來執行JSON到Java的轉換。我的程序現在工作正常。有關Gson的更多信息可以在Converting JSON to Java找到。

0

您在spring配置中看到的util:List與您在代碼中使用的java.util.List不完全相同。在運行時,util:list轉換爲一個Spring代理的列表。您可以打印出課程並進行驗證。因此,WebClient的創建失敗,並帶有NullPointerException,因爲Spring可能會在您傳遞j.u.List的地方期待一個代理。

爲什麼你以編程方式創建jsonprovider和webclient?可能是你有一個原因,但使其可配置更「可重用」。

+0

我想從客戶端程序這是一個簡單的Java應用程序,而不是使用彈簧做到這一點。 – Aniruddha

+0

你可以找到寫CXF webclient的正確方法[這裏](http://cxf.apache.org/docs/jax-rs-client-api.html#JAX-RSClientAPI-CXFWebClientAPI) – Cyriac