jackson Sping Boot @RequestBody默认的POJOMap行为?

jv2fixgn  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(234)

我有一个java类,其中的字段名是大写的,有些字段名是下划线,如下所示:

public class DATADto {
  private String UPPERCASE;
  private String UNDER_SCROLL;

  public String getUPPERCASE() { return UPPERCASE; }
  public void setUPPERCASE(String s) { UPPERCASE = s; }
  ...//setters and getters
}

我在一个接受spring rest控制器中的json的rest端点中使用了这个方法:

@RestController
@RequestMapping({"/api/path"})
public class MyRestController {
   @PostMapping(path = {"/Data"}, consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)

    public ResponseEntity<?> useDATADto(@RequestBody DATADto aDATADto ) {
     //do something
    }
}

默认情况下我需要发送哪些JSON字段?为什么?

7xllpg7q

7xllpg7q1#

故事是这样的..
默认情况下,Sping Boot 使用JacksonObjectMapper对Java对象进行序列化和反序列化。
在这个上下文中,我们所说的序列化是指将java对象转换为json,反序列化是相反的过程。
关于@RequestBody注解,在documentation中写入以下内容:
注解,指示应将方法参数绑定到Web请求得正文.请求得正文通过HttpMessageConverter传递,以根据请求得内容类型解析方法参数.或者,可以通过使用@Valid注解参数来应用自动验证.
简而言之,@RequestBody注解告诉Spring将传入的请求主体反序列化为作为参数传递给处理程序方法的对象。
由于Sping Boot 默认使用Jackson来序列化和反序列化REST API中的请求和响应对象,而Jackson使用MappingJackson2HttpMessageConverter,所以这将是Spring将使用的消息转换器实现。您可以阅读更多关于here的信息。
重要的是Jackson使用Java Bean naming约定来计算Java类中的json属性。实际上,它使用默认的PropertyNamingStrategy。以下是文档中所写的内容:
如果没有注册的自定义策略,则使用默认的Java属性命名策略,该策略将字段名称保持不变,并从方法中删除set/get/is前缀(以及大写字符的小写首字母序列)。
因此,由于您没有设置任何命名策略,它将使用默认策略。
正因为如此,如果你像这样发送有效载荷:

{
    "uppercase": "YOUR_VALUE",
    "under_scroll": "YOUR_VALUE"
}

这是行不通的,你会得到异常,因为Jackson不会在你的类中找到under_scroll属性,它会寻找under_SCROLL,因此这个有效负载:

{
    "uppercase": "YOUR_VALUE",
    "under_SCROLL": "YOUR_VALUE"
}

都可以。
若要更改默认PropertyNamingStrategy,请选中this项目

2vuwiymt

2vuwiymt2#

它将取决于Jackson属性的命名策略。默认值为LOWER_CAMEL_CASE,因此请求主体应如下所示:

{
    "uppercase": "test",
    "under_scroll": "test"
}

有关Jackson命名策略的所有可能配置,请参阅文档«Class PropertyNamingStrategy»
如果您使用的是Spring,则可以使用此属性来配置命名策略:

spring.jackson.property-naming-strategy

另一种可能的方法是bean配置:

@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
     Jackson2ObjectMapperBuilder jacksonMapper = new Jackson2ObjectMapperBuilder();
     jacksonMapper.propertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE);
     return jacksonMapper;
}

附加说明:

您当前的命名方法没有遵循Java代码约定。如果您需要使用某种特定的命名格式来处理JSON,最好在POJO的字段上使用@JsonProperty注解。
请参见下面的示例:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@Data
public class DATADto {
    @JsonProperty("UPPERCASE")
    private String uppercase;
    @JsonProperty("UNDER_SCROLL")
    private String underScroll;
}
pgccezyw

pgccezyw3#

您应该使用以下请求正文将发布请求发送到/api/path/data

{
    "uppercase": "YOUR_VALUE",
    "under_scroll": "YOUR_VALUE"
}

相关问题