【发布时间】:2016-04-30 22:01:47
【问题描述】:
有没有办法改变注入到所有资源和类中的 UriInfo 的实现?我想保持大部分实现相同,但只更改其中的一部分(提供 UriBuilder 的部分 - 我想提供 UriBuilder 的不同实现)。
【问题讨论】:
标签: dependency-injection jersey jersey-2.0 uribuilder
有没有办法改变注入到所有资源和类中的 UriInfo 的实现?我想保持大部分实现相同,但只更改其中的一部分(提供 UriBuilder 的部分 - 我想提供 UriBuilder 的不同实现)。
【问题讨论】:
标签: dependency-injection jersey jersey-2.0 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,请查看this post。
现在你应该可以注入它了
@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。
另请参阅:
【讨论】: