Spring Boot 如何禁用特定数据类的构造函数参数的自动空值检查?

vq8itlhq  于 2023-01-20  发布在  Spring
关注(0)|答案(1)|浏览(96)

我的Sping Boot 应用程序中有一个端点,例如

data class SomeRequest(
    @field:NotNull
    val someField: String?
)

@RestController
class SomeController {

    @PostMapping(value = ["/something"])
    fun something(@RequestBody @Valid someRequest: SomeRequest) {
        someRequest.someField!!
    }

}

而且虽然我可以肯定someField永远不会是null,但我仍然需要在每次使用!!时添加它。
不幸的是,我不能将此字段的类型更改为String,因为这样Kotlin将向构造函数添加自动空值检查,从而导致反序列化失败并阻止执行验证。
我正在寻找的是一种抑制自动空检查的方法。是否有一个注解或类似的东西,我可以在特定的类/字段使用?(不想禁用它的全局)

data class SomeRequest(
    @field:NotNull
    @NoIntrinsicNullCheck
    val someField: String?
)
7cwmlq89

7cwmlq891#

使用最小配置:
玛文:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-reflect</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

Spring启动应用程序:

@SpringBootApplication
class SpringSandboxApplication

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

和控制器:

import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController
import javax.validation.Valid
import javax.validation.constraints.NotNull

data class NullRequest(
    @field:NotNull
    val someField: String
)

@RestController
class NullCheckController {

    @PostMapping(value = ["/something"])
    fun request(@RequestBody @Valid body: NullRequest): String {
        return body.someField
    }
}

我对数据序列化没有问题:

usr@sars-cov-2 spring-sandbox % curl localhost:8080/something -X POST -d '{}' --header Content-Type:\ application/json   
{"timestamp":"2023-01-19T12:08:04.602+00:00","status":400,"error":"Bad Request","path":"/something"}%     

usr@sars-cov-2 spring-sandbox % curl localhost:8080/something -X POST -d '{"someField": "abc"}' --header Content-Type:\ application/json   
abc%

应用程序日志:
2023 - 01 - 19 13:08:04.601警告70989---[nio-8080-exec-3]. w.s.m.s.默认处理程序异常解析程序:已解决[org. springframework. http. converter. HttpMessage不可读异常:JSON解析错误:JSON属性someField的[简单类型,类com. example. springsandbox. rest. NullRequest]值的示例化失败,原因是创建者参数someField的值缺失(因此为NULL),该参数是不可为空的类型;嵌套异常为com. fasterxml. jackson. module. kotlin。缺少kotlin参数异常:JSON属性someField的[简单类型,类com. example. springsandbox. rest. NullRequest]值示例化失败,原因是创建者参数someField的值缺失(因此为NULL),该参数在[Source:(组织.Spring框架.实用程序.流实用程序$非关闭输入流);行:1,列:2](通过参考链:["某个字段"])]
所以我猜你的配置有问题?也许你没有为kotlin导入一个正确的序列化库(比如从com.fasterxml.jackson.module导入jackson-module而不是jackson-module-kotlin)或者有些库过时了?
顺便说一句,有了这样的配置,验证器field:NotNull就不需要了。没有它,也会得到同样的结果。

相关问题