我有一个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字段?为什么?
3条答案
按热度按时间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前缀(以及大写字符的小写首字母序列)。
因此,由于您没有设置任何命名策略,它将使用默认策略。
正因为如此,如果你像这样发送有效载荷:
这是行不通的,你会得到异常,因为Jackson不会在你的类中找到
under_scroll
属性,它会寻找under_SCROLL
,因此这个有效负载:都可以。
若要更改默认
PropertyNamingStrategy
,请选中this项目2vuwiymt2#
它将取决于Jackson属性的命名策略。默认值为
LOWER_CAMEL_CASE
,因此请求主体应如下所示:有关Jackson命名策略的所有可能配置,请参阅文档«Class PropertyNamingStrategy»
如果您使用的是Spring,则可以使用此属性来配置命名策略:
另一种可能的方法是bean配置:
附加说明:
您当前的命名方法没有遵循Java代码约定。如果您需要使用某种特定的命名格式来处理JSON,最好在POJO的字段上使用
@JsonProperty
注解。请参见下面的示例:
pgccezyw3#
您应该使用以下请求正文将发布请求发送到
/api/path/data
: