球衣注射

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

另请参阅: