BigDecimal保留小数,每次都要java代码中写比较繁琐,写一个自定义注解就比较方便,直接上代码:

1、定义注解:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface NumberCustomize {
    // 保留几位小数
    int value();

    // 是否去0
    boolean stripZero() default true;
}

2、编写自定义valueFilter

public class ZreContextValueFilter implements ContextValueFilter {
    private final static Logger logger = LoggerFactory.getLogger(ZreContextValueFilter.class);

    @Override
    public Object process(BeanContext context, Object object, String name, Object value) {
        if (value == null || !(value instanceof BigDecimal)) {
            return value;
        }
        NumberCustomize annation = context.getAnnation(NumberCustomize.class);
        if (annation == null) {
            return value;
        }
        BigDecimal propertyValue = (BigDecimal)value;
        if (propertyValue == null) {
            return value;
        }
        boolean stripZero = annation.stripZero();
        propertyValue = propertyValue.setScale(annation.value(), BigDecimal.ROUND_HALF_UP);
        if (stripZero) {
            return propertyValue.stripTrailingZeros().toPlainString();
        }
        return propertyValue;

    }
}

3、配置fastjson的HttpMessageConverter

@Configuration
public class ConverterConfig {
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        // 创建FastJson信息转换对象
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        // 创建FastJson对象并设定序列化规则
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        // 添加自定义valueFilter
        fastJsonConfig.setSerializeFilters(new ZreContextValueFilter());
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON_UTF8));
        // 规则赋予转换对象
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        StringHttpMessageConverter stringHttpMessageConverter =
            new StringHttpMessageConverter(Charset.forName("UTF-8"));
        return new HttpMessageConverters(fastJsonHttpMessageConverter, stringHttpMessageConverter);
    }
}

4、直接在dto中添加注解

    @NumberCustomize(0)
    private BigDecimal progress;

亲测有效,注解有两个参数,保留几位小数和是否去零(默认去零)。

注:spring系统默认使用的是MappingJackson2HttpMessageConverter,这里用了

FastJsonHttpMessageConverter,会导致jackson的注解不可用。如@JsonIgnore等,需要用@JSONField(serialize = false)来替代

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