Heim  >  Artikel  >  Java  >  So erhalten Sie das Datenwörterbuch basierend auf einer Anmerkung in Springboot

So erhalten Sie das Datenwörterbuch basierend auf einer Anmerkung in Springboot

WBOY
WBOYnach vorne
2023-05-25 22:58:142601Durchsuche

Es stellt sich die Frage:

Ein neues Projekt wurde kürzlich gestartet und im Projekt wird ein Datenwörterbuch verwendet. Wenn die Listenabfragedaten zurückgegeben werden, muss der Code manuell in einen Namen umgewandelt und an der Rezeption angezeigt werden. Der Projektmanager sagte, dass eine einheitliche Funktion gekapselt werden kann, um zu verhindern, dass Programmierer ihren eigenen, verwirrenden Code und inkonsistente Stile schreiben.

Anforderungen:

  • Basierend auf der Microservice-Architektur wird das Datenwörterbuch über den Dienst abgerufen.

  • Verwenden Sie Redis

    Der General Richtung ist benutzerdefinierte Anmerkungen. Unter Berücksichtigung von Microservices muss die Hauptlogik gemeinsam platziert werden, und dann werden externe Schnittstellen bereitgestellt, und jeder Geschäftsdienst implementiert die Schnittstelle, um bei der Serialisierung von Daten Redis zu erhalten , Holen Sie es sich zuerst von Redis, rufen Sie es über die Schnittstelle ab, speichern Sie es in Redis und kehren Sie dann zur Verarbeitung zurück. Sie können den Redis-Inhalt auch synchron aktualisieren beim Hinzufügen oder Ändern des Datenwörterbuchs, um die Gültigkeit der Daten sicherzustellen.
  • Implementierung

Anmerkungen definieren

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = DictSerializer.class)
public @interface Dict {

    /** 字典类型 */
    String type();
}

Geben Sie den Ort zum Hinzufügen von Anmerkungen an
  • Geben Sie die Gültigkeitszeit der Anmerkungen an
  • Geben Sie die Serialisierungsverarbeitungsklasse an

  • Serialisierungsverarbeitungsklasse
  • public class DictSerializer extends StdSerializer<Object> implements ContextualSerializer {
        /** 字典注解 */
        private Dict dict;
        public DictSerializer() {
            super(Object.class);
        }
        public DictSerializer(Dict dict) {
            super(Object.class);
            this.dict = dict;
        }
        private String type;
        @Override
        public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            if (Objects.isNull(value)) {
                gen.writeObject(value);
                return;
            }
            if (Objects.nonNull(dict)){
                type = dict.type();
            }
            // 通过数据字典类型和value获取name
    
            gen.writeObject(value);
            gen.writeFieldName(gen.getOutputContext().getCurrentName()+"Name");
            gen.writeObject(label);
        }
        @Override
        public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty beanProperty) throws JsonMappingException {
            if (Objects.isNull(beanProperty)){
                return prov.findValueSerializer(beanProperty.getType(), beanProperty);
            }
            Dict dict = beanProperty.getAnnotation(Dict.class);
            if (Objects.nonNull(dict)){
                type = dict.type();
                return this;
            }
            return prov.findNullValueSerializer(null);
        }
    }

    Die Verarbeitungslogik besteht darin, dass der ursprüngliche Feldinhalt unverändert bleibt und ein neues Feld hinzugefügt wird, um den konvertierten Wert zu speichern Es handelt sich um eine Mehrfachauswahl, die Standardeinstellung ist Komma-Spleißen und die Eingabeparametersteuerung wird später hinzugefügt.
  • private static String changeLabel(String type,String code) {
        if(code.indexOf(",") > -1) {
            String[] strs = code.split(",");
            if (strs.length > 1) {
                StringBuilder sb = new StringBuilder();
                for (String str : strs) {
                    // 从缓存中获取字典。如果不行,通过SpringUtil.getBean(); 获取服务处理
                    sb.append(DictDataCache.getLabel(type, str)).append(separator);
                }
                return sb.substring(0, sb.length() - 1);
            }
        }
        // 从缓存中获取字典。如果不行,通过SpringUtil.getBean(); 获取服务处理
        return DictDataCache.getLabel(type, code);
    }
Beurteilen Sie anhand des Schlüssels, ob er vorhanden ist. Wenn er nicht vorhanden ist, rufen Sie ihn ab Wenn es nicht vorhanden ist, laden Sie es direkt in Redis herunter und rufen Sie es erneut von Redis ab.
    @Override
    public String getDictDataOptions(String typeCode,String value) {
        if (redisTemplate.hasKey("dict:"+typeCode+":"+value)){
            return (String) redisTemplate.opsForValue().get("dict:"+typeCode+":"+value);
        }
        List<DictDataOptions> dictDataList = getDictDataHandler().getDictDataOptions(typeCode);
        if(CollUtil.isNotEmpty(dictDataList)) {
            put(typeCode, dictDataList);
        }
        if (redisTemplate.hasKey("dict:"+typeCode+":"+value)){
            return (String) redisTemplate.opsForValue().get("dict:"+typeCode+":"+value);
        }
        return null;
    }
  • Platzieren Sie die Datenwörterbuchwerte in einer Schleife.

    protected void put(String typeCode, List<DictDataOptions> dataList) {
        if (CollUtil.isNotEmpty(dataList)){
            for (DictDataOptions dictDataOptions : dataList) {
                AbstractDictHandler.redisTemplate.opsForValue().set("dict:"+typeCode+":"+dictDataOptions.getDataLabel(),dictDataOptions.getDataValue());
            }
        }
    }

    Beziehen Sie die Daten entsprechend dem Datenwörterbuchtyp über die Schnittstelle. Beachten Sie, dass diese Implementierungsklasse dann von jedem Mikrodienst implementiert werden muss Der grundlegende Datendienst hängt auf und ruft Fehler auf. Dies führt häufig zu einer Standardausführung.
4. Verwenden Sie

@Override
public List<DictDataOptions> getDictDataOptions(String typeCode) {
    return iSysDictService.queryDictItemsByCode(typeCode).stream()
            .map(e -> DictDataOptions.builder().typeCode(typeCode).dataLabel(e.getValue()).dataValue(e.getText()).build())
            .collect(Collectors.toList());
}

, um Anmerkungen zu den entsprechenden Feldern in der an das Frontend zurückgegebenen Entität hinzuzufügen, und geben Sie den Datenwörterbuchtypwert an.
    @Dict(type = "inspectType")
    private String checkType;
  • Der vom Frontend erhaltene JSON verfügt über ein weiteres Feld: checkTypeName und Der Inhalt ist der chinesische Wert von checkType.

Das obige ist der detaillierte Inhalt vonSo erhalten Sie das Datenwörterbuch basierend auf einer Anmerkung in Springboot. 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