Projek baharu telah dimulakan baru-baru ini Kamus data digunakan dalam projek Apabila data pertanyaan senarai dikembalikan, kod tersebut perlu ditukar secara manual kepada nama dan dipaparkan di kaunter penerimaan tetamu. Pengurus projek berkata bahawa fungsi bersatu boleh dirangkumkan untuk mengelakkan pengaturcara daripada menulis kod mereka sendiri, mengelirukan dan gaya tidak konsisten.
Berdasarkan seni bina perkhidmatan mikro, kamus data diperoleh melalui perkhidmatan
Kod ringkas, mudah digunakan;
Gunakan Redis;
Arahan umum adalah untuk menyesuaikan anotasi dan melaksanakan pemprosesan data semasa Bersiri; Memandangkan perkhidmatan mikro, adalah perlu untuk meletakkan logik utama menjadi biasa, dan kemudian menyediakan antara muka kepada dunia luar Setiap perkhidmatan perniagaan melaksanakan antara muka untuk mendapatkan data kamus, apabila data bersiri, ia pertama kali diperolehi melalui Redis. Jika ia tidak boleh diperolehi, ia diperoleh melalui antara muka , selepas mendapat data, simpannya dalam Redis, dan kemudian kembali ke pemprosesan, anda juga boleh mengambil langkah tambahan dan mengemas kini kandungan Redis secara serentak apabila menambah atau mengubah suai kamus data untuk memastikan kesahihan data.
Tentukan anotasi
@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @JacksonAnnotationsInside @JsonSerialize(using = DictSerializer.class) public @interface Dict { /** 字典类型 */ String type(); }
Nyatakan lokasi untuk menambah anotasi
Nyatakan masa berkesan anotasi
Nyatakan kelas pemprosesan bersiri
Pemprosesan bersiri 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); } }
Logik yang diproses di sini ialah kandungan medan asal kekal tidak berubah dan medan baharu ditambah untuk menyimpan nilai yang ditukar; >pemerolehan kamus data
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); }
Pertimbangkan situasi pemilihan berbilang, tentukan dahulu sama ada pemilihan berbilang, penyambungan koma lalai, tambah kawalan parameter input kemudian; ke kunci Tentukan sama ada ia wujud dalam Redis, dapatkannya secara langsung jika ia wujud, dapatkannya melalui antara muka jika ia tidak wujud, letakkannya terus ke dalam Redis, dan kemudian dapatkannya dari Redis sekali lagi.
@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; }
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()); } } }
Mengikut jenis kamus data, dapatkan data melalui antara muka ambil perhatian bahawa kelas pelaksanaan ini perlu dilaksanakan oleh setiap perkhidmatan mikro ; dan kemudian untuk mengelakkan perkhidmatan data asas daripada menutup telefon, Jika ralat dilaporkan semasa membuat panggilan, pelaksanaan lalai disediakan secara sama.
4. Gunakan
@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()); }
untuk menambah anotasi pada medan yang sepadan dalam entiti yang dikembalikan ke bahagian hadapan, dan nyatakan nilai jenis kamus data
@Dict(type = "inspectType") private String checkType;
Json yang diperolehi oleh hujung hadapan akan mempunyai satu lagi medan: checkTypeName, kandungannya ialah nilai Cina checkType.
Atas ialah kandungan terperinci Bagaimana untuk mendapatkan kamus data berdasarkan anotasi dalam Springboot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!