Heim  >  Artikel  >  Java  >  So kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver Dateneinheiten

So kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver Dateneinheiten

WBOY
WBOYnach vorne
2023-05-11 22:34:14991Durchsuche

    Vorwort

    Ich erstelle normalerweise einige statistische Daten aus der Datenbank oder der Schnittstelle ist dasselbe wie Geschäftsanforderungen sind inkonsistent. Nr Die Daten müssen

    mit 100

    multipliziert und zur Prozentanzeige an das Frontend zurückgegeben werden Der entnommene Betrag muss# 🎜🎜#in zehntausend Einheiten umgewandelt werdenEin weiteres Beispiel: Sie müssen 2 Dezimalstellen beibehalten

    #🎜🎜 #... und so weiter.

    Was machen wir normalerweise?

    Oft erhalten Sie eine Datenerfassungsliste, die Sie durchlaufen und relevante Einheitenumrechnungen basierend auf den Attributen jedes DTO durchführen müssen. Weitermachen, fertig, fertig, fertig, fertig, fertig, die Leute sind taub.

    ist wie folgt:

    Wenn also einige Vorgangskonvertierungen automatisch durch Reflektion abgeglichen werden, müssen Sie sich das ansehen Der Code? Dadurch fühlen Sie sich wohler und entspannter.

    Antwort: Ja

    Dann habe ich es geschafft.

    Der Inhalt dieses Artikels ist kurz:

    ① Vorläufige Kapselung, Verwendung einer Karte zum Markieren der zu konvertierenden Klassenattributfelder So kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver Dateneinheiten# 🎜🎜##🎜 🎜#

    ② Weitere Kapselung, Zusammenarbeit mit den benutzerdefinierten Anmerkungen alter Freunde, um Dinge zu bewirken

    Produkt: #🎜 🎜#

    # 🎜🎜#Der Gesamtzahlungsbetrag wird in Einheiten von Zehntausenden umgerechnet.

    Was für eine Zählung ist es? 🎜#

    Dann gibt es noch ein Tausendstel; . . . . . .

    Ich:

    Hör auf zu reden und trink etwas Wasser.

    Die erhaltenen Daten befinden sich alle in diesem DTO:

    Verpackung starten:

    # 🎜 🎜#① Vorläufige Kapselung, markieren Sie mit der Karte die zu konvertierenden Klassenattributfelder

    Wie man spielt:

    A ##🎜 🎜#b Verwenden Sie das eingehende Konvertierungs-Tag Map, um zuzuordnen, welche Felder bearbeitet werden müssen.

    c Konvertierungsoperation


    d. Neu zuweisen

    ① Erstellen Sie einfach eine Aufzählung, um die Konvertierungsoperationstypen aufzulisten, die in der Anforderung UnitConvertType.java#🎜 angezeigt werden 🎜#

    /**
     * @Author : JCccc
     * @CreateTime : 2023/01/14
     * @Description :
     **/
    public enum UnitConvertType {
     
        /**
         * 精度
         */
        R,
        /**
         * 万元
         */
        B,
        /**
         * 百分
         */
        PERCENTAGE,
        /**
         * 千分
         */
        PERMIL
    }

    ② Core Encapsulated-Konvertierungsfunktion

    UnitConvertUtil.java
    import lombok.extern.slf4j.Slf4j;
    import java.lang.reflect.Field;
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    /**
     * @Author : JCccc
     * @CreateTime : 2023/01/14
     * @Description :
     **/
    @Slf4j
    public class UnitConvertUtil {
     
        public static <T> void unitMapConvert(List<T> list, Map<String, UnitConvertType> propertyMap) {
            for (T t : list) {
                Field[] declaredFields = t.getClass().getDeclaredFields();
                for (Field declaredField : declaredFields) {
                    if (propertyMap.keySet().stream().anyMatch(x -> x.equals(declaredField.getName()))) {
                        try {
                            declaredField.setAccessible(true);
                            Object o = declaredField.get(t);
                            UnitConvertType unitConvertType = propertyMap.get(declaredField.getName());
                            if (o != null) {
                                if (unitConvertType.equals(UnitConvertType.PERCENTAGE)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.PERMIL)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).multiply(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.B)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).divide(new BigDecimal(10000)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.R)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                            }
                        } catch (Exception ex) {
                            log.error("处理失败");
                            continue;
                        }
     
                    }
                }
            }
        }
        
        public static void main(String[] args) {
     
            //获取模拟数据
            List<MySumReportDTO> list = getMySumReportList();
     
            Map<String, UnitConvertType> map =new HashMap<>();
            map.put("payTotalAmount", UnitConvertType.B);
            map.put("jcAmountPercentage", UnitConvertType.PERCENTAGE);
            map.put("jcCountPermillage", UnitConvertType.PERMIL);
            map.put("length", UnitConvertType.R);
            map.put("width", UnitConvertType.R);
            unitMapConvert(list,map);
            System.out.println("通过map标识的自动转换玩法:"+list.toString());
     
        }
     
        private static List<MySumReportDTO> getMySumReportList() {
            MySumReportDTO mySumReportDTO = new MySumReportDTO();
            mySumReportDTO.setPayTotalAmount(new BigDecimal(1100000));
            mySumReportDTO.setJcAmountPercentage(BigDecimal.valueOf(0.695));
            mySumReportDTO.setJcCountPermillage(BigDecimal.valueOf(0.7894));
            mySumReportDTO.setLength(BigDecimal.valueOf(1300.65112));
            mySumReportDTO.setWidth(BigDecimal.valueOf(6522.12344));
     
            MySumReportDTO mySumReportDTO1 = new MySumReportDTO();
            mySumReportDTO1.setPayTotalAmount(new BigDecimal(2390000));
            mySumReportDTO1.setJcAmountPercentage(BigDecimal.valueOf(0.885));
            mySumReportDTO1.setJcCountPermillage(BigDecimal.valueOf(0.2394));
            mySumReportDTO1.setLength(BigDecimal.valueOf(1700.64003));
            mySumReportDTO1.setWidth(BigDecimal.valueOf(7522.12344));
     
            List<MySumReportDTO> list = new ArrayList<>();
     
            list.add(mySumReportDTO);
            list.add(mySumReportDTO1);
            return list;
        }
    }

    Code-Analyse:

    So kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver Dateneinheiten#🎜 🎜 #

    Look So rufen Sie an:

    public static void main(String[] args) {
    
        //获取模拟数据
        List<MySumReportDTO> list = getMySumReportList();
        System.out.println("转换前:"+list.toString());
        Map<String, UnitConvertType> map =new HashMap<>();
        map.put("payTotalAmount", UnitConvertType.B);
        map.put("jcAmountPercentage", UnitConvertType.PERCENTAGE);
        map.put("jcCountPermillage", UnitConvertType.PERMIL);
        map.put("length", UnitConvertType.R);
        map.put("width", UnitConvertType.R);
        unitMapConvert(list,map);
        System.out.println("通过map标识的自动转换玩法:"+list.toString());
    }

    Code-Analyse:

    Effekt:

    #🎜 🎜##🎜🎜 #

    Die entsprechenden Felder der gesamten Kollektionsliste werden automatisch erfolgreich konvertiert (die Konvertierungslogik kann im entsprechenden Bereich beliebig angepasst und erweitert werden):

    #🎜 🎜#

    ② Weitere Kapselung, Zusammenarbeit mit den benutzerdefinierten Anmerkungen alter Freunde, um Dinge möglich zu machen

    Um ehrlich zu sein, reicht der erste Schritt der Kapselung aus , die die Karte übergeben soll, um zu identifizieren, welche konvertiert werden müssen. Was ist der entsprechende Konvertierungsaufzählungstyp?

    Eigentlich habe ich das Gefühl, dass es reicht.

    Aber um es benutzerfreundlicher oder skalierbarer zu machen, wäre es schöner, benutzerdefinierte Anmerkungen zu verwenden.

    Lass es uns tun.

    Erstellen Sie eine benutzerdefinierte Anmerkung, JcBigDecConvert.java

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
     
    /**
     * @Author : JCccc
     * @CreateTime : 2023/01/14
     * @Description :
     **/
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface JcBigDecConvert {
     
        UnitConvertType name();
    }
    So kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver DateneinheitenWie verwende ich sie? Markieren Sie einfach die Felder in unserem Berichts-DTO.

    Beispiel:

    MyYearSumReportDTO.java

    ps: Sie können sehen, dass wir benutzerdefinierte Anmerkungen für die Felder So kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver Dateneinheiten

    import lombok.Data;
    import java.io.Serializable;
    import java.math.BigDecimal;
     
    /**
     * @Author : JCccc
     * @CreateTime : 2023/2/03
     * @Description :
     **/
     
    @Data
    public class MyYearSumReportDTO implements Serializable {
        private static final long serialVersionUID = 5285987517581372888L;
     
        //支付总金额
        @JcBigDecConvert(name=UnitConvertType.B)
        private BigDecimal payTotalAmount;
     
        //jc金额百分比
        @JcBigDecConvert(name=UnitConvertType.PERCENTAGE)
        private BigDecimal jcAmountPercentage;
     
        //jc计数千分比
        @JcBigDecConvert(name=UnitConvertType.PERMIL)
        private BigDecimal jcCountPermillage;
     
        //保留2位
        @JcBigDecConvert(name=UnitConvertType.R)
        private BigDecimal length;
     
        //保留2位
        @JcBigDecConvert(name=UnitConvertType.R)
        private BigDecimal width;
    }
    #🎜 🎜 verwendet haben # Um dann unserer Anpassung zu entsprechen, versiegeln Sie eine Konvertierungsfunktion, rufen Sie das Attributfeld durch Reflektion ab, analysieren Sie dann die Anmerkung und führen Sie dann den entsprechenden Konvertierungsvorgang aus.

    So kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver Dateneinheiten Code:

        public static <T> void unitAnnotateConvert(List<T> list) {
            for (T t : list) {
                Field[] declaredFields = t.getClass().getDeclaredFields();
                for (Field declaredField : declaredFields) {
                        try {
                            if (declaredField.getName().equals("serialVersionUID")){
                                continue;
                            }
                            JcBigDecConvert myFieldAnn = declaredField.getAnnotation(JcBigDecConvert.class);
                            if(Objects.isNull(myFieldAnn)){
                                continue;
                            }
                            UnitConvertType unitConvertType = myFieldAnn.name();
                            declaredField.setAccessible(true);
                            Object o = declaredField.get(t);
                            if (Objects.nonNull(o)) {
                                if (unitConvertType.equals(UnitConvertType.PERCENTAGE)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.PERMIL)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).multiply(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.B)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).divide(new BigDecimal(10000)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.R)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                            }
                        } catch (Exception ex) {
                            log.error("处理失败");
                        }
                }
            }
        }

    Schreiben Sie ein Anrufbeispiel, um den Effekt zu sehen:

        public static void main(String[] args) {
            
            List<MyYearSumReportDTO> yearsList = getMyYearSumReportList();
            unitAnnotateConvert(yearsList);
            System.out.println("通过注解标识的自动转换玩法:"+yearsList.toString());
        }
        
        private static List<MyYearSumReportDTO> getMyYearSumReportList() {
            MyYearSumReportDTO mySumReportDTO = new MyYearSumReportDTO();
            mySumReportDTO.setPayTotalAmount(new BigDecimal(1100000));
            mySumReportDTO.setJcAmountPercentage(BigDecimal.valueOf(0.695));
            mySumReportDTO.setJcCountPermillage(BigDecimal.valueOf(0.7894));
            mySumReportDTO.setLength(BigDecimal.valueOf(1300.65112));
            mySumReportDTO.setWidth(BigDecimal.valueOf(6522.12344));
            MyYearSumReportDTO mySumReportDTO1 = new MyYearSumReportDTO();
            mySumReportDTO1.setPayTotalAmount(new BigDecimal(2390000));
            mySumReportDTO1.setJcAmountPercentage(BigDecimal.valueOf(0.885));
            mySumReportDTO1.setJcCountPermillage(BigDecimal.valueOf(0.2394));
            mySumReportDTO1.setLength(BigDecimal.valueOf(1700.64003));
            mySumReportDTO1.setWidth(BigDecimal.valueOf(7522.12344));
            
            List<MyYearSumReportDTO> list = new ArrayList<>();
            list.add(mySumReportDTO);
            list.add(mySumReportDTO1);
            return list;
        }

    The Wirkung ist auch sehr ok: So kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver Dateneinheiten

    Das obige ist der detaillierte Inhalt vonSo kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver Dateneinheiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen