Spring Boot 前端传入字段全大写使用@RequestBody不能接到参数

464 阅读1分钟

如果前端传入的字段全大写,使用@RequestBody注解无法正确接收参数。这是因为Spring MVC默认将所有属性名都转换为小写字母,以避免与Java中的驼峰命名法冲突。但是,如果前端发送的JSON数据中属性名与Java类中的属性名不一致,就会导致无法正确解析请求体数据。

为了解决这个问题,可以在Spring MVC配置文件中添加一个MessageConverter来自定义属性名的解析方式。具体步骤如下:

  1. 创建一个实现MessageConverter接口的类,并重写convertToEntity方法和convertBackMethod方法。其中,convertToEntity方法用于将JSON字符串转换为Java对象,而convertBackMethod方法用于将Java对象转换为JSON字符串。
        
java复制代码
public class UpperCaseFieldConverter implements MessageConverter<Object> {
    @Override
    public Object convertToEntity(String value) throws IOException, JMSException {
        // 将所有属性名转换为小写字母
        Map<String, String> map = new HashMap<>();
        JsonNode jsonNode = objectMapper.readTree(value);
        for (Map.Entry<String, JsonNode> entry : jsonNode.fields().entrySet()) {
            map.put(entry.getKey().toLowerCase(), entry.getValue().asText());
        }
        return map;
    }

    @Override
    public String convertBackToString(Object value) throws IOException, JMSException {
        throw new UnsupportedOperationException();
    }
}


    

在这个例子中,我们将所有属性名都转换为小写字母,然后将其存储在一个Map中返回。需要注意的是,在实际应用中,我们需要根据具体的业务需求来确定如何解析JSON数据。

  1. 在Spring MVC配置文件中添加一个MessageConverterRegistry bean,并将UpperCaseFieldConverter添加到其map集合中。
        
xml复制代码
<bean id="messageConverters" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="objectMapper" ref="objectMapper"/>
</bean>

<bean id="messageConverterRegistry" class="org.springframework.context.annotation.ConfigurationClassBeanFactoryScanningPostProcessor">
    <property name="basePackages" value="com.example.demo"/>
</bean>


    

在这个例子中,我们首先定义了一个MappingJackson2HttpMessageConverter bean来处理JSON数据的转换。然后,我们定义了一个messageConverterRegistry bean来注册自定义的UpperCaseFieldConverter。最后,我们在Spring Boot应用程序启动时会自动扫描指定包下的所有类,并注册它们作为可用的MessageConverter。