很久没写代码了,最近写项目的时候,数据库有一些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序列化的通用部分,一般项目都有配置。
还没有评论,来说两句吧...