我安装了 jackson-kotlin 模块
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>2.18.1</version>
</dependency>
并配置
@Configuration
open class JacksonConfig {
@Bean
open fun objectMapper(): ObjectMapper {
return ObjectMapper().registerKotlinModule()
}
}
但是当我尝试向此端点发送请求时
@PostMapping("/test")
fun test(@RequestBody promptRequest: PromptRequest): ResponseEntity<String> {
return ResponseEntity(promptRequest.prompt, HttpStatus.OK)
}
因 HTTP 400 错误请求而失败
HTTP/1.1 400
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/problem+json
Transfer-Encoding: chunked
Date: Tue, 12 Nov 2024 09:00:56 GMT
Connection: close
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Failed to read request",
"instance": "/test",
"properties": null
}
当 PromptRequest 是 Kotlin(数据)类时:
data class PromptRequest (val prompt: String)
但是,当 PromptRequest 是 Java 类时,像这样:
public class PromptRequest {
public String prompt;
}
一切正常,我得到了 HTTP 200 OK:
HTTP/1.1 200
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: text/plain;charset=UTF-8
Content-Length: 42
Date: Tue, 12 Nov 2024 09:05:08 GMT
input prompt
Response code: 200; Time: 3171ms (3 s 171 ms); Content length: 12 bytes (12 B)
我认为使用 Kotlin DTO 的 HTTP 400 Bad Request 是由于缺少 Jackson Kotlin 模块造成的,因此我安装并配置了它,但它没有帮助。 我的预期结果是在这两种情况下它都应该返回 HTTP 200 OK。为什么不这样做呢? 该项目混合了 Java 和 Kotlin。使用 Spring Boot。
由于这是一个正常的 HTTP 400 错误请求,因此服务器日志不会显示任何信息。
@JsonCreator
没有必要。
就我而言,这效果很好:
@Configuration
class ObjectMapperConfig {
@Bean
fun makeObjectMapper(): ObjectMapper {
return JsonMapper.builder()
.addModule(KotlinModule.Builder().configure(KotlinFeature.StrictNullChecks, true).build())
.addModule(JavaTimeModule())
// other custom: .addModule(....)
.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.build()
}
}