Контроллер Java в проекте Kotlin SpringBoot

#java #spring #kotlin

Вопрос:

Новая/пустая заглушка проекта была создана с помощью инициализатора Spring в IntelliJ с использованием Kotlin в качестве языка выбора вместе с Gradle.

Однако добавление контроллера Java в корневой каталог проекта, похоже, не найдено при запуске приложения. Все конечные точки возвращают значение 404. Я протестировал контроллер Kotlin, и он работает так, как ожидалось.

Пример Java-Контроллера:

 @Controller
public class TestController {
    @PostMapping("/")
    public String test() {
        return "test";
    }
}
 

Пример контроллера Kotlin:

 @Controller
class TestController {
    @GetMapping("/")
    fun test(model: Model): String {
        return "test"
    }
}
 

build.gradle.kts:

 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.5.5"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
    kotlin("jvm") version "1.5.31"
    kotlin("plugin.spring") version "1.5.31"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

configurations {
    compileOnly {
        extendsFrom(configurations.annotationProcessor.get())
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    compileOnly("org.projectlombok:lombok")
    annotationProcessor("org.projectlombok:lombok")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "11"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}
 

Комментарии:

1. «Что я упускаю?» Минимальный, воспроизводимый код. Может быть несколько причин для вашей проблемы, чтобы правильно воспроизвести ее (и поддержать!) Я бы предложил вам отправить свой код (только необходимые части) в публичное репо git

2. Новый/пустой проект был просто создан из инициализатора Spring, как описано выше. Я добавил два примера контроллеров, которые я использовал для проверки этой проблемы.

3. Вы проверяли, включена ли проверка компонентов в пакете, в котором присутствует контроллер java? Если нет, попробуйте добавить для этого @ComponentScan.

4. Я действительно пытался сделать это @AmitMahajan, однако IntelliJ предупреждает меня, что это избыточно, и это также не устраняет проблему. Я предполагаю, что Spring сканирует только файлы .kt, а не файлы .java. Это где-то настраивается?

5. можете ли вы поделиться содержимым конфигурационных файлов?

Ответ №1:

Я предполагаю, что вы используете Spring MVC. Вы уверены, что у вас есть представление «тест»? Потому что это тоже может быть проблемой. Попробуйте прокомментировать его с RestController помощью вместо Controller и посмотрите, возвращает ли он что-нибудь. Для целей этого теста я бы тоже удалил параметр метода

Комментарии:

1. Перепробовал все эти предложения, однако безуспешно!

2. @John это работает нормально, убедитесь, что у вас есть @ComponentScan(«пример») в демо-приложении kotlin, и такой же соответствующий пример пакета находится в разделе исходный код основной java, содержащий ваш Java-контроллер. Кроме того, сопоставьте его с другим путем. Если это все еще не работает, создайте проект снова и импортируйте его снова.

Ответ №2:

Для меня это прекрасно работает. Убедитесь, что вы поместили контроллер java в каталог source -> main ->> java, а не в каталог source ->>> main ->>>> котлин Убедитесь, что java включена при импорте проекта в Intellij.

Вот настройки: демпапликация:

 @SpringBootApplication
@ComponentScan("example")
class DemoApplication

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
}
 

Контроллер Java:

 @RestController
public class UserController {
    @GetMapping("/user")
    public String test() {
        return "test";
    }
}
 

Зависимости:

 implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-data-rest")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    compileOnly("org.projectlombok:lombok")
    runtimeOnly("org.hsqldb:hsqldb")
    annotationProcessor("org.projectlombok:lombok")
    testImplementation("org.springframework.boot:spring-boot-starter-test")