我正在开发一个在 OSGI 环境中动态加载 JAX 资源的应用程序。这些资源由 Guice 管理,在每个 Bundle 中,它们被加载到在核心包上运行的 JAX 应用程序中。
ResourceConfig cfg = new ResourceConfig(context.getConfiguration());
for (Provider<?> r : kb.getResources()) {
if (!cfg.isRegistered(r.get())) {
cfg.registerInstances(r.get());
}
}
context.reload(cfg);
其中 context 是由 Guice 管理的 Jersey ServletContext。
这一切都完美无缺。出现问题是因为我们想要在加载资源时操纵路径。然后,我们创建我们的 ModelProcessor。
@Override
public ResourceModel processResourceModel(ResourceModel resourceModel, Configuration configuration) {
logger.info(actualKrundle.getName());
ResourceModel.Builder newResourceModelBuilder = new ResourceModel.Builder(false);
for (final Provider<?> r : actualKrundle.getResources()) {
String name = r.get().getClass().getCanonicalName();
List<Resource> resources = resourceModel.getResources();
for (final Resource resource : resources) {
if (resource.getName().endsWith(name)){
final Resource.Builder resourceBuilder = Resource.builder(resource);
//add the bundle name to resource path
resourceBuilder.path(actualKrundle.getName()+"/"+resource.getPath());
Resource r1 = resourceBuilder.build();
newResourceModelBuilder.addResource(r1);
break;
}
}
}
return newResourceModelBuilder.build();
}
错误是无法处理注入资源的所有依赖项。例如:如果资源注入了日期(@Inject Date 日期),则错误如下:
A MultiException has 1 exceptions. They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=Date,parent=ResourceFinder,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,23999364)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)[261:org.glassfish.hk2.locator:2.2.0.b21]
at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:803)[261:org.glassfish.hk2.locator:2.2.0.b21]
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:832)[261:org.glassfish.hk2.locator:2.2.0.b21]
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:822)[261:org.glassfish.hk2.locator:2.2.0.b21]
……………………
我认为错误在于新实例(资源 r1)由 H2K 而不是 Guice 处理,并且不能满足您的依赖关系。
我们尝试在 OSGI 环境中使用 guice-bridge 工件,但这会产生错误:未找到 ServiceLocator 的实现。
但是所有依赖项都在类路径中:
karaf@root> la | grep HK2
[ 260] [Active ] [ ] [ 30] HK2 API module (2.2.0.b21)
[ 262] [Active ] [ ] [ 30] HK2 Implementation Utilities (2.2.0.b21)
[ 283] [Active ] [ ] [ 30] HK2 Guice Bridge (2.1.96)
karaf@root> la | grep ServiceLo
[ 261] [Active ] [ ] [ 30] ServiceLocator Default Implementation (2.2.0.b21)
karaf@root>
那么,如果解决方案是使用 guice-bridge,那么如何更改 guice 管理的资源的路径,这是最好的配置方式吗?
我正在使用球衣 2.4。
谢谢