Jersey Guice管理的泽西岛和资源
我正在开发一个在OSGI环境中动态加载JAX资源的应用程序。 这些资源由Guice在每个Bundle中管理,并加载到在核心Bundle上运行的JAX应用程序中Jersey Guice管理的泽西岛和资源,jersey,osgi,guice,jersey-2.0,hk2,Jersey,Osgi,Guice,Jersey 2.0,Hk2,我正在开发一个在OSGI环境中动态加载JAX资源的应用程序。 这些资源由Guice在每个Bundle中管理,并加载到在核心Bundle上运行的JAX应用程序中 ResourceConfig cfg = new ResourceConfig(context.getConfiguration()); for (Provider<?> r : kb.getResources()) { if (!cfg.isRegistered(r.get())) { cfg.registerI
ResourceConfig cfg = new ResourceConfig(context.getConfiguration());
for (Provider<?> r : kb.getResources()) {
if (!cfg.isRegistered(r.get())) {
cfg.registerInstances(r.get());
}
}
context.reload(cfg);
。。。。
....
我认为错误在于新实例(资源r1)由H2K而不是Guice处理,不能满足您的依赖性
我们试图在OSGI环境中使用guice桥工件,但这会产生一个错误:找不到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桥,那么您知道如何更改guice管理的资源路径吗?配置它的最佳方式是什么
我用的是泽西2.4
谢谢我找到的解决方案(如果不是最好的话)是定义CustomServletContext并使用guice bridge工件,遵循jersey issue tracker中的引用问题。
解决方案:
public class KratosServletContainer extends ServletContainer {
private Injector injector;
@Inject
KratosServletContainer(Injector injector, ResourceConfig configuration) {
super(configuration);
this.injector = injector;
}
@Override
protected void init(WebConfig webConfig) throws ServletException {
super.init(webConfig);
ServiceLocator locator;
try {
Field webComponentField = getClass().getSuperclass()
.getDeclaredField("webComponent");
webComponentField.setAccessible(true);
WebComponent webComponent = (WebComponent) webComponentField.get(this);
Field appHandlerField = webComponent.getClass().getDeclaredField("appHandler");
appHandlerField.setAccessible(true);
ApplicationHandler appHandler = (ApplicationHandler) appHandlerField.get(webComponent);
locator = appHandler.getServiceLocator();
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | llegalAccessException e) {
throw new RuntimeException(e);
}
GuiceBridge.getGuiceBridge().initializeGuiceBridge(
locator);
GuiceIntoHK2Bridge guiceBridge = locator
.getService(GuiceIntoHK2Bridge.class);
guiceBridge.bridgeGuiceInjector(injector);
}
}
举例来说:
我的资源如下所示:
@Path("resource")
public class ResourceFinder {
private static final Logger logger = Logger.getLogger(ResourceFinder.class.getName());
private Date date;
private final PersistenceManagerService pm;
@Inject
public ResourceFinder(Date date, PersistenceManagerService pm) {
this.date = date;
this.pm = pm;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/suma/{value1}/{value2}")
@PermitAll
public String getSuma(@PathParam("value1") int value1,
@PathParam("value2") int value2) {
User user = new User();
user.setName("cacho" + value1);
pm.get().makePersistent(user);
pm.get().flush();
//date was injected by guice
//pm was injected by guice
return String.valueOf(value1 + value2 + " "+pm.get()+" "+date);
}
}
方法:
@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);
resourceBuilder.path(actualKrundle.getName()+"/"+resource.getPath());
Resource r1 = resourceBuilder.build();
newResourceModelBuilder.addResource(r1);
break;
}
}
}
return newResourceModelBuilder.build();
}
@覆盖
公共资源模型processResourceModel(资源模型ResourceModel,配置){
logger.info(actualKrundle.getName());
ResourceModel.Builder newResourceModelBuilder=newresourcemodel.Builder(false);
for(最终提供程序r:actualKrundle.getResources()){
字符串名称=r.get().getClass().getCanonicalName();
List resources=resourceModel.getResources();
for(最终资源:资源){
if(resource.getName().endsWith(name)){
final Resource.Builder resourceBuilder=Resource.Builder(资源);
resourceBuilder.path(actualKrundle.getName()+“/”+resource.getPath());
ResourceR1=resourceBuilder.build();
newResourceModelBuilder.addResource(r1);
打破
}
}
}
返回newResourceModelBuilder.build();
}
在资源路径中进行更改,重新创建实例,所有内容都保持注入状态
@Path("resource")
public class ResourceFinder {
private static final Logger logger = Logger.getLogger(ResourceFinder.class.getName());
private Date date;
private final PersistenceManagerService pm;
@Inject
public ResourceFinder(Date date, PersistenceManagerService pm) {
this.date = date;
this.pm = pm;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/suma/{value1}/{value2}")
@PermitAll
public String getSuma(@PathParam("value1") int value1,
@PathParam("value2") int value2) {
User user = new User();
user.setName("cacho" + value1);
pm.get().makePersistent(user);
pm.get().flush();
//date was injected by guice
//pm was injected by guice
return String.valueOf(value1 + value2 + " "+pm.get()+" "+date);
}
}
@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);
resourceBuilder.path(actualKrundle.getName()+"/"+resource.getPath());
Resource r1 = resourceBuilder.build();
newResourceModelBuilder.addResource(r1);
break;
}
}
}
return newResourceModelBuilder.build();
}