问题描述
我只是在尝试这些新的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的错误,您需要在记录中添加第二个字段,因为它不适用于只有一个字段的记录。