2016-09-05 2 views
1

일부 REST 서비스에 액세스해야하는 명령 줄 Java 프로그램을 만들려고합니다. 나는 autowiring을 사용하여 동일한 작업을 수행하는 스프링 webapp 중 하나를 언급했다. 나는 webapp의 spring config 파일에서 아래를 볼 수있다. 이것은 인수 'http://localhost:8080/'와 JacksonJsonProvider의 인스턴스를 갖는 목록을 사용하여 WbClient의 인스턴스를 만들 것이다 봄 하더군요명령 줄 프로그램에서 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> 

. 내 말이 맞습니까?

웹 응용 프로그램 코드에서도 아래의 사용법을 볼 수 있습니다.

@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(); 
     ... 
     ... 
    } 
} 

그러나 아래 그림 (일부 변형)로 나는 나의 자바 프로그램에서 동일한 작업을 수행 할 때

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

내가 게시 한 문제는 일부 종속성 문제 일 수 있습니다. 나는 비슷한 문제에 대해 게시 된 여러 솔루션을 시도했다. 더 많은 의존성을 추가하고, 어셈블리 대신에 shred plugin으로 시도했지만 아무도 효과가 없었다.

마지막으로 나는 HttpClient와 함께 가기로 결심했다. 또한 Google의 Gson을 사용하여 JSON에서 Java로 변환하기로 결정했습니다. 내 프로그램이 잘 작동하고있다. Gson에 대한 자세한 내용은 Converting JSON to Java에서 확인할 수 있습니다.

0

봄 구성에서 표시되는 util : 목록이 코드에서 사용한 java.util.List와 정확히 일치하지 않습니다. 런타임시 util : list는 스프링 프록시 뒤에있는 목록으로 변환됩니다. 해당 클래스를 인쇄하여 확인할 수 있습니다. 따라서 Spring이 j.u.List를 전달한 프록시를 예상하기 때문에 WebClient 생성이 NullPointerException으로 실패합니다.

jsonprovider 및 webclient를 프로그래밍 방식으로 만드는 이유는 무엇입니까? 이유가있을 수 있지만 구성 가능하게 만드는 것이 '재사용 가능'합니다.

+0

나는 스프링을 사용하지 않고 간단한 자바 응용 프로그램 인 클라이언트 프로그램에서이 작업을 수행하려고합니다. – Aniruddha

+0

CXF 웹 클라이언트 [여기] (http://cxf.apache.org/docs/jax-rs-client-api.html#JAX-RSClientAPI-CXFWebClientAPI)를 작성하는 올바른 방법을 찾을 수 있습니다. – Cyriac

관련 문제