Maison > Java > javaDidacticiel > Comment obtenir le dictionnaire de données basé sur une annotation dans Springboot

Comment obtenir le dictionnaire de données basé sur une annotation dans Springboot

WBOY
Libérer: 2023-05-25 22:58:14
avant
2674 Les gens l'ont consulté

La question mène à :

J'ai récemment démarré un nouveau projet et un dictionnaire de données est utilisé dans le projet. Lorsque les données de la requête de liste sont renvoyées, le code doit être converti manuellement. à nommer et affiché à la réception. Le chef de projet a déclaré qu'une fonction unifiée peut être encapsulée pour éviter aux programmeurs d'écrire leur propre code confus et des styles incohérents.

Exigences :

  • Basé sur l'architecture du microservice, le dictionnaire de données est obtenu via le service

  • # ; 🎜🎜## 🎜🎜#Code simplifié, facile à utiliser
  • Utiliser Redis ;
  • # 🎜🎜#L'orientation générale est de personnaliser les annotations et d'effectuer le traitement des données pendant la sérialisation ; en considérant les microservices, la logique principale doit être mise en commun, puis des interfaces externes sont fournies, et chaque service métier implémente l'interface pour obtenir les données du dictionnaire ; Pensez à Redis, lors de la sérialisation des données, obtenez-les d'abord via Redis, si elles ne peuvent pas être obtenues, obtenez-les via l'interface, stockez-les dans Redis, puis revenez au traitement. étape supplémentaire. Lors de l'ajout ou de la modification du dictionnaire de données, mettez à jour de manière synchrone le contenu Redis pour garantir la validité des données.

    implémentation

Notes de définition

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

    /** 字典类型 */
    String type();
}
Copier après la connexion

    # 🎜 🎜#Spécifiez l'emplacement pour ajouter l'annotation
  • Spécifiez l'heure d'effet de l'annotation
  • Spécifiez le traitement de sérialisation class#🎜🎜 #

  • Classe de traitement de sérialisation
  • 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);
        }
    }
    Copier après la connexion

    La logique traitée ici est le champ d'origine Le contenu reste inchangé et un nouveau champ est ajouté pour stocker la valeur convertie
  • Acquisition du dictionnaire de données

    #🎜🎜 #
    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);
    }
    Copier après la connexion
    # 🎜🎜#Considérez la situation de la sélection multiple, déterminez d'abord s'il s'agit d'une sélection multiple, d'un épissage par virgule par défaut et ajoutez un contrôle des paramètres d'entrée plus tard
  • @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;
    }
    Copier après la connexion
Jugez s'il existe dans Redis en fonction du clé, et obtenez-la directement si elle existe, si elle n'existe pas, récupérez-la via l'interface, placez-la directement dans Redis, puis récupérez-la à nouveau depuis Redis.

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());
        }
    }
}
Copier après la connexion

Boucle pour placer les valeurs du dictionnaire de données
    @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());
    }
    Copier après la connexion
  • Selon le type de dictionnaire de données, notez que cette classe d'implémentation nécessite que chaque microservice en implémente un ; afin d'éviter les données de base. Si le service raccroche et qu'une erreur est signalée lors de l'appel, une implémentation par défaut est fournie en commun.

    4. Utilisez
  • @Dict(type = "inspectType")
    private String checkType;
    Copier après la connexion
pour ajouter des annotations aux champs correspondants dans l'entité renvoyée au front-end et spécifiez la valeur du type de dictionnaire de données

      {
        "id": "1522492702905954306",
        "professionName": "专业名称888",
        "checkCode": "检测项编码8",
        "checkProject": "rrrr检测项目88",
        "checkDevice": "52",
        "checkStandard": "检测项编码88",
        "referenceStandard": "wq参考标准8",
        "checkType": "1",
        "checkTypeName": "尺寸",
        "remarks": "ef备注备注8"
      },
Copier après la connexion
#🎜 🎜# obtenu par le front end json aura un champ supplémentaire : checkTypeName, le contenu est la valeur chinoise de checkType.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal