日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring Boot 通過 Mvc 擴展方便進行貨幣單位轉換的代碼詳解

瀏覽:187日期:2023-07-28 18:44:17

由于公司是支付平臺,所以很多項目都涉及到金額,業務方轉遞過來的金額是單位是元,而我們數據庫保存的金額單位是分。一般金額的流向有以下幾個方向:

外部業務方請求我們服務,傳遞過來的金額單位是元,需要把元轉換成分。比如:下單接口。 內部系統之間的流轉,不管是向下傳遞還是向上傳遞系統間的流程都是分,不需要扭轉。比如:調用支付引擎(向下傳遞),支付引擎回調收單業務(向上傳遞)。 向業務方返回數據,這個時候需要把分轉換成元。比如:商戶調用查詢訂單接口。 內部系統的展示,這個時候需要把分轉換成元。比如:顯示收入金額的報表。

如果我們對于請求參數是金額類型的參數逐一處理,這樣重復的操作就會顯得相當的不優雅。對于請求參數我們可以使用 Spring MVC 提供的擴展擴展。對于金額操作我們可以分為:

業務方傳入金額單位為元,需要把業務方傳入的元轉換成分,可以使用 Spring MVC Restful 請求參數擴展 RequestBodyAdvice 接口。 業務方需要查詢數據,需要把數據庫保存的分轉換成元,可以使用 Spring MVC Restful 響應參數擴展 ResponseBodyAdvice 接口。

下面我們就來看一下代碼實現。

1、FenToYuan.java

定義一個標注注解,用于標注到需要把元轉換成分的 BigDecimal 類型的參數上面。

FenToYuan.java

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FenToYuan {}2、YuanToFenRequestBodyAdvice.java

實現 Spring MVC Restful 請求參數擴展類,如果請求參數標注了 @RequestBody 注解,并且請求參數的字段類型為 BigDecimal 就會把傳入的參數由元轉換成分。

YuanToFenRequestBodyAdvice.java

@Slf4j@ControllerAdvicepublic class YuanToFenRequestBodyAdvice extends RequestBodyAdviceAdapter { @Override public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { return methodParameter.hasParameterAnnotation(RequestBody.class); } @Override public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { if(body == null) { return null; } Class<?> clazz = body.getClass(); PropertyDescriptor[] propertyDescriptors = BeanUtils.getPropertyDescriptors(clazz); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { String name = propertyDescriptor.getName(); if('class'.equals(name)){continue; } Field field = ReflectionUtils.findField(clazz, name); Class<?> fieldClazz = field.getType(); if(!fieldClazz.equals(BigDecimal.class) ){continue; } if(!field.isAnnotationPresent(YuanToFen.class)) {continue; } Method readMethod = propertyDescriptor.getReadMethod(); Method writeMethod = propertyDescriptor.getWriteMethod(); try {BigDecimal yuanAmount = (BigDecimal) readMethod.invoke(body);BigDecimal fenAmount = AmountUtils.yuan2Fen(yuanAmount);writeMethod.invoke(body, fenAmount); } catch (Exception e) {log.error('amount convert yuan to fen fail', e); } } return super.afterBodyRead(body, inputMessage, parameter, targetType, converterType); }}3、YuanToFen.java

標注注解,當響應參數需要由分轉換成元的時候,就標注這個注解。響應值就會把數據庫或者下游傳遞過來的金額為分的參數轉換成元。

YuanToFen.java

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface YuanToFen {}4、FenToYuanResponseBodyAdvice.java

當 Spring MVC 方法上標注了 ResponseBody 或者類上標注了 RestController 注解時,如果響應對象的 BigDecimal 標注了 @YuanToFen 注解就會進行金額分轉換成元。

FenToYuanResponseBodyAdvice.java

@Slf4j@ControllerAdvicepublic class FenToYuanResponseBodyAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class converterType) { return returnType.hasParameterAnnotation(ResponseBody.class)|| returnType.getDeclaringClass().isAnnotationPresent(RestController.class); } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if(body == null) { return null; } Class<?> clazz = body.getClass(); PropertyDescriptor[] propertyDescriptors = BeanUtils.getPropertyDescriptors(clazz); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { String name = propertyDescriptor.getName(); if('class'.equals(name)){continue; } Field field = ReflectionUtils.findField(clazz, name); Class<?> fieldClazz = field.getType(); if(!fieldClazz.equals(BigDecimal.class) ){continue; } if(!field.isAnnotationPresent(FenToYuan.class)) {continue; } Method readMethod = propertyDescriptor.getReadMethod(); Method writeMethod = propertyDescriptor.getWriteMethod(); try {BigDecimal fenAmount = (BigDecimal) readMethod.invoke(body);BigDecimal yuanAmount = AmountUtils.fen2yuan(fenAmount);writeMethod.invoke(body, yuanAmount); } catch (Exception e) {log.error('amount convert fen to yuan fail', e); } } return body; }}5、AmountUtils.java

