我正在尝试创建一个命令行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)
有人可以帮我吗?我无法理解我在这里缺少的东西。
答案 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;。