0

有没有办法改变注入所有资源和类的 UriInfo 的实现?我想保持大部分实现相同,但只更改其中的一部分(提供 UriBuilder 的部分 - 我想提供 UriBuilder 的不同实现)。

4

1 回答 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 回答