【问题标题】:Using jackson provider with cxf in osgi (no message body writer has been found)在 osgi 中使用带有 cxf 的 jackson 提供程序(未找到消息正文编写器)
【发布时间】:2014-05-23 11:20:27
【问题描述】:

我总是得到错误: Apr 09, 2014 2:03:19 AM org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage WARNING: No message body writer has been found for response class Test.

在分布式 osgi cxf 环境中尝试让 jackson 解析测试类时。

网络服务中的配置:

restProps.put("service.exported.interfaces", "*");
restProps.put("service.exported.configs", "org.apache.cxf.rs");
restProps.put("service.exported.intents", "HTTP");
restProps.put("org.apache.cxf.rs.address", "http://localhost:8888/");
restProps.put("org.apache.cxf.rs.provider", "org.codehaus.jackson.jaxrs.JacksonJsonProvider");
context.registerService(Tester.class.getName(), new Tester(), restProps);

Tester 类中的配置:

@Path("tester")
    public class Tester {
    @GET
    @Path("test")
    @Produces(MediaType.APPLICATION_JSON)
    public Test testje(){
            return new Test("var");
    }
}

测试类定义:

@XmlRootElement(name = "test")
public class Test {

    private String var;

    public Test(String var){
        this.var = var;
    }

}

在清单文件中我已经包含了杰克逊:

Import-Package: org.codehaus.jackson;version="1.9.5"

有人知道可能是什么问题吗?

【问题讨论】:

  • 我也有同样的问题!

标签: java osgi jackson cxf


【解决方案1】:

首先,您需要在 osgi 之外测试您的服务。如果它适用于嵌入您的测试的码头,它将适用于嵌入在 osgi 中的码头。看这些幻灯片 http://www.slideshare.net/ielian/tdd-on-osgi

其次,您需要 JacksonJsonProvider 来处理将您的对象写入 json 等无消息正文编写器

<jaxrs:server id="events" address="/events">
    <jaxrs:serviceBeans>
        <ref bean="eventService"/>
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
        <bean class="com.myexample.exception.WebExceptionHandler"/>
    </jaxrs:providers>
    <jaxrs:extensionMappings>
        <entry key="json" value="application/json"/>
    </jaxrs:extensionMappings>
</jaxrs:server>

第三,确保你的服务生成 application/json 并且你上面的服务器地址在请求中匹配到提供者映射才能生效

@Override
@Produces({MediaType.APPLICATION_JSON})
@GET
public Collection<Event> getEvents ()
{
    return eventManager.getAllEvents();
}

同样在客户端确保您注册了 JacksonJsonProvider 否则您将获得无消息阅读器

    EventService eventService = JAXRSClientFactory.create(SERVICE_REST_URL, EventService.class, Collections.singletonList(new JacksonJsonProvider()));

有时间我会在github上加载一个例子。 希望对您有所帮助。

【讨论】:

    【解决方案2】:

    使用这些依赖项 -

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.8.9</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.8.9</version>
        </dependency>
    

    使用@Produces(MediaType.APPLICATION_JSON) 注释您的控制器并使用@XmlRootElement 注释您的模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      相关资源
      最近更新 更多