#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")