🧩 一、效果预期
@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 统一翻译?欢迎继续提问。