金錢工具類,提供了金錢的元轉分以及分轉元這兩個功能。

AmountUtils.java

public abstract class AmountUtils { /** * 金額單位元轉分 */ public static BigDecimal yuan2Fen(BigDecimal amount) { if (amount == null) { return BigDecimal.ZERO; } return amount.movePointRight(2).setScale(0, BigDecimal.ROUND_DOWN); } /** * 金額單位分轉元 */ public static BigDecimal fen2yuan(BigDecimal amount) { return null2Zero(amount).movePointLeft(2).setScale(2, BigDecimal.ROUND_HALF_UP); } /** * 把 null 當作 0 處理 */ public static BigDecimal null2Zero(Number amount) { if (amount == null) { return BigDecimal.ZERO; } if (amount instanceof BigDecimal) { return (BigDecimal) amount; } else { return new BigDecimal(amount.toString()); } }}6、Order.java

實體類,用于接收請求對象以及響應測試金額轉換。

Order.java

@Datapublic class Order { private String orderId; private String productName; @FenToYuan @YuanToFen private BigDecimal orderAmount;}7、OrderController.java

訂單控制類,提供了兩個方法:訂單創建(/order/apply)標注了 @RequestBody,會把傳入的金額由元轉換成分,然后打印到控制臺。訂單查詢(order/query) 聲明方法的類上標注了 @RestController ,通過關鍵字 new 創建一個訂單金額為 1000 分的訂單。

OrderController.java

@RestController@RequestMapping('order')public class OrderController { @RequestMapping('apply') public void apply(@RequestBody Order order) { System.out.println(JSON.toJSONString(order)); } @RequestMapping('query/{id}') public Order query(@PathVariable String id) { Order order = new Order(); order.setOrderId(id); order.setOrderAmount(new BigDecimal('1000')); order.setProductName('test'); return order; }}8、測試

使用工具 Postman 發送 http 進行功能測試。

8.1 元轉分測試

通過 postman 請求 http:localhost:8080/order/apply發送以下請求:

Spring Boot 通過 Mvc 擴展方便進行貨幣單位轉換的代碼詳解

控制臺打印如下:

Spring Boot 通過 Mvc 擴展方便進行貨幣單位轉換的代碼詳解

業務方傳入金額為 1 元,控制臺打印的結果是 100 分。

8.2 測試分轉元

通過 postman 請求 http:localhost:8080/order/query/1發送以下請求:

Spring Boot 通過 Mvc 擴展方便進行貨幣單位轉換的代碼詳解

這個時候得到訂單金額為 10 元。查詢訂單的邏輯如下:

Spring Boot 通過 Mvc 擴展方便進行貨幣單位轉換的代碼詳解

這個時候訂單的金額是 1000 分,轉換成 10 元完成了我們的目標功能。

當然這種方式是有一個缺陷的,就是它不能遞歸的進行金額轉換,后面可以借鑒 Hibernate 的遞歸校驗邏輯來進行遞歸金額參數的轉換。

