在Karaf上应用REST客户端

时间:2017-03-05 15:48:24

标签: karaf

我正在写一篇简单的文章。在Karaf 4.1.0上部署应用程序。它的作用是向REST API发送休息请求。当我开始我的包时,我有一个错误:

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

我一直有卡拉夫的问题...我不明白为什么。无法正常工作......

1 个答案:

答案 0 :(得分: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,您的问题可以通过使用其标准实现之一轻松解决:com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider,如果您使用JAXB注释,或com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider,如果您更喜欢Jackson注释。在Blueprint描述符的providers部分中添加此类:

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