我有一个解决方法,不需要DI容器,但仍然能够获得大部分好处。
有两个部分。第一部分是如何将实例放入@Context注入机制中,而不是在ApplicationConfig对象中提供类。
以下是一种实现方法:
private static class CustomContextResteasyBootstrap extends org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap{
private final Map<Class<?>, Object> additionalContextObjects = new HashMap<Class<?>, Object>();
public <E> CustomContextResteasyBootstrap addContextObject(Class<? super E> clazz, E obj){
additionalContextObjects.put(clazz, obj);
return this;
}
@Override
public void contextInitialized(ServletContextEvent event) {
super.contextInitialized(event);
deployment.getDispatcher().getDefaultContextObjects().putAll(additionalContextObjects);
}
}
而且你可以像这样使用它:
webAppContext.addEventListener(
new CustomContextResteasyBootstrap()
.addContextObject(MyCustom.class, myCustom)
.addContextObject(AnotherCustom.class, anotherCustom)
// additional objects you wish to inject into the REST context here
);
现在你可以使用@Context注释来使用这些类:
@GET
public MyCustom echoService(@Context MyCustom custom) {
return custom;
}
下一个难题是如何提供每个请求的上下文对象。为此,请在jax-rs调用层次结构的顶部附近添加以下代码(基本上,任何在此行以下调用的内容都将访问上下文对象):
ResteasyProviderFactory.pushContext(MyContextSpecific.class, new MyContextSpecific())
您可以通过注入在该级别以下的任何地方引用它:
@GET
public String contextSpecificEchoService(@Context MyContextSpecific contextSpecific) {
return custom.toString();
}
这是一种简易的依赖注入方式,但对于嵌入式REST服务器来说非常有效。
RequestContext
添加一些对象,并在Spring Boot服务器中接收它)? 这是我的帖子链接:https://stackoverflow.com/questions/46211601/attaching-attribute-to-requestcontext-pass-element-from-frontend-to-backend。 - Haskell FunSupplier<T>
接口来代替Factory<T>
。 - bramhaag