[JAVA] Beim Ändern des Controllers von Spring Web MVC in kotlin, @Autowired Die angegebene Komponente wird nicht injiziert und wird null

Der Originalartikel ist hier.

Angenommen, Sie haben eine Java-Klasse wie die folgende.

@Controller
@Scope("request")
@RequestMapping("/foo/bar")
public class FooBarController: Foo() {
    @Autowired
    FooBarService fooBarService;

    @RequestMapping(method = RequestMethod.GET)
    public String foo() {
        return fooBarService.doSomething();
    }
}

Wenn Sie dies automatisch in Koilin konvertieren, sieht es so aus.

@Controller
@Scope("request")
@RequestMapping("/foo/bar")
class FooBarController {
    @Autowired
    internal var fooBarService: FooBarService? = null

    @RequestMapping(method = arrayOf(RequestMethod.GET))
    fun foo(): String {
        return fooBarService!!.doSomething()
    }
}

Wenn dies unverändert bleibt, funktioniert Autowired von fooBarService nicht und bleibt null.

Wie in hier beantwortet,

@Controller
@Scope("request")
@RequestMapping("/foo/bar")
open class FooBarController(val fooBarService: FooBarService) {
    @RequestMapping(method = [RequestMethod.GET])
    open fun foo(): String {
        return fooBarService.doSomething()
    }
}

Autowired funktioniert, indem es offen für Unterricht und Spaß ist. Ich habe auch @Autowired entfernt, es in den Konstruktor verschoben und die Methodenarrays zu einer Klammer gemacht. Es ist schöner.

Nachtrag

Wenn Sie kotlin-spring wie in [hier] beschrieben verwenden (https://kotlinlang.org/docs/reference/compiler-plugins.html#spring-support), wird es der Klasse automatisch mit der Vererbungsanmerkung @Component hinzugefügt. Es scheint, dass es offen gewähren wird.

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
    }
}

apply plugin: "kotlin-spring" // instead of "kotlin-allopen"

Recommended Posts

Beim Ändern des Controllers von Spring Web MVC in kotlin, @Autowired Die angegebene Komponente wird nicht injiziert und wird null
Der offizielle Name von Spring MVC ist Spring Web MVC
So beheben Sie das Problem, dass beim Stoppen der Webanwendung kein Protokollierungsprotokoll ausgegeben wird
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]
Bibliothek nicht geladen, wenn versucht wird, die Ruby-Version und die Schienen zu aktualisieren
Wenn der Schwebeflug von Eclipse schwer zu sehen ist
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Die Idee, abzuschalten, wenn der Fehler nicht behoben ist
[Schienen] Wenn die Layoutänderung des Geräts nicht berücksichtigt wird
Wirf eine Ausnahme und fange, wenn es keinen Handler gibt, der dem Pfad im Frühjahr entspricht