球衣注射
Jersey injection
有没有办法更改注入到所有资源和 类 中的 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
到 return 您的自定义 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
。
另请参阅:
有没有办法更改注入到所有资源和 类 中的 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
到 return 您的自定义 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
。
另请参阅: