Java RecordsJEP359作为Spring Controller请求和响应DTO

问题描述

我只是在尝试这些新的Java记录,我想知道是否可以将它们用作Spring Boot应用程序中请求/响应类型的DTO。

因此,我只修改了一些代码(带有很多样板获取程序/记录器的类),编译并启动了我的应用程序。尝试一些其他的端点,我得到的只是一个异常,告诉我:

No serializer found for class x.y.CreateNewShopListeCommand$Item and no properties discovered to create BeanSerializer (to avoid exception,disable SerializationFeature.FAIL_ON_EMPTY_BEANS

好的,记录不会创建'get'前缀的getter方法。现在我想知道:是否可以将记录用作Spring Boot控制器的请求/响应类型?

编辑:示例应用程序(https://github.com/kaipaysen/playground-jdk14-records-as-dto

// HelloController.java
@RestController
@RequestMapping("/hello")
public class HelloController {
    
    public record HelloRequest(
        @JsonProperty("name") String name
    ) {}

    public record HelloResponse(
        @JsonProperty("message") String message
    ) {}

    @RequestMapping(method = RequestMethod.POST)
    public HelloResponse hello(@RequestBody @Valid HelloRequest query) {
        return new HelloResponse("Hello " + query.name());
    }
    
}

呼叫curl -X POST -H "Content-Type: application/json" -d '{"name":"Max"}' http://localhost:8080/hello返回{"message":"Hello null"}。调试hello显示该请求未正确反序列化。那个地方有什么想法吗?

EDIT#2: 刚刚在FasterXML存储库中发现了此问题Support for JDK 14 record types #2709。他们正在为杰克逊2.12进行开发。

解决方法

您需要将此类级别的注释添加到您的记录中。

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

在杰克逊1.12版中,它应该没有注释即可使用。

我认为这是Jackson的错误,您需要在记录中添加第二个字段,因为它不适用于只有一个字段的记录。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...