DOSGI 自定义供应商注册
DOSGI Custom Provider Registration
我正在尝试 运行 Apache Felix 中的 DOSGI。
我使用 CXF 3.2.0 包和 DOSGI 2.3.0
我可以成功注册服务,但无法为我的资源注册全局自定义提供程序。
我在接口中定义了一个资源:
@Path("")
public interface IToDoResource {
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
List<ToDo> getAllToDos();
@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
ToDo getToDoById(@PathParam("id") Long id);
...
}
然后实施于:
@Component(//
name = "My.ToDoRestService", //
immediate = true, //
property = //
{ //
"service.exported.configs=org.apache.cxf.rs", //
"service.exported.interfaces=*", //
"org.apache.cxf.rs.address=/todos", //
} //
)
public class ToDoResource implements IToDoResource {
....
}
我尝试为我的 类 注册全局自定义提供程序。
我可以让它与资源上的 "service.exported.intents" 属性 和供应商上的 "IntentName" 一起工作提供商。
然而,对于这个资源,我想注册 4 个提供者:
- 待办事项XML 提供商
- 待办事项Json 提供商
- ArrayList XML 提供商
- 数组列表Json提供者
或者,我也可以在资源上实现 IntentsProvider,它也有效。
但是以下不起作用,我在日志中没有为这种类型错误注册任何提供商:
@Component(//
name = "My.ToDoJsonProvider", //
immediate = true, //
service = MessageBodyWriter.class, //
property = {
"service.exported.configs=org.apache.cxf.rs", //
"org.apache.cxf.rs.provider=true", //
} //
)
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ToDoJsonProvider implements MessageBodyWriter<ToDo> {
在 localhost:8080/cxf/todos/1 returns 空文档和日志上获取:
JAXRSUtils:1834] No message body writer has been found for class my.todo.repository.api.ToDo, ContentType: application/xml
要在全球范围内注册自定义提供商,我会错过什么?
似乎只有在资源属性中直接命名时才会考虑意图。
"service.exported.intents" 属性 必须列出资源可能需要的所有意图。
我找不到任何文档,但 RsProvider 和 IntentManagerImpl 的源代码 类 对我有帮助。
IntentManagerImpl:
https://github.com/apache/cxf-dosgi/blob/master/common/src/main/java/org/apache/cxf/dosgi/common/intent/impl/IntentManagerImpl.java
我正在尝试 运行 Apache Felix 中的 DOSGI。 我使用 CXF 3.2.0 包和 DOSGI 2.3.0
我可以成功注册服务,但无法为我的资源注册全局自定义提供程序。
我在接口中定义了一个资源:
@Path("")
public interface IToDoResource {
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
List<ToDo> getAllToDos();
@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
ToDo getToDoById(@PathParam("id") Long id);
...
}
然后实施于:
@Component(//
name = "My.ToDoRestService", //
immediate = true, //
property = //
{ //
"service.exported.configs=org.apache.cxf.rs", //
"service.exported.interfaces=*", //
"org.apache.cxf.rs.address=/todos", //
} //
)
public class ToDoResource implements IToDoResource {
....
}
我尝试为我的 类 注册全局自定义提供程序。 我可以让它与资源上的 "service.exported.intents" 属性 和供应商上的 "IntentName" 一起工作提供商。 然而,对于这个资源,我想注册 4 个提供者:
- 待办事项XML 提供商
- 待办事项Json 提供商
- ArrayList XML 提供商
- 数组列表Json提供者
或者,我也可以在资源上实现 IntentsProvider,它也有效。
但是以下不起作用,我在日志中没有为这种类型错误注册任何提供商:
@Component(//
name = "My.ToDoJsonProvider", //
immediate = true, //
service = MessageBodyWriter.class, //
property = {
"service.exported.configs=org.apache.cxf.rs", //
"org.apache.cxf.rs.provider=true", //
} //
)
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ToDoJsonProvider implements MessageBodyWriter<ToDo> {
在 localhost:8080/cxf/todos/1 returns 空文档和日志上获取:
JAXRSUtils:1834] No message body writer has been found for class my.todo.repository.api.ToDo, ContentType: application/xml
要在全球范围内注册自定义提供商,我会错过什么?
似乎只有在资源属性中直接命名时才会考虑意图。 "service.exported.intents" 属性 必须列出资源可能需要的所有意图。
我找不到任何文档,但 RsProvider 和 IntentManagerImpl 的源代码 类 对我有帮助。
IntentManagerImpl: https://github.com/apache/cxf-dosgi/blob/master/common/src/main/java/org/apache/cxf/dosgi/common/intent/impl/IntentManagerImpl.java