一文让你明白@RequestBody接收不到boolean值的原因

本文探讨了boolean和Boolean的区别,指出在容器使用场景、toString/valueOf转换和JPA中的选择。同时揭示了前后端开发中boolean参数接收问题的解决方案,通过@JsonProperty调整属性名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、boolean和Boolean的区别和使用场景

  1. boolean是基本数据类型,Boolean是它的封装类,和其他类一样,有属性有方法。他们的关系其实是:Boolean 是boolean 的实例化对象类,和Integer对应int一样。
  2. 知道了他们的区别,那我们就可以知道该使用boolean还是Boolean了,第一个就是我们在使用容器内需要装布尔值的时候,这时候我们别无选择,只能使用Boolean类。其次,当我们需要用到toString()valueOf()方法与String相互转换的场景应该使用Boolean类。比如,
Boolean.valueOf(target);

        来转换成Boolean对象。

        3.除此之外,在使用JPA(Java Persistence API的过程中还是觉得使用boolean更有优势,因为我们只需要进行true/false的标记,就直接用boolean即可。

二、用boolean时接收不到前端参数

在使用前后端分离开发中,往往用Json传参是最高效的方式之一,但是我们可能遇到接收不到boolean类型(默认值是false)的参数。

这种情况其实是因为我们定义boolean参数的时候加了“is”,比如

private boolean isDeleted;

它的方法也是isDeleted(),RPC框架在反向解析的时候,会误判deleted才是属性名称,导致属性获取不到,进而产生抛出异常或者传参失败等情况。

三、解决办法

  1. @JsonProperty是作用在实体类的属性上的,把属性的名称序列化另一个名称,属性名称和@JsonProperty("")里面的名称是映射关系。比如数据库字段是"is_deleted",实体类属性名称是"isDeleted",这种情况,只需加上@JsonProperty("isDeleted")就能获取到Json的传参了
  2. 综上,解决办法是:
@JsonProperty("isDeleted")
private boolean isDeleted;

    @JsonProperty(value = "is_deleted")
    public boolean isDeleted() {
        return deleted;
    }
    @JsonProperty(value = "is_deleted")
    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }

Spring MVC中,如果你希望`@RequestBody`注解接收的数据对大小写敏感,你可以通过自定义一个`HttpMessageConverter`来实现。具体步骤如下: 1. 创建一个实现了`org.springframework.http.converter.HttpMessageConverter`接口的类,比如`CaseInsensitiveBodyConverter`。 ```java public class CaseInsensitiveBodyConverter implements HttpMessageConverter<Object> { // ...省略一些基本的构造函数和方法 @Override public boolean canRead(Class<?> clazz, MediaType mediaType) { return String.class.isAssignableFrom(clazz); } @Override public Object read(Class<? extends Object> clazz, HttpInputMessage inputMessage) throws IOException, ConversionFailedException { String requestBody = new String(inputMessage.getBody(), StandardCharsets.UTF_8); return requestBody.toLowerCase(); // 这里将所有字符转换为小写 } // ...其他必要的方法,如write等 } ``` 2. 注册这个自定义的`HttpMessageConverter`到Spring的WebMvcConfigurationSupport中,通常是在`configureMessageConverters`方法中添加: ```java @Autowired private ObjectMapper objectMapper; @Bean public CaseInsensitiveBodyConverter caseInsensitiveBodyConverter() { return new CaseInsensitiveBodyConverter(objectMapper); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(caseInsensitiveBodyConverter()); // 如果还有其他默认的转换器,可以在这里配置它们 } ``` 这样,当Spring MVC接收到大小写混合的请求体时,它会自动使用`CaseInsensitiveBodyConverter`并将其转换为小写形式再进行下一步处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值