很久没写代码了,最近写项目的时候,数据库有一些decimal相关的金额字段,此时是两位小数的,但是通过springboot使用mybatis查询之后,返回给前端的时候就会自动被去掉小数点后的0,例如数据库查询出来的金额是2.00元,我们希望返回给前端的是2.00元,但是springboot返回给前端的直接变成2了,这样子在页面显示的时候会发现有的金额带小数点,有的金额不带小数点,这样子看起来就很low,那么怎么办呢?
后来从网上查看到了解决办法,就是添加一下bigdecimal的格式序列化,详细步骤如下:
1、首先定义一个CustomerBigDecimalCodec的类
这个类主要是为了转化bigdecimal,让其返回的时候以字符串的方式返回(默认的springboot返回的json里面,bigdecimal不是字符串的方式返回的),示例代码如下:
package org.web.module.config;
import java.text.DecimalFormat;
import com.alibaba.fastjson.serializer.BeanContext;
import com.alibaba.fastjson.serializer.BigDecimalCodec;
import com.alibaba.fastjson.serializer.ContextObjectSerializer;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
/**
*
* @author daniel.jiang
*
*/
public class CustomerBigDecimalCodec extends BigDecimalCodec implements ContextObjectSerializer {
public final static CustomerBigDecimalCodec instance = new CustomerBigDecimalCodec();
@Override
public void write(JSONSerializer serializer, Object object, BeanContext context) {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeString("0.00");
return;
}
String format = context.getFormat();
System.out.println(format);
DecimalFormat decimalFormat = new DecimalFormat(format);
out.writeString(decimalFormat.format(object));
}
}2)配置json的序列化
这里我们再配置下json的序列化,完整示例代码如下:
package org.web.module.config;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
@Configuration
@EnableWebMvc
public class ConfigurerAdapter implements WebMvcConfigurer {
/**
* 自定义消息转换器
* Sprintboot默认是通过jackson来转换JSON的,
* @JSONField(serialize = false)是FastJson的注解,
* Springboot使用jackson进行转JSON的时候并不会扫描这个注解。
* 因此需要配置fastJson,才会扫描到这个@JSONField注解
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//1.需要先定义一个 convert 转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2. 添加fastJson的配置信息
List<MediaType> supportMediaTypeList = new ArrayList<>();
supportMediaTypeList.add(MediaType.APPLICATION_JSON);
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
//BigDecimal格式化
SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();
serializeConfig.put(BigDecimal.class, CustomerBigDecimalCodec.instance);
fastJsonConfig.setSerializeConfig(serializeConfig);
fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
fastConverter.setFastJsonConfig(fastJsonConfig);
fastConverter.setSupportedMediaTypes(supportMediaTypeList);
fastConverter.setDefaultCharset(StandardCharsets.UTF_8);
converters.add(fastConverter);
}
}这里关于bigdecimal核心的代码部分只有3行,如下:
//BigDecimal格式化 SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance(); serializeConfig.put(BigDecimal.class, CustomerBigDecimalCodec.instance); fastJsonConfig.setSerializeConfig(serializeConfig);
其他部分的代码主要是json序列化的通用部分,一般项目都有配置。









还没有评论,来说两句吧...