在 Spring Get Request 中使用 Kotlin DTO 作为 @RequestBody 会使所有请求都失败为错误请求

问题描述 投票:0回答:1

我安装了 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 错误请求,因此服务器日志不会显示任何信息。

java spring-boot kotlin jackson jackson-modules
1个回答
0
投票

@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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.