【问题标题】:Quarkus: Inject config properties into service class doesn't workQuarkus:将配置属性注入服务类不起作用
【发布时间】:2021-04-17 08:52:44
【问题描述】:

我在 Quarkus 中将配置类注入服务类时遇到了一些问题。 我有这个配置类:

import io.quarkus.arc.config.ConfigProperties;

@ConfigProperties(prefix = "database")
public class TestConfig {
    public String url = "http://localhost:8086";
    public String user;
    public String password;
    public String name;
    public ColumnConfig column;
    public int pagination = 1000;


    public static class ColumnConfig {
        public String value = "value";
        public String device;
        public String type;
    }
}

当我使用它时,我的资源类很好

@Path("/measurements")
@Tag(name = "measurements")
@Produces(MediaType.APPLICATION_JSON)
public class MeasurementResource {

    @Inject
    MeasurementService delegate;

    @Inject
    TestConfig config;

    @GET
    @Path("/last")
    public MeasurementResult getLastMeasurements() {
        System.out.println(config.url); //works
        //...

    }

但我实际上想使用 MeasurementService 类。但它在那里不起作用。

@ApplicationScoped
public class MeasurementService {
    
    private static InfluxDBMapper mapper;
    
    @Inject
    TestConfig config;

    public MeasurementService() {
        System.out.println(config.url);     // exception here
        System.out.println(config.password);
        System.out.println(config.column.tenant);
        config = DatabaseConfig.getInstance();
        InfluxDB influxDB = InfluxDBFactory.connect(config.url, config.user, config.password);
        //...

我收到一个异常,指出因 NullPointerException 而无法注入 MeasurementService。执行打印命令时发生异常。我在上面的sn-p中做了标记。

org.jboss.resteasy.spi.UnhandledException: java.lang.RuntimeException: Error injecting de.*.services.MeasurementService de.*.resources.MeasurementResource.delegate
    at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:381)
    at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:218)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:519)
    at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261)
    at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161)
    at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
    at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247)
    at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73)
    at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:136)
    at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.access$000(VertxRequestHandler.java:40)
    at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:97)
    at io.quarkus.runtime.CleanableExecutor$CleaningRunnable.run(CleanableExecutor.java:231)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2046)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1578)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
    at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
    at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
    at java.base/java.lang.Thread.run(Thread.java:834)
    at org.jboss.threads.JBossThread.run(JBossThread.java:479)
Caused by: java.lang.RuntimeException: Error injecting de.*.services.MeasurementService de.*.resources.MeasurementResource.delegate
    at de.*.resources.MeasurementResource_Bean.create(MeasurementResource_Bean.zig:171)
    at de.*.resources.MeasurementResource_Bean.create(MeasurementResource_Bean.zig:194)
    at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:96)
    at io.quarkus.arc.impl.AbstractSharedContext.access$000(AbstractSharedContext.java:14)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:29)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:26)
    at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
    at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
    at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:26)
    at de.*.resources.MeasurementResource_Bean.get(MeasurementResource_Bean.zig:226)
    at de.*.resources.MeasurementResource_Bean.get(MeasurementResource_Bean.zig:242)
    at io.quarkus.arc.impl.ArcContainerImpl.beanInstanceHandle(ArcContainerImpl.java:435)
    at io.quarkus.arc.impl.ArcContainerImpl.beanInstanceHandle(ArcContainerImpl.java:448)
    at io.quarkus.arc.impl.ArcContainerImpl$1.get(ArcContainerImpl.java:271)
    at io.quarkus.arc.impl.ArcContainerImpl$1.get(ArcContainerImpl.java:268)
    at io.quarkus.arc.runtime.BeanContainerImpl$1.create(BeanContainerImpl.java:35)
    at io.quarkus.resteasy.common.runtime.QuarkusConstructorInjector.construct(QuarkusConstructorInjector.java:54)
    at org.jboss.resteasy.plugins.server.resourcefactory.POJOResourceFactory.createResource(POJOResourceFactory.java:71)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:386)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:68)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:492)
    ... 20 more
Caused by: java.lang.NullPointerException
    at de.*.services.MeasurementService.<init>(MeasurementService.java:43)
    at de.*.MeasurementService_ClientProxy.<init>(MeasurementService_ClientProxy.zig:24)
    at de.*.MeasurementService_Bean.proxy(MeasurementService_Bean.zig:40)
    at de.*.MeasurementService_Bean.get(MeasurementService_Bean.zig:221)
    at de.*.services.MeasurementService_Bean.get(MeasurementService_Bean.zig:237)
    at de.*.resources.MeasurementResource_Bean.create(MeasurementResource_Bean.zig:154)
    ... 40 more

我想有一个问题,因为我尝试将一个类注入到一个也注入到其他地方的类中,但我不确定并希望有一个解决方案。

谢谢。

编辑:

解决方案是在构造函数中注入类,如下所示:

@ApplicationScoped
public class MeasurementService {
    
    private static InfluxDBMapper mapper;
    
    @Inject
    public MeasurementService(TestConfig config) {

感谢卢卡的想法。

【问题讨论】:

    标签: java rest dependency-injection jax-rs quarkus


    【解决方案1】:

    我对此不是 100% 确定,但是属性是在对象构造之后绑定的;这就是TestConfig config 为空的原因。
    改用构造函数注入: @Inject public MeasurementService(TestConfig config)

    【讨论】:

    • 太棒了,谢谢。不知道构造函数注入。但实际上注入注解必须在构造函数签名之上,而不是在其中。然后它就可以正常工作了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2016-07-07
    • 2021-05-13
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多