在Karaf上使用JSON的Apache CXF DSOGI

时间:2017-03-24 21:21:37

标签: json osgi cxf karaf dosgi

我正在尝试使用Apache CXF DOSGI在Karaf 4.0.8中创建RESTful Web服务。正在调用该服务,但我收到此错误:没有找到类的消息正文编写器....

欢迎任何建议。谢谢!!!

组件:

filter

实体:

    @Component(immediate = true, property = {
            "service.exported.interfaces=*", 
            "service.exported.configs=org.apache.cxf.rs",
"org.apache.cxf.rs.provider=com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider",
            "org.apache.cxf.rs.address=/integr" })
    public class AccountRestService implements AccountWebUserIdResource {
    ...
    }


Interface:
------------
    @GET
    @Produces({
        "application/json"
    })
    AccountWebUserIdResource.GetAccountByWebUserIdResponse getAccountByWebUserId(
@PathParam("webUserId")
        String webUserId,
        @QueryParam("sc")
        String sc,
        @QueryParam("fields")
        String fields)
        throws Exception
    ;

...

1 个答案:

答案 0 :(得分:1)

至少使用CXF-DOSGi 2,您的代码可能无法正常工作。无论如何,在OSGi中从类名加载提供程序是有问题的,因为CXF DOSGi代码没有com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider类的可见性。

在CXF-DOSGi中,这可以使用intent完成。这对OSGi更友好,因为JacksonJsonProvider然后直接用作类,因此OSGi类加载工作得很好。还必须将总线属性设置为全部以覆盖jacksonprovider,因为规范通常不允许这样做。

cxf.bus.prop.skip.default.json.provider.registration=true

意图类如下所示:

@Component(property = "org.apache.cxf.dosgi.IntentName=jackson")
public class JacksonIntent implements Callable<List<Object>> {

    public List<Object> call() throws Exception {
        return Arrays.asList((Object)new JacksonJaxbJsonProvider());
    }

}

意图提供了一种通用的方法来定义CXF的功能和其他覆盖,而不会直接影响您的服务类。

然后必须使用服务属性service.exported.intents=jackson在服务中引用intent。

我刚刚添加了jackson example to CXF-DOSGi

另一个小障碍是当前cxf-jackson功能错过了捆绑。请参阅CXF-7298