🧩 一、效果預期
@Data
public class UserVO {private String status;@DictTranslate(type = "user_status")private String statusName;
}
最終返回 JSON:
{"status": "1","statusName": "啟用"
}
🛠? 二、實現步驟
1. 定義注解 @DictTranslate
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DictTranslate {/*** 字典類型,對應數據源中的類型,比如 "user_status"*/String type();
}
2. 構建字典緩存或查詢類(模擬)
實際項目中應從數據庫中加載緩存
@Component
public class DictService {private static final Map<String, Map<String, String>> DICT = new HashMap<>();static {Map<String, String> userStatus = new HashMap<>();userStatus.put("0", "禁用");userStatus.put("1", "啟用");DICT.put("user_status", userStatus);}public String translate(String type, String code) {return DICT.getOrDefault(type, Collections.emptyMap()).getOrDefault(code, code);}
}
3. 創建序列化器(核心)
public class DictTranslateSerializer extends JsonSerializer<Object> implements ContextualSerializer {private String dictType;@Autowiredprivate DictService dictService;public DictTranslateSerializer() {}public DictTranslateSerializer(String dictType, DictService dictService) {this.dictType = dictType;this.dictService = dictService;}@Overridepublic void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {String translated = dictService.translate(dictType, String.valueOf(value));gen.writeString(translated);}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {if (property != null) {DictTranslate annotation = property.getAnnotation(DictTranslate.class);if (annotation != null) {DictService dictService = SpringContextUtil.getBean(DictService.class); // 自定義工具類return new DictTranslateSerializer(annotation.type(), dictService);}}return prov.findValueSerializer(property.getType(), property);}
}
4. 啟用序列化器(在字段上)
@Data
public class UserVO {private String status;@DictTranslate(type = "user_status")@JsonSerialize(using = DictTranslateSerializer.class)private String statusName;
}
5. 補充工具類 SpringContextUtil
(從 Spring 上下文中獲取 Bean)
@Component
public class SpringContextUtil implements ApplicationContextAware {private static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext ctx) {SpringContextUtil.context = ctx;}public static <T> T getBean(Class<T> clazz) {return context.getBean(clazz);}
}
? 補充建議
你還可以使用 注解+切面(AOP) 或 @ControllerAdvice
來統一處理字典翻譯,從而做到:
- 不修改實體類結構;
- 支持所有出參 DTO 的自動翻譯;
- 支持分頁列表等統一轉換。
如需這種進階版本,也可以告訴我,我來幫你封裝。
? 最終效果
- 只需在字段上添加
@DictTranslate(type = "xxx")
和@JsonSerialize(using = DictTranslateSerializer.class)
- 字段會自動從字典中翻譯為對應值
是否需要我打包成一個小型 Spring Boot 示例項目結構?或者幫你升級為支持 AOP 統一翻譯?歡迎繼續提問。