【问题】:在返回值类型为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> {
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.toString());
}
}
2、在实体类添加注解 @JsonSerialize(using = BigDecimalSerializer.class)
测试结果:
ps:在实际开发中与前端交互的vo还是建议都定义String类型,使用起来灵活、方便。