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

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

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

瀏覽:185日期: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久久,三上悠亚国产精品一区二区三区
伊人久久亚洲美女图片| 一本一道久久a久久精品蜜桃| 伊人精品一区| 精品三级国产| 蜜桃免费网站一区二区三区| 欧美黑人做爰爽爽爽| 国产精品成人自拍| 欧美日韩中文字幕一区二区三区| 亚洲另类av| 美女尤物久久精品| 神马午夜在线视频| 日韩制服丝袜av| 日韩电影免费网站| 日本精品国产| 亚洲1234区| 伊人久久亚洲美女图片| 午夜精品久久久久久久久久蜜桃| 免费人成在线不卡| 国产专区一区| 欧美精品一二| 涩涩av在线| 精品在线99| 里番精品3d一二三区| 亚洲欧洲日韩| 精品视频久久| 高清av一区| 国产精品v亚洲精品v日韩精品| 久久亚洲欧美| 人人精品亚洲| 国产va免费精品观看精品视频| 不卡中文一二三区| 国产69精品久久| 欧美一区成人| 精品国产一区二| 国产欧美高清| 91成人精品视频| 国产亚洲精品美女久久 | 欧美国产极品| 麻豆国产精品视频| 欧美日一区二区三区在线观看国产免 | 精品国产一区二区三区性色av| 亚洲黄色中文字幕| 视频一区中文字幕国产| 国产精品蜜芽在线观看| 日韩精品电影一区亚洲| 女人天堂亚洲aⅴ在线观看| 欧美精品导航| 久久国产人妖系列| 一区二区国产在线| 2023国产精品久久久精品双 | 国产精品一区二区99| 欧美日韩中文一区二区| 电影91久久久| 国产精品99久久免费| 亚洲午夜久久| 先锋亚洲精品| 亚洲精品免费观看| 亚洲一级淫片| 国产精品外国| 国产高清亚洲| 88久久精品| 久久免费高清| 国产日产精品_国产精品毛片 | 一本一道久久a久久精品蜜桃| 欧美日韩视频免费看| 国产91精品对白在线播放| 日韩欧美一区二区三区在线观看| 91欧美在线| 综合日韩av| 亚洲手机视频| 亚洲va久久| 国产精品magnet| 视频福利一区| 日本不卡高清| 狠狠久久伊人| 欧美日韩国产在线观看网站 | 亚洲欧美综合| 四虎精品一区二区免费| 欧美aa在线视频| 日本欧美大码aⅴ在线播放| 日本伊人午夜精品| 亚洲精品日本| 欧美一区自拍| 国内精品美女在线观看| 亚洲另类黄色| 日本亚洲不卡| 91亚洲精品在看在线观看高清| 欧美天堂一区| 久久精品国产68国产精品亚洲| 日韩电影二区| 中文字幕人成乱码在线观看| 欧美日韩在线精品一区二区三区激情综合| 国产精品一线天粉嫩av| 亚洲成a人片| 日韩综合小视频| 日本免费一区二区三区四区| 视频一区二区三区在线| 91欧美在线| 青草综合视频| 红桃视频国产一区| 精品一区二区三区的国产在线观看| 在线一区免费| 国产精品66| 在线一区二区三区视频| 99精品电影| 精品美女在线视频| 91成人精品观看| 六月婷婷一区| 亚洲成人免费| 日本午夜大片a在线观看| 欧美日韩亚洲一区二区三区在线 | 国产成人精品一区二区免费看京| 免费观看在线色综合| 久久精品成人| 欧美少妇精品| 欧美午夜三级| 青青草91视频| 国产精品最新| 国产激情综合| 国产精品久久久一区二区| 亚洲区第一页| 亚欧洲精品视频在线观看| 在线精品福利| 亚洲一区二区三区中文字幕在线观看| 日本欧美不卡| 在线日韩中文| 午夜久久免费观看| 欧美日韩国产高清电影| 婷婷亚洲五月色综合| 999久久久91| 水蜜桃精品av一区二区| 高清一区二区三区| 亚洲黄色免费看| 91精品精品| 一区免费在线| 国产麻豆综合| 欧美日一区二区三区在线观看国产免 | 日韩福利视频一区| 亚洲精品2区| 亚洲二区免费| 国产精品久久久久av蜜臀 | 亚洲高清影视| 美女视频黄 久久| 蜜臀av一区二区三区| 国产成人精品一区二区三区在线| 久久一区二区三区电影| 日韩国产在线观看| 欧美日韩在线二区| 国产一区二区三区四区大秀| 伊人久久大香伊蕉在人线观看热v| 精品淫伦v久久水蜜桃| 最新亚洲国产| 欧美成人高清| 精品资源在线| 国产日韩欧美一区| 欧美成人基地 | 欧美日韩精品在线一区| 欧美精品导航| 日韩高清一区二区| 国产精品一站二站| 日韩在线黄色| 麻豆久久精品| 中文日韩在线| 先锋亚洲精品| 亚洲精品1区2区| 激情欧美一区| 国产精选一区| 日韩不卡手机在线v区| 亚洲激情精品| 亚洲伦乱视频| 欧产日产国产精品视频| 国产精品毛片久久久| 亚洲免费成人av在线| 在线综合亚洲| 国产亚洲福利| 日韩午夜av| 日韩中文字幕91| 日本不卡视频一二三区| 综合一区二区三区| 欧美日韩视频免费看| 欧美国产视频| 国产精品成人3p一区二区三区| 精品久久电影| 91精品国产调教在线观看| 精品资源在线| 国产精品免费大片| 日韩高清电影免费| 国产一区观看| 日韩视频一区| 波多野结衣一区| 91精品99| 国产精品色网| 亚洲日本三级| 国产精品一区二区三区四区在线观看| 狠狠色狠狠色综合日日tαg| 精品国产乱码久久久| 久久天堂影院| 99精品视频在线| 亚洲性色视频| 午夜精品一区二区三区国产|