有没有办法改变注入所有资源和类的 UriInfo 的实现?我想保持大部分实现相同,但只更改其中的一部分(提供 UriBuilder 的部分 - 我想提供 UriBuilder 的不同实现)。
问问题
115 次
1 回答
1
您可以围绕原件创建包装器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
这样做,如果需要,您仍然可以注入原始文件。
也可以看看:
于 2016-05-01T01:53:30.127 回答