栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java枚举自动转换

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java枚举自动转换

目录
  • 前后端交互枚举转换
    • get请求(参数放url)
    • post请求(参数放body)
  • 后端与数据库交互枚举转换

前后端交互枚举转换 get请求(参数放url)

提供两个接口,分别处理以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."));
	}

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/314716.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号