在 ClientHeadersFactory 中注入 bean 不起作用
Injection of bean inside ClientHeadersFactory doesn't work
我正在构建一个 Quarkus 应用程序,它使用 resteasy 处理 http 请求并使用 restclient 调用另一个 api,我需要传播一个 header 并动态添加另一个,所以我添加了一个class 实现了 ClientHeadersFactory。
代码如下:
@ApplicationScoped
public abstract class MicroServicesHeaderHandler implements ClientHeadersFactory {
@Inject
MicroServicesConfig config;
@Override
public MultivaluedMap<String, String> update(MultivaluedMap<String, String> incomingHeaders,
MultivaluedMap<String, String> clientOutgoingHeaders) {
// Will be merged with outgoing headers
return new MultivaluedHashMap<>() {{
put("Authorization", Collections.singletonList("Bearer " + config.getServices().get(getServiceName()).getAccessToken()));
put("passport", Collections.singletonList(incomingHeaders.getFirst("passport")));
}};
}
protected abstract String getServiceName();
我的问题是配置注入不起作用。正如 ClientHeadersFactory
的 javadoc 中所述,我尝试使用 @Inject
和 @Context
。我还尝试使 class 成为非抽象的,但它并没有改变任何东西。
MicroServicesConfig 是一个 @Startup
bean,因为它需要在调用 Quarkus.run()
之前进行初始化,否则热重载将不再起作用,因为它需要处理请求。
这是代码仅供参考:
@Getter
@Startup
@ApplicationScoped
public final class MicroServicesConfig {
private final Map<String, MicroService> services;
MicroServicesConfig(AKV akv, ABS abs) {
// some code to retrieve an encrypted file from a secure storage, decrypt it and initialize the map out of it
}
这似乎是 ClientHeadersFactory
的问题,因为如果我将我的 bean 注入到我的主 class (@QuarkusMain
) 中,它就可以工作。然后我可以将地图分配给一个 public 静态地图,然后我可以使用 Application.myPublicStaticMap
从我的 HeaderHandler 访问它,但这很丑陋,所以我真的希望避免这种情况。
我在网上搜索过,看到有几个人遇到了同样的问题,但根据这个 blogpost, or this one,它应该从 Quarkus 1.3 和 MicroProfile 3.3 (RestClient 1.4) 开始工作,而我使用的是 Quarkus 1.5。 2.
即使是第二个 link 中的示例也无法通过注入 UriInfo 对我起作用,因此问题并非来自我尝试注入的 bean。
几周来我一直在为此苦苦挣扎,现在我真的很想摆脱我的解决方法。
我可能只是错过了一些东西,但这让我发疯了。
在此先感谢您的帮助。
这个问题终于在 Quarkus 1.8 中得到解决。
我正在构建一个 Quarkus 应用程序,它使用 resteasy 处理 http 请求并使用 restclient 调用另一个 api,我需要传播一个 header 并动态添加另一个,所以我添加了一个class 实现了 ClientHeadersFactory。
代码如下:
@ApplicationScoped
public abstract class MicroServicesHeaderHandler implements ClientHeadersFactory {
@Inject
MicroServicesConfig config;
@Override
public MultivaluedMap<String, String> update(MultivaluedMap<String, String> incomingHeaders,
MultivaluedMap<String, String> clientOutgoingHeaders) {
// Will be merged with outgoing headers
return new MultivaluedHashMap<>() {{
put("Authorization", Collections.singletonList("Bearer " + config.getServices().get(getServiceName()).getAccessToken()));
put("passport", Collections.singletonList(incomingHeaders.getFirst("passport")));
}};
}
protected abstract String getServiceName();
我的问题是配置注入不起作用。正如 ClientHeadersFactory
的 javadoc 中所述,我尝试使用 @Inject
和 @Context
。我还尝试使 class 成为非抽象的,但它并没有改变任何东西。
MicroServicesConfig 是一个 @Startup
bean,因为它需要在调用 Quarkus.run()
之前进行初始化,否则热重载将不再起作用,因为它需要处理请求。
这是代码仅供参考:
@Getter
@Startup
@ApplicationScoped
public final class MicroServicesConfig {
private final Map<String, MicroService> services;
MicroServicesConfig(AKV akv, ABS abs) {
// some code to retrieve an encrypted file from a secure storage, decrypt it and initialize the map out of it
}
这似乎是 ClientHeadersFactory
的问题,因为如果我将我的 bean 注入到我的主 class (@QuarkusMain
) 中,它就可以工作。然后我可以将地图分配给一个 public 静态地图,然后我可以使用 Application.myPublicStaticMap
从我的 HeaderHandler 访问它,但这很丑陋,所以我真的希望避免这种情况。
我在网上搜索过,看到有几个人遇到了同样的问题,但根据这个 blogpost, or this one,它应该从 Quarkus 1.3 和 MicroProfile 3.3 (RestClient 1.4) 开始工作,而我使用的是 Quarkus 1.5。 2. 即使是第二个 link 中的示例也无法通过注入 UriInfo 对我起作用,因此问题并非来自我尝试注入的 bean。
几周来我一直在为此苦苦挣扎,现在我真的很想摆脱我的解决方法。 我可能只是错过了一些东西,但这让我发疯了。
在此先感谢您的帮助。
这个问题终于在 Quarkus 1.8 中得到解决。