当前位置: 首页 > 知识库问答 >
问题:

带有@Singleton注释未实例化的Kotlin类的Micronaut

王棋
2023-03-14

我有一个Micronaut应用程序,它的模块都是用Java和Kotlin编写的。Java模块(控制器逻辑)有一个接口,由指定@Singleton注释的Kotlin类实现。

package com.example.controllers;

import com.example.service.Message;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

import javax.inject.Inject;

@Controller("/hello")
public class DemoController {

    private Message message;
    @Inject
    public DemoController(Message message) {
        this.message = message;
    }

    @Get(produces = MediaType.TEXT_PLAIN)
    public String sayHello() {
        return message.getMessage();
    }
}
package com.example.service;

public interface Message {

    String getMessage();
}
package com.example.service

import javax.inject.Singleton

@Singleton
class MessageImpl: Message {
    override fun getMessage(): String {
        return "hello"
    }

}

注意:https://github.com/micronaut-projects/micronaut-core/discussions/5254有应用程序jar(demo.zip)和复制步骤。

共有1个答案

寇靖
2023-03-14

问题是您的项目配置不正确。您使用的是Kotlin,但是build.gradle文件只为Java配置。如果您使用Launch创建了一个新的Kotlin应用程序,您可以获得一个正确构建的示例。我唯一改变的是main类,因为您使用的是Java类,而不是Kotlin类。

这是完整的build.gradle:

plugins {
    id("org.jetbrains.kotlin.jvm") version "1.4.30"
    id("org.jetbrains.kotlin.kapt") version "1.4.30"
    id("org.jetbrains.kotlin.plugin.allopen") version "1.4.30"
    id("com.github.johnrengelman.shadow") version "6.1.0"
    id("io.micronaut.application") version "1.4.2"
}

version = "0.1"
group = "com.example"

repositories {
    mavenCentral()
}

micronaut {
    runtime("netty")
    testRuntime("junit5")
    processing {
        incremental(true)
        annotations("com.example.*")
    }
}

dependencies {
    implementation("io.micronaut:micronaut-http-client")
    implementation("io.micronaut:micronaut-runtime")
    implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
    implementation("javax.annotation:javax.annotation-api")
    implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
    implementation("io.micronaut:micronaut-validation")
    runtimeOnly("ch.qos.logback:logback-classic")
    runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")
}


application {
    mainClass.set("com.example.Application")
}
java {
    sourceCompatibility = JavaVersion.toVersion("11")
}

tasks {
    compileKotlin {
        kotlinOptions {
            jvmTarget = "11"
        }
    }
    compileTestKotlin {
        kotlinOptions {
            jvmTarget = "11"
        }
    }
}
 类似资料:
  • 问题内容: 我目前正在尝试将Dagger 2集成到Android应用程序中。我的项目设置如下: 图书馆 应用(取决于库) 在我的库项目中,我定义了一个类,稍后将其插入到库以及应用程序项目中的其他需要该类的类(活动和常规类)中。 现在-例如在我的“片段”或“活动”或常规类中,我将上述Singleton注入如下: 大概我想,因为实际上myManager始终为null。显然,它的构造函数也从未被调用过,

  • 我目前正在尝试将匕首2集成到一个Android应用程序中。我的项目设置如下: 库 应用程序(取决于库) 在我的library项目中,我定义了一个类,以后我将把它注入到库和app项目中需要它的其他类(活动和常规类)中。 我也是这么想的,因为实际上myManager总是空的。很明显,它的构造函数也从来没有被调用过,所以我想我一定遗漏了一些配置方面的东西?或者也许我误解了文档,它根本不是这样工作的?My

  • 我有这个问题,无法理解如何修复它,任何帮助都将得到评估。我需要用一些身份验证来保护REST方法,并且我在我的应用程序中有几个角色。我在我的类中的方法中放置了注释,实现了一些接口和Spring没有创建没有任何日志消息的bean(在我的例子中)。但是如果类没有实现接口-bean创建得很好。 在代码中,它如下所示: 控制器: 接口: 在我的情况下,控制器bean没有创建。但是如果我删除一切都会正常工作,

  • 若要使用2.3.0之前的Android注释,可以执行以下操作: 要使用Kotlin,您可以使用而不是(链接)。 所以我清理并重建了这个项目。似乎annotations没有为MainActivity生成下划线文件。有道理但我不知道为什么或者怎么解决。

  • 从Dagger2文档中,我注意到您可以有一个注释类。将类标记为的目的是什么,因为我在代码中尝试过这样做,但没有生成singleton对象。我不清楚用这个注释标记我的类有什么用。 从文档中,请关注以下声明: injectable类上的@Singleton注释也可用作文档。它提醒潜在的维护者,该类可能由多个线程共享。*

  • 问题内容: 我已经找到了实例化Singleton的三种方法,但是我怀疑其中是否有最好的方法。我在多线程环境中使用它们,并且更喜欢延迟实例化。 范例1: 范例2: 范例3: 我正在使用ATM的项目到处都使用Sample 2,但我还是更喜欢Sample 3。还有Enum版本,但是我不明白。 这里的问题是- 在什么情况下我应该/不应该使用这些变体中的任何一个?我并不是在寻找冗长的解释(对此还有很多其他话