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)来替代