ApiBoot是一款基於SpringBoot1.x,2.x的接口服務集成基礎框架, 內部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接口開發者能夠選着性完成開箱即用, 再也不爲搭建接口框架而犯愁,從而極大的提升開發效率。java
FastJson
是阿里巴巴提供的一款Json
格式化插件。git
ApiBoot
提供了FastJson
驅動轉換接口請求的Json
字符串數據,添加該依賴後會自動格式化時間(格式:YYYY-MM-DD HH:mm:ss)、空對象轉換爲空字符串返回、空Number轉換爲0等,還會自動裝載ValueFilter
接口的實現類來完成自定義的數據格式轉換。github
ApiBoot Http Converter
使用很是簡單,只須要在pom.xml
添加以下依賴:spring
<!--ApiBoot Http Converter-->
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-starter-http-converter</artifactId>
</dependency>
複製代碼
ApiBoot
所提供的依賴都不須要添加版本號,具體查看ApiBoot版本依賴json
ApiBoot Http Converter
經過使用SpringBoot
內置的配置參數名來肯定是否開啓,在SpringBoot
內能夠經過spring.http.converters.preferred-json-mapper
來修改首選的Json
格式化插件,SpringBoot
已經提供了三種,分別是:gson
、jackson
、jsonb
,當咱們配置該參數爲fastJson
或不進行配置
就會使用ApiBoot Http Converter
提供的fastJson
來格式化轉換Json
返回數據。api
以下所示:app
spring:
http:
converters:
# 不配置默認使用fastJson
preferred-json-mapper: fastJson
複製代碼
ValueFilter
是FastJson
的概念,用於自定義轉換實現,好比:自定義格式化日期、自動截取小數點等。框架
下面提供一個ValueFilter
的簡單示例,具體的使用請參考FastJson
官方文檔。ide
在使用ValueFilter
時通常都會搭配一個對應的自定義@Annotation
來進行組合使用,保留自定義小數點位數的示例以下所示:spa
建立 BigDecimalFormatter Annotation
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface BigDecimalFormatter {
/** * 小數位數,默認保留兩位 * @return */
int scale() default 2;
}
複製代碼
建立 BigDecimal ValueFilter
public class BigDecimalValueFilter implements ValueFilter {
/** * logback */
Logger logger = LoggerFactory.getLogger(BigDecimalValueFilter.class);
/** * @param object 對象 * @param name 對象的字段的名稱 * @param value 對象的字段的值 */
@Override
public Object process(Object object, String name, Object value) {
if (ValidateTools.isEmpty(value) || !(value instanceof BigDecimal)) {
return value;
}
return convertValue(object, name, value);
}
/** * 轉換值 * * @param object 字段所屬對象實例 * @param name 字段名稱 * @param value 字段的值 * @return */
Object convertValue(Object object, String name, Object value) {
try {
/** * 反射獲取field */
Field field = object.getClass().getDeclaredField(name);
/** *判斷字段是否存在@BigDecimalFormatter註解 */
if (field.isAnnotationPresent(BigDecimalFormatter.class)) {
BigDecimalFormatter bigDecimalFormatter = field.getAnnotation(BigDecimalFormatter.class);
// 執行格式化
BigDecimal decimal = (BigDecimal) value;
System.out.println(bigDecimalFormatter.scale());
// 保留小數位數,刪除多餘
value = decimal.setScale(bigDecimalFormatter.scale(), BigDecimal.ROUND_DOWN).doubleValue();
}
} catch (Exception e) {
logger.error("格式化BigDecimal字段出現異常:{}", e.getMessage());
}
return value;
}
}
複製代碼
使用 BigDecimalFormatter Annotation
@BigDecimalFormatter
private BigDecimal decimalValue;
複製代碼
本章源碼地址:github.com/hengboy/api…