在Spring Boot应用程序中,如果你发现当请求体(RequestBody
)中的参数名是大写时无法接收到数据,这可能是因为HTTP请求的Content-Type头以及Spring Boot处理JSON的方式默认情况下对属性名称的大小写敏感。
当你使用@RequestBody
注解来接收一个对象时,Spring Boot会尝试将请求体中的JSON数据自动转换成对应的Java对象。如果JSON字段名称与Java类中的属性名称不匹配(包括大小写),那么这个字段就无法被正确地映射到Java对象中,从而导致该字段为null或者没有被设置。
解决这个问题的方法有几种:
-
修改JSON字段名称:
如果可以控制发送请求的一方,最直接的方法是让JSON字段名称和Java类中的属性名称保持一致(包括大小写)。 -
使用
@JsonProperty
注解:
在你的Java类中,你可以使用Jackson库提供的@JsonProperty
注解来指定JSON字段名称。这样即使JSON字段名称与Java属性名称不同也能正确映射。import com.fasterxml.jackson.annotation.JsonProperty;public class MyRequest {@JsonProperty("PARAM_NAME")private String paramName;// getters and setters }
-
自定义ObjectMapper配置:
你可以通过配置ObjectMapper
实例来改变默认的行为。例如,你可以配置ObjectMapper
忽略JSON字段的大小写:import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper mapper = new ObjectMapper();mapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);return mapper;} }
注意:这种方法会影响整个应用的所有序列化/反序列化行为,请谨慎使用。
-
使用Map接收参数:
如果你不想创建特定的POJO类,也可以直接用Map<String, Object>
来接收所有请求体的数据,然后根据键值手动处理数据。@PostMapping("/myEndpoint") public ResponseEntity<?> handleRequest(@RequestBody Map<String, Object> requestBody) {// 使用requestBody.get("PARAM_NAME")来获取值 }
请根据你的具体需求选择合适的解决方案。通常推荐使用@JsonProperty
或调整JSON字段名称以保持一致性,因为这些方法更为直观且易于维护。