从命令行程序访问REST服务的问题

时间:2016-09-05 11:14:23

标签: java command-line jax-rs webclient

我正在尝试创建一个命令行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)

有人可以帮我吗?我无法理解我在这里缺少的东西。

2 个答案:

答案 0 :(得分:0)

我发布的问题可能是一些依赖问题。我尝试了针对类似问题发布的多个解决方案 - 所有这些都是添加更多依赖项,尝试使用shred插件而不是汇编等,但没有一个工作。

最后我决定使用HttpClient,它运行良好。我还决定使用Google的Gson来进行JSON到Java的转换。我的程序现在运行正常。有关Gson的更多信息,请访问Converting JSON to Java

答案 1 :(得分:0)

您在spring配置中看到的util:List与您在代码中使用的java.util.List不完全相同。在运行时,util:list转换为spring代理后面的列表。您可以打印出它的类并验证这一点。因此,WebClient创建失败并出现NullPointerException,因为spring可能需要一个传递j.u.List的代理。

为什么以编程方式创建jsonprovider和webclient?可能是你有理由但是可以配置它是更可重复的&#39;。