到此這篇關于Spring Boot 通過 Mvc 擴展方便進行貨幣單位轉換的文章就介紹到這了,更多相關Spring Boot貨幣單位轉換內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩国产综合网| 午夜日韩在线| 婷婷亚洲成人| 亚洲人成高清| 日韩精品国产欧美| 综合一区在线| 国产亚洲在线观看| 玖玖精品视频| 视频一区日韩| 青草久久视频| 免费看一区二区三区| 精品三区视频| 亚洲电影有码| 亚洲一区日本| 亚洲2区在线| 欧美一级一区| 久久伊人亚洲| 成人日韩在线| 91精品xxx在线观看| 午夜欧美在线| 免费久久精品视频| 亚洲日本国产| 欧美成人一二区| 亚洲三级欧美| 黄页网站一区| 日韩精彩视频在线观看| 国产精品亚洲产品| 国产在线看片免费视频在线观看| 日韩欧美一区二区三区在线观看| 中文精品视频| 欧美一级一区| 日韩黄色大片网站| aa亚洲婷婷| 一区二区亚洲精品| 最新中文字幕在线播放 | 国产一区二区视频在线看| 欧美精品导航| 精品国产第一福利网站| 国产一区精品福利| 国产日韩高清一区二区三区在线| 午夜精品网站| 日韩国产一区| 国产h片在线观看| 美女尤物国产一区| 欧洲亚洲一区二区三区| 免费在线欧美视频| 精品黄色一级片| 亚州av乱码久久精品蜜桃| 欧美成人午夜| 91成人在线精品视频| 黄色在线网站噜噜噜| 亚洲视频播放| 久久香蕉网站| 亚洲欧美日韩国产一区| 精品国产乱码| 美女精品在线观看| 国产日韩1区| 久久久夜精品| 日本va欧美va欧美va精品| 欧美男人天堂| 天海翼亚洲一区二区三区| 国产伊人久久| 综合一区二区三区| 国内自拍视频一区二区三区| 国产精品日韩久久久| 久久不见久久见免费视频7| 日韩视频中文| 麻豆视频久久| 美美哒免费高清在线观看视频一区二区| 麻豆国产91在线播放| 亚洲在线电影| 极品av在线| 欧美日韩一视频区二区| 五月婷婷亚洲| 国产中文欧美日韩在线| 日欧美一区二区| 欧美日韩国产一区二区三区不卡| 国产精品mm| 亚洲一区二区三区高清| 精品精品国产三级a∨在线| 蜜芽一区二区三区| 欧美日韩一二三四| 麻豆精品蜜桃视频网站| 婷婷综合福利| 久热精品在线| 亚洲午夜精品久久久久久app| 九九久久国产| 欧美日韩调教| 亚洲人亚洲人色久| 伊人影院久久| 亚洲日本网址| 四季av一区二区凹凸精品| 97久久中文字幕| 日韩天堂av| 国产综合婷婷| 日韩专区精品| 免费亚洲一区| 国产欧美欧美| 日本欧美在线| 亚洲人成亚洲精品| 久久亚洲电影| 亚洲欧美日本国产专区一区| 激情综合网址| 91精品蜜臀一区二区三区在线 | 亚洲精品电影| 国产一区二区三区亚洲| 国产欧美丝祙| 婷婷精品在线观看| 蜜桃一区二区三区在线观看| 91久久中文| 亚州av乱码久久精品蜜桃| 久久要要av| 性欧美xxxx免费岛国不卡电影| 色婷婷综合网| 色欧美自拍视频| 精品美女在线视频| 久久成人福利| 精品久久不卡| 久久精品九色| 精品视频91| 国产精品毛片aⅴ一区二区三区| 欧美一区自拍| 欧美伊人久久| 国产日韩三级| 国产日韩欧美一区二区三区| 国产亚洲一卡2卡3卡4卡新区| 深夜日韩欧美| 日韩精品第二页| 国产欧美日本| 欧美激情视频一区二区三区免费 | 日韩高清一级| 日韩美女国产精品| 日韩一二三区在线观看| 久久国产88| 在线免费观看亚洲| 亚洲精品裸体| 欧美日韩亚洲国产精品| 国产精品流白浆在线观看| 国产福利一区二区三区在线播放| 麻豆高清免费国产一区| 福利片在线一区二区| 三级小说欧洲区亚洲区| 韩日一区二区三区| 老司机精品久久| 日韩精品a在线观看91| 麻豆91小视频| 日韩在线短视频| 午夜久久福利| 免费观看在线综合色| 91午夜精品| 国产中文欧美日韩在线| 日韩在线短视频| 尹人成人综合网| 日韩**一区毛片| 激情中国色综合| 性欧美xxxx免费岛国不卡电影| 视频一区中文字幕| 国产精品白浆| 久久久夜精品| 亚洲精品乱码久久久久久蜜桃麻豆| 日本国产亚洲| 97视频热人人精品免费| 久久一区二区三区电影| 快she精品国产999| 国产欧美日韩一级| 亚洲性色av| 麻豆91精品| 国产精品三级| 99精品网站| 日本亚州欧洲精品不卡| 免费看久久久| 亚洲电影在线一区二区三区| 青草国产精品| 欧美日韩在线二区| 亚洲欧美日本国产| 国产精品久久观看| 久久福利一区| 精品久久久网| 免费看黄色91| 国产精品啊v在线| 欧美一区三区| 欧美日韩1区| 视频福利一区| 日本综合视频| 亚洲午夜在线| 国产精品xxx在线观看| 亚洲男女av一区二区| 国产精品一区亚洲| 怡红院精品视频在线观看极品| 国产精品日韩精品在线播放| 99国产精品久久久久久久成人热| 国产伦精品一区二区三区在线播放| 久久天堂成人| 欧美一区=区三区| 91亚洲人成网污www| 亚洲最新av| 国产99精品| 久久的色偷偷| 免费黄网站欧美| 久久精品高清|