首页 > 解决方案 > 每个端点的自定义杰克逊解串器

问题描述

我想知道是否有一种方法可以自定义每个方法的 Jackson Deserializer:

@PostMapping("/first")
public void firstMethod(@RequestBody User user)
{
  ...
}
@PostMapping("/second")
public void secondMethod(@RequestBody User user)
{
  ...
}

在每个端点中,都需要一个 User 类。如果我理解正确,如果 HTTP 请求发送到带有数据的端点,Jackson 解析器将调用具有相应名称的设置器到正文数据中的属性,并尝试将所有内容设置为 1:1。如何更改每个端点的设置方式。

例如,在 firstMethod() 中,数据体以一种方式映射到 User 类,而在 secondMethod() 中,数据体以另一种方式映射到 User 类:

const data = {first: 1, second: 2, third: 3}

firstMethod 将创建一个用户

{something: 1, something2: 2, something3: 3}

secondMethod 将创建一个用户:

{something: 3, something2: 1, something3: 2}

举个例子。

标签: javaspring-bootjackson

解决方案


您可以HttpServletRequest手动注入并映射数据:

@Autowired
ObjectMapper objectMapper;

@PostMapping
public void foo(@RequestBody User user, HttpServletRequest request) {
    JsonNode json = objectMapper.readTree(request.getReader());
    // use JsonNode object to parse / map the data however you want
}

但我建议你应该问自己一个问题:为什么?

如果同一个 Java 类有两种不同的 JSON 表示,则可能应该使用两个不同的 Java DTO 类。


推荐阅读