【问题标题】:Dependency injection does not work in RestClientBuilderListener依赖注入在 RestClientBuilderListener 中不起作用
【发布时间】:2020-04-11 09:15:41
【问题描述】:

我遵循 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 为空。如何在 Quarkus 客户端注册全球提供商?

【问题讨论】:

    标签: quarkus microprofile quarkus-rest-client


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我试过了,但没有找到所需类型的 bean [class org.acme.rest.client.MyExceptionMapper] 和限定符 [ [ ] ] 它不应该只是因为假设默认而工作吗限定词?
    • 甚至没有添加默认注释并使用 CDI.current().select(MyExceptionMapper.class, new AnnotationLiteral() {}).get();成功了吗?
    • 另外,有没有办法在不使用 ServiceLoader 机制的情况下全局注册提供者?
    • 它仅在添加 Provider 和 ApplicationScoped 注释时才有效。此外,MyListener 上不需要 ApplicationScoped 注释。不过,对 Provider 注释的需求对我来说毫无意义。我有许多其他要注入 MyListener 的 bean,它们不是 JAX-RS 提供程序,但 CDI 只会在它们被标记为提供程序时注入它们。为什么?但我想这是另一个话题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2023-02-24
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多