依赖注入在RestClientBuilderListener中不起作用

时间:2020-04-11 09:15:41

标签: quarkus microprofile quarkus-rest-client

我遵循了Quarkus网站上的其他客户端指南。它工作正常。但是,当按照规范中所述使用ServiceLoader模式注册全局提供程序时,CDI bean注入无效,它们都为空。我下载了示例,仅添加了以下类:

package org.acme.rest.client;

import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper;

import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.core.Response;

@ApplicationScoped
public class MyExceptionMapper implements ResponseExceptionMapper<Exception> {

    @Override
    public Exception toThrowable (Response response) {
        return new Exception();
    }
}
package org.acme.rest.client;

import org.eclipse.microprofile.rest.client.RestClientBuilder;
import org.eclipse.microprofile.rest.client.spi.RestClientBuilderListener;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

@ApplicationScoped
public class MyListener implements RestClientBuilderListener {

    @Inject MyExceptionMapper myExceptionMapper;

    @Override
    public void onNewBuilder (RestClientBuilder builder) {
        builder.register(myExceptionMapper);
    }
}

我还添加了文件META-INF / services / org.eclipse.microprofile.rest.client.spi.RestClientBuilderListener和内容org.acme.rest.client.MyListener。调用MyListener onNewBuilder方法,但注入的提供程序MyExceptionMapper为null。如何在Quarkus客户端中注册全局提供者?

1 个答案:

答案 0 :(得分:0)

RestClientBuilderListener的实现不是CDI bean,它们只是使用RestClientBuilder时通过常规Java ServiceLoader机制创建的对象。

因此,如果要在调用onNewBuilder时获取CDI bean,可以执行以下操作:

CDI.current().select(MyExceptionMapper.class).get()

此外,您需要使用@Provider而不是MyExceptionMapper来注释@ApplicationScoped