是否有方法更改注入所有资源和类的UriInfo的实现?我想保持大部分实现不变,但只更改其中的一部分(提供UriBuilder的部分-我想提供UriBuilder不同的实现)。
您可以围绕原始UriInfo
创建包装器
public class MyUriInfo implements UriInfo {
private final UriInfo delegate;
public MyUriInfo(UriInfo uriInfo) {
this.delegate = uriInfo;
}
@Override
public String getPath() {
return delegate.getPath();
}
@Override
public UriBuilder getRequestUriBuilder() {
return new MyUriBuilder();
}
...
}
然后只需创建一个Factory
即可返回您的自定义UriInfo
。这个Factory
将被DI框架用来注入UriInfo
。
public class MyUriInfoFactory
extends AbstractContainerRequestValueFactory<MyUriInfo> {
@Override
public MyUriInfo provide() {
return new MyUriInfo(getContainerRequest().getUriInfo());
}
}
然后只需创建AbstractBinder
并将其注册到ResourceConfig
public class Binder extends AbstractBinder {
@Override
protected void configure() {
bindFactory(MyUriInfoFactory.class)
.to(UriInfo.class)
.in(RequestScoped.class)
.proxy(true)
.proxyForSameScope(false)
.ranked(10);
}
}
public class AppConfig extends ResourceConfig {
public AppConfig() {
register(new Binder());
}
}
如果您使用的是web.xml,请查看这篇文章。
现在你应该可以直接注入
@GET
public String get(@Context UriInfo uriInfo) {
return uriInfo.getClass().getName();
}
如果你想保持能够注入原始UriInfo
,你可以将绑定更改为
bindFactory(MyUriInfoFactory.class)
.to(MyUriInfo.class) // <--- Change here to MyUriInfo
.in(RequestScoped.class)
.proxy(true)
.proxyForSameScope(false)
.ranked(10);
通过这种方式,您需要注入MyUriInfo
@GET
public String get(@Context MyUriInfo uriInfo) {
return uriInfo.getClass().getName();
}
这样做,如果需要的话,您仍然可以注入原始的UriInfo
。
另请参阅:
- 自定义注入和生命周期管理