ホームページ  >  記事  >  Java  >  Springbootでアノテーションに基づいてデータディクショナリを取得する方法

Springbootでアノテーションに基づいてデータディクショナリを取得する方法

WBOY
WBOY転載
2023-05-25 22:58:142604ブラウズ

質問の内容:

新しいプロジェクトが最近開かれました。プロジェクトではデータ ディクショナリが使用されています。リスト クエリ データが返されたとき、コードを手動で名前に変換して表示する必要があります。フロントデスクにて。プロジェクトマネージャーは、統一された関数をカプセル化することで、プログラマーが独自の混乱を招くコードや一貫性のないスタイルを作成することを避けることができると述べた。

要件:

  • マイクロサービス アーキテクチャに基づいて、データ ディクショナリはサービスを通じて取得されます;

  • 簡素化されたコード、簡単to use;

  • Use Redis;

Scheme

一般的な方向は、注釈をカスタマイズし、シリアル化中にデータ処理を実行することです。 ; マイクロサービスを考えるとメインロジックを共通化して外部とのインターフェースを提供する必要がある 辞書データを取得するためのインターフェースは各ビジネスサービスが実装する; Redisを考えるとデータをシリアル化する際にまずRedis経由で取得する取得できません。インターフェイスを通じて取得されます。データを取得した後、Redis に保存してから処理に戻ります。データ ディクショナリを追加または変更するときに、追加の手順を実行して Redis コンテンツを同期的に更新することもできます。データの有効性を保証します。

実装

  • 注釈の定義

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

    /** 字典类型 */
    String type();
}
  • 注釈を追加する場所を指定します

  • アノテーション有効時間の指定

  • シリアル化処理クラスの指定

  • シリアル化処理class

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);
    }
}

ここで処理されるロジックは、元のフィールドの内容は変更されず、変換された値を格納するために新しいフィールドが追加されるというものです。 #データディクショナリの取得

  • 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);
    }

    複数選択の状況を考慮し、最初に複数選択か、デフォルトのカンマスプライシングかを判断し、後で入力パラメータ制御を追加します;

    @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;
    }
  • According to key Redisに存在するかどうかを確認し、存在する場合は直接取得、存在しない場合はインターフェース経由で取得、取得できた場合は直接Redisに入れ、再度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());
        }
    }
}

データ ディクショナリ値をループに配置する

@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());
}

データ ディクショナリの種類に従って、インターフェイスを通じてデータを取得します。この実装クラスにはマイクロサービスごとに 1 つの実装が必要であることに注意してください。基本データサービスのハングを避けるため、呼び出し時にエラーが報告された場合は、デフォルトの実装が共通で提供されます。

4.

@Dict(type = "inspectType")
private String checkType;

を使用して、フロントエンドに返されるエンティティの対応するフィールドに注釈を追加し、データ ディクショナリ タイプの値

      {
        "id": "1522492702905954306",
        "professionName": "专业名称888",
        "checkCode": "检测项编码8",
        "checkProject": "rrrr检测项目88",
        "checkDevice": "52",
        "checkStandard": "检测项编码88",
        "referenceStandard": "wq参考标准8",
        "checkType": "1",
        "checkTypeName": "尺寸",
        "remarks": "ef备注备注8"
      },

によって取得される json を指定します。フロントエンドにはもう 1 つのフィールド checkTypeName があり、内容は checkType の中国語の値です。

以上がSpringbootでアノテーションに基づいてデータディクショナリを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。