2017-03-05 48 views
0

簡単な文章を書いています。 Karaf 4.1.0上にデプロイするアプリケーション。それはREST APIに休憩リクエストを送信する役割です。私は理解しない...私はいつもKarafに問題があるアプリケーションRESTクライアントon Karaf

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

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

送信要求私は私のバンドルを起動すると、私はエラーを持っていますなぜそれ 。正しく動作しない可能性があります...

答えて

0

問題は、主にKarafの問題ではありませんが、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プロバイダを登録する必要があります。

例えば、JAXBアノテーションを使用する場合はcom.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider、ジャクソン注釈を使用する場合はcom.fasterxml.jackson.jaxrs.json.JacksonJsonProviderのいずれかの標準実装を使用すると、問題を簡単に解決できます。このクラスをBlueprintディスクリプタのプロバイダセクションに追加します。

<jaxrs:server id="restServer" address="/rest"> 
    <jaxrs:serviceBeans> 
      .... 
    </jaxrs:serviceBeans> 
    <jaxrs:providers> 
      .... 
     <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider"/> 
      .... 
    </jaxrs:providers> 
</jaxrs:server> 
関連する問題