2017-03-05 74 views
0

我寫了一個簡單的。應用程序部署在Karaf 4.1.0上。它的作用是向REST API發送一個休息請求。當我開始我的包我有一個錯誤:Karaf上的應用REST客戶端

javax.ws.rs.ProcessingException: org.apache.cxf.interceptor.Fault: No message body writer has been found for class package.QueueSharedDTO, ContentType: application/json 
    at org.apache.cxf.jaxrs.client.WebClient.doResponse(WebClient.java:1149) 
    at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1094) 
    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:428) 
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1631) 
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1626) 
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.post(WebClient.java:1566) 
    at org.apache.cxf.jaxrs.client.spec.InvocationBuilderImpl.post(InvocationBuilderImpl.java:145) 
    at package.worker.service.implementation.ConnectionServiceImpl.postCheckRequest(ConnectionServiceImpl.java:114) 
    at package.worker.service.implementation.ConnectionServiceImpl.sendCheck(ConnectionServiceImpl.java:103) 
    at package.worker.module.QueueSharedListener.run(QueueSharedListener.java:37) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.apache.cxf.interceptor.Fault: No message body writer has been found for class package.QueueSharedDTO, ContentType: application/json 
    at org.apache.cxf.jaxrs.client.WebClient$BodyWriter.doWriteBody(WebClient.java:1222) 
    at org.apache.cxf.jaxrs.client.AbstractClient$AbstractBodyWriter.handleMessage(AbstractClient.java:1091) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) 
    at org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:649) 
    at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1093) 
    ... 11 more 
Caused by: javax.ws.rs.ProcessingException: No message body writer has been found for class com.emot.dto.QueueSharedDTO, ContentType: application/json 
    at org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:780) 
    at org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:494) 
    at org.apache.cxf.jaxrs.client.WebClient$BodyWriter.doWriteBody(WebClient.java:1217) 
    ... 15 more 

初始化WebTarget:

private ConnectionServiceImpl() { 
    client = ClientBuilder.newClient(); 
    client.property(
      ClientProperties.CONNECT_TIMEOUT, 
      snifferProperties.getProperty(SnifferProperties.PARAM_REST_API_CONNECTION_TIMEOUT)); 
    client.property(
      ClientProperties.READ_TIMEOUT, 
      snifferProperties.getProperty(SnifferProperties.PARAM_REST_API_READ_TIMEOUT)); 
    System.out.println(2); 
    webTarget = client.target(buildUrl()); 
} 

發送請求:

private synchronized boolean postCheckRequest(String path, Object content) { 
    boolean result = true; 
    try { 
     Response response = webTarget 
       .path("check") 
       .path("add/one") 
       .request(MediaType.APPLICATION_JSON) 
       .post(Entity.json(content)); 
     result = (response.getStatus() == 200); 
    } catch (Exception e) { 
     System.out.println("Error but working"); 
     e.printStackTrace(); 
     result = false; 
    } 
    return result; 
} 

我總是Karaf的問題......我不明白爲什麼呢。無法正常工作...

回答

0

您面臨的問題大多不是卡拉夫問題,而是您在使用非JavaEE環境中的某些JAX-RS實現時可能遇到的典型問題。

異常字面上表示您的實現未命中消息正文作者。消息正文編寫器是實現類javax.ws.rs.ext.MessageBodyWriter的類,負責將數據對象序列化爲某種格式(如JSON)。還有另一個名爲javax.ws.rs.ext.MessageBodyReader的課程,它做了相反的事情。所有這些類都作爲提供者被註冊到JAX-RS框架中,從而擴展了它的功能。詳細信息在這裏:https://jersey.java.net/documentation/latest/message-body-workers.html

所以,通常你必須決定你的數據對象和HTTP MediaType之間的序列化/反序列化以及註冊一個合適的JAX-RS提供者。例如,使用Jackson的標準實現可以很容易地解決您的問題:如果您使用JAXB註釋,則可以使用com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider,如果您更喜歡Jackson註釋,則使用com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider。在您的藍圖描述符的提供者部分中添加此類:

<jaxrs:server id="restServer" address="/rest"> 
    <jaxrs:serviceBeans> 
      .... 
    </jaxrs:serviceBeans> 
    <jaxrs:providers> 
      .... 
     <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider"/> 
      .... 
    </jaxrs:providers> 
</jaxrs:server>