枚举类TestDict.java
public interface TestDict {
@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
enum TypeEnum implements IBaseEnum {
TYPE_A(1, "type a - test"),
TYPE_B(2, "type b - test"),
;
private final Integer value;
private final String label;
}
@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
enum ConclusionEnum implements IBaseEnum {
PASS(1, "正确"),
FAIL(2, "错误");
private final Integer value;
private final String label;
}
}
枚举类父级
@JsonSerialize(using = BaseEnumSerializer.class)
@JsonDeserialize(using = BaseEnumDeserializer.class)
public interface IBaseEnum {
/**
* 获取枚举值
*
* @return
*/
Integer getValue();
/**
* 获取枚举文本
*
* @return
*/
String getLabel();
/**根据枚举值和type获取枚举*/
static <T extends IBaseEnum> T getEnum(Class<T> type, int value) {
T[] objs = type.getEnumConstants();
for (T em : objs) {
if (em.getValue().equals(value)) {
return em;
}
}
return null;
}
}
响应参数转换枚举
public class BaseEnumSerializer extends JsonSerializer<IBaseEnum> {
@Override
public void serialize(IBaseEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (Objects.isNull(value)) {
gen.writeNull();
return;
}
gen.writeNumber(value.getValue());
}
}
@NoArgsConstructor
public class BaseEnumDeserializer extends JsonDeserializer<IBaseEnum> implements ContextualDeserializer {
private Class<? extends IBaseEnum> clazz;
public BaseEnumDeserializer(Class<? extends IBaseEnum> clazz) {
this.clazz = clazz;
}
@SneakyThrows
@Override
public IBaseEnum deserialize(JsonParser jsonParser, DeserializationContext ctxt) {
final String param = jsonParser.getText();
return Arrays.stream(clazz.getEnumConstants())
.filter(x -> x.getValue().toString().equals(param))
.findFirst()
.orElse(null);
}
@SuppressWarnings({"unchecked"})
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
JavaType type = property.getType();
// 如果是容器,则返回容器内部枚举类型
while (type.isContainerType()) {
type = type.getContentType();
}
return new BaseEnumDeserializer((Class<? extends IBaseEnum>) type.getRawClass());
}
}