我正在尝试使用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
;
...
答案 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。