我有很多项目正在慢慢从 Java 迁移到 Kotlin,但在从 Java POJO 更改为 Kotlin 数据类时遇到问题。Bean 验证在 REST 控制器中停止工作。我直接从https://start.spring.io创建了一个非常简单的项目来演示失败。
@SpringBootApplication
class RestValidationApplication
fun main(args: Array<String>) {
runApplication<RestValidationApplication>(*args)
}
@RestController
class Controller {
@PostMapping
fun test(@Valid @RequestBody request: Test) {
println(request)
}
}
data class Test(@field:NotNull val id: String)
Run Code Online (Sandbox Code Playgroud)
和梯度:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.6.1"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.6.0"
kotlin("plugin.spring") version "1.6.0"
}
group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect") …Run Code Online (Sandbox Code Playgroud) 从 Spring Boot 2.1.10 迁移到 2.2.4 后,以下方法开始返回参数 null params。这不是 Spring 中的错误,因为当我制作一个小示例项目时它会起作用。它也适用于没有 Content-Type 的普通 GET 和 POST:application/x-www-form-urlencoded。
@PostMapping(path = "/test", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public void test(@RequestParam Map<String, String> params) {
System.out.println(params);
}
Run Code Online (Sandbox Code Playgroud)
我触发了下面的请求,该请求适用于一个项目,但不适用于另一个项目。我尝试禁用所有过滤器和参数解析器,但没有任何效果。
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "param1=1¶m2=2" http://localhost:8080/test
Run Code Online (Sandbox Code Playgroud)
任何帮助或想法将不胜感激。另外,如果有人可以指出 Spring 解析参数的位置,我可以尝试调试并看看会发生什么。