- 前后端交互枚举转换
- get请求(参数放url)
- post请求(参数放body)
- 后端与数据库交互枚举转换
提供两个接口,分别处理以code(int类型)和name(String类型)进行转换的枚举
public interface IFeIntegerEnum {
int getCode();
static & IFeIntegerEnum> Optional codeOf(Class enumClass, int value) {
return Arrays.stream(enumClass.getEnumConstants()).filter(e -> e.getCode() == value).findAny();
}
}
public interface IFeStringEnum {
int getName();
static & IFeStringEnum> Optional codeOf(Class enumClass, String name) {
return Arrays.stream(enumClass.getEnumConstants()).filter(e -> e.getName().equals(name)).findAny();
}
}
然后需要两个枚举转换工厂
@Component public class IntegerToEnumConvertFactory implements ConverterFactory{ @Override @Nonnull public Converter getConverter(@Nonnull Class targetType) { return new IntegerToEnum(targetType); } private static class IntegerToEnum & IFeIntegerEnum> implements Converter { private final Class type; public IntegerToEnum(Class type) { this.type = type; } @Override public T convert(@Nonnull String source) { return IFeIntegerEnum.codeOf(this.type,Integer.parseInt(source)).orElseThrow(IllegalArgumentException::new); } } }
@Component public class StringToEnumConvertFactory implements ConverterFactory{ @Override @Nonnull public Converter getConverter(@Nonnull Class targetType) { return new StringToEnum(targetType); } private static class StringToEnum & IFeIntegerEnum> implements Converter { private final Class type; public StringToEnum(Class type) { this.type = type; } @Override public T convert(@Nonnull String source) { return IFeStringEnum.codeOf(this.type,source).orElseThrow(IllegalArgumentException::new); } } }
最后如何看下实际使用
public enum LolEnum implements IFeIntegerEnum,IFeStringEnum {
Q(0,"q技能"),
W(1,"w技能"),
E(2,"e技能"),
R(3,"r技能");
private final int code;
private final String name;
LolEnum (int code,String name){
this.code = code;
this.name = name;
}
@Override
public int getCode(){
return code;
}
@Override
public int getName(){
return name;
}
}
则此时无论前端传0,1,2,3还是qwer技能到后端,后端用此枚举都能正常转换,注意这是传参放url的形势,比较麻烦,如果放body就很简单了
post请求(参数放body)此时可以用json工具自动处理,以jackson为例,直接用@JsonCreator和@JsonValue即可
public enum LolEnum {
Q(0,"q技能"),
W(1,"w技能"),
E(2,"e技能"),
R(3,"r技能");
private final int code;
private final String name;
LolEnum (int code,String name){
this.code = code;
this.name = name;
}
@JsonCreator
public static LolEnum valueOfCode(int code ) {
return Arrays.stream(LolEnum.values()).filter(item -> item.getCode() == code).findFirst().orElseThrow(IllegalArgumentException::new);
}
@JsonValue
public int getCode(){
return code;
}
public int getName(){
return name;
}
}
后端与数据库交互枚举转换
public interface IDBIntegerEnum {
int getCode();
static & IDBIntegerEnum> Optional codeOf(Class enumClass, int value) {
return Arrays.stream(enumClass.getEnumConstants()).filter(e -> e.getCode() == value).findAny();
}
}
@MappedTypes(IDBIntegerEnum.class) @MappedJdbcTypes(JdbcType.INTEGER) public class IntegerEnumTypeHandler& IDBIntegerEnum> extends baseTypeHandler { private final Class type; public IntegerEnumTypeHandler(Class type) { if(type == null){ throw new IllegalArgumentException("Type argument cannot be null"); } this.tyoe = type; } @Override public void setNonNullParameter(PreparedStatement ps,int i,E parameter,JdbcType jdbcType) throws SQLException { ps.setInt(i,parameter.getCode()); } @Override public E getNullableResult(ResultSet rs,String columnName) throws SQLException { int columnValue = rs.getInt(columnName); return rs.wasNull()?null:enumOf(columnValue); } @Override public E getNullableResult(ResultSet rs,int columnIndex) throws SQLException { int columnValue = rs.getInt(columnIndex); return rs.wasNull()?null:enumOf(columnValue); } @Override public E getNullableResult(CallableStatement cs,int columnIndex) throws SQLException { int columnValue = cs.getInt(columnIndex); return rs.wasNull()?null:enumOf(columnValue); } private E enumOf(int value){ return IDBIntegerEnum.codeOf(type,value).orElseThrow(()->new IllegalArgumentException("Cannot convert "+value+" to "+type.getSimpleName()+" by code value.")); } }



