【记录】在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示
【问题】:在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示
问题复现:
实体类
package com.zlp.aspect.entity;import java.math.BigDecimal;/*** @program: my_utils* @description:* @author: zlp* @create: 2024-09-24 10:01**/public class User {private String name;private BigDecimal high;public String getName() {return name;}public void setName(String name) {this.name = name;}public BigDecimal getHigh() {return high;}public void setHigh(BigDecimal high) {this.high = high;}}
模拟需求返回:
package com.zlp.aspect.controller;import com.zlp.aspect.entity.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @program: my_utils* @description:* @author: zlp* @create: 2024-09-24 09:53**/
@RestController
@RequestMapping("/bigdecimal")
public class BigDecimalTest {@RequestMapping("/test")public List<User> test() {List<User> users = new ArrayList<>();User user = new User();user.setName("码场小兵");user.setHigh(new BigDecimal("1.77"));users.add(user);User user1 = new User();user1.setName("码场老兵");user1.setHigh(new BigDecimal("1.80"));users.add(user1);return users;}
}
测试结果:
可以看到,我们定义的1.80后面的那个0没有显示出来。
问题解决:
1、自定义类继承JsonSerializer,重写serialize方法,以字符串形式序列化。
package com.zlp.aspect.config;import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;import java.io.IOException;
import java.math.BigDecimal;/**
*
* @desc 序列化时按字符串格式,保留为0的小数位
* @author
* @data
**/
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {@Overridepublic void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeString(value.toString());}
}
2、在实体类添加注解 @JsonSerialize(using = BigDecimalSerializer.class)
测试结果:
ps:在实际开发中与前端交互的vo还是建议都定义String类型,使用起来灵活、方便。