Maison >Java >javaDidacticiel >Comment obtenir le dictionnaire de données basé sur une annotation dans Springboot
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.
Basé sur l'architecture du microservice, le dictionnaire de données est obtenu via le service
@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @JacksonAnnotationsInside @JsonSerialize(using = DictSerializer.class) public @interface Dict { /** 字典类型 */ String type(); }
Spécifiez le traitement de sérialisation 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); } }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
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); }# 🎜🎜#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; }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()); } } }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()); }
@Dict(type = "inspectType") private String checkType;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" },#🎜 🎜# 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!