1.配置类
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(Instant.class, new InstantCustomSerializer());
javaTimeModule.addDeserializer(Instant.class, new InstantCustomDeserializer());
javaTimeModule.addDeserializer(Integer.class, new IntegerCustomDeserializer());
// 注册自定义的 DictSerializer
SimpleModule customModule = new SimpleModule().setSerializerModifier(new DictSerializerModifierHelper());
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new ParameterNamesModule());
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.registerModule(javaTimeModule);
objectMapper.registerModule(customModule);
// 自定义日期转换格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper));
}
class InstantCustomSerializer extends JsonSerializer<Instant> {
private DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
@Override
public void serialize(Instant instant, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (instant != null) {
String jsonValue = formatter.format(instant.atZone(ZoneId.systemDefault()));
jsonGenerator.writeString(jsonValue);
}
}
}
class InstantCustomDeserializer extends JsonDeserializer<Instant> {
private DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
@Override
public Instant deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
String dateString = jsonParser.getText().trim();
if (StringUtils.isNotBlank(dateString)) {
Date parseDate;
try {
parseDate = DateFormatUtil.pareDate(dateString);
if (parseDate != parseDate) {
return parseDate.toInstant();
}
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
return null;
}
}
class IntegerCustomDeserializer extends JsonDeserializer<Integer> {
@Override
public Integer deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
//如果表单数据不为null,并满足指定格式时,进行类型转换
String s = jsonParser.getText();
if (StringUtils.isNotBlank(s)) {
BigInteger sb = new BigInteger(s);
if (sb.compareTo(new BigInteger(Integer.MAX_VALUE + "")) > 0) {
return 0;
}
if (s != null && s.matches("\\d+")) {
return Integer.parseInt(s);
}
}
//当表单数据为空,或格式不合法时,则返回null
return null;
}
}
}
2.初始化类
public class DictSerializerModifierHelper extends BeanSerializerModifier {
@Override
public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
return new DictSerializer(null, null, null, (JsonSerializer<Object>) serializer);
}
}
3.注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Dict {
/**
* 字典类型
*
* @return
*/
String dictCode();
/**
* 返回属性名
*
* @return
*/
String dictName() default "";
}
4.注入类
/**
* 无法注入的问题
*/
@Component
public class DictHelper implements InitializingBean {
@Resource
private CafeEnumMapper dictMapper;
public CafeEnumMapper getDictMapper() {
return dictMapper;
}
private static DictHelper dictHelper;
public static DictHelper init() {
return dictHelper;
}
@Override
public void afterPropertiesSet() throws Exception {
dictHelper = this;
}
}
5.核心
public class DictSerializer extends JsonSerializer<Object> implements ContextualSerializer {
public final Logger logger = LoggerFactory.getLogger(getClass());
// @Dict字典编码
private String dictCode;
// @Dict字典翻译后名称
private String dictName;
// 默认Serializer,从构造函数传入
private JsonSerializer<Object> defSerializer;
// 字典翻译label字段后缀
private static final String DICT_NAME_SUFFIX = "Name";
// 字典数据
private Map<String, String> dictMap = null;
public DictSerializer(String dictCode, String dictName, Map<String, String> dictMap, JsonSerializer<Object> jsonSerializer) {
this.dictCode = dictCode;
this.dictName = dictName;
this.dictMap = dictMap;
this.defSerializer = jsonSerializer;
}
/**
* 获取添加@Dict字段,以及特殊处理Date类型字段
*/
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
// 经过BeanProperty获取自定义注解
if (property == null) {
return defSerializer;
}
//字典
Dict dictAnnotation = property.getAnnotation(Dict.class);
if (dictAnnotation != null) {
LambdaQueryWrapper<CafeEnumEntity> queryWrapper = new LambdaQueryWrapper<CafeEnumEntity>()
.eq(CafeEnumEntity::getEnumkey, dictAnnotation.dictCode());
// 构建key name的map
Map<String, String> dictMap = DictHelper.init().getDictMapper().selectList(queryWrapper).stream().collect(Collectors.toMap(
CafeEnumEntity::getKey,
CafeEnumEntity::getName,
(o, n) -> n));
dictMap.forEach((k, v) -> System.out.println("key:" + k + " value:" + v));
return new DictSerializer(dictAnnotation.dictCode(), dictAnnotation.dictName(), dictMap, defSerializer);
}
//默认JsonSerializer
return defSerializer;
}
@Override
public void serialize(Object key, JsonGenerator gen, SerializerProvider serializers) throws IOException {
defSerializer.serialize(key, gen, serializers);
// 有自定义注解,如status字段 默认生成: statusName
if (StringUtils.isNotBlank(dictCode) && key != null && StringUtils.isNotBlank(key.toString())) {
//要翻译的字段名
String fieldName = gen.getOutputContext().getCurrentName();
//获取翻译后的lable
String label = CollectionUtils.isEmpty(dictMap) ? null : dictMap.get(key.toString());
//生成新的label字段
gen.writeStringField(StringUtils.isBlank(dictName) ? fieldName.concat(DICT_NAME_SUFFIX) : dictName, label);
}
}
}