泽西岛注射



是否有方法更改注入所有资源和类的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即可返回您的自定义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

另请参阅:

  • 自定义注入和生命周期管理

相关内容

  • 没有找到相关文章

最新更新