应用场景:
将string转化为后端的枚举。
大致思路:
编写一个转换器工厂类。获取传入的目标对象,在工厂类中调用转换器,进行转换,向spring容器中注入工厂类。
枚举的接口
public interface BaseEnum {
/**
* Gets value.
*
* @return the value
*/
String getValue();
}
枚举的实现
public enum OrderStatusEnum implements BaseEnum{
/**
* All order status enum.
*/
ALL("ALL"),
/**
* Saved order status enum.
*/
SAVED("Saved"),
/**
* Queued order status enum.
*/
QUEUED("Queued"),
/**
* Requeued order status enum.
*/
REQUEUED("Requeued"),
/**
* Released order status enum.
*/
RELEASED("Released"),
/**
* Finished order status enum.
*/
FINISHED("Finished");
private String value;
OrderStatusEnum(String value){
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
/**
* From value order status enum.
*
* @param text the text
* @return the order status enum
*/
public OrderStatusEnum fromValue(String text) {
for (OrderStatusEnum b : OrderStatusEnum.values()) {
if (String.valueOf(b.value).equals(text)) {
return b;
}
}
return null;
}
/**
* Gets the values list.
*
* @return valueList List
*/
public static List<String> getValuesList() {
List<String> valueList = new ArrayList<String>();
for (OrderStatusEnum b : OrderStatusEnum.values()) {
valueList.add(b.toString());
}
return valueList;
}
@Override
public String getValue() {
return value;
}
}
枚举转换的工厂类
@Component
public class EnumConvertFactory implements ConverterFactory<String,BaseEnum> {
@Override
public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
return new StringToIEum<>(targetType);
}
private static class StringToIEum<T extends BaseEnum> implements Converter<String, T> {
private Class<T> targerType;
/**
* Instantiates a new String to i eum.
*
* @param targerType the targer type
*/
public StringToIEum(Class<T> targerType) {
this.targerType = targerType;
}
@Override
public T convert(String source) {
if (StringUtils.isBlank(source)) {
return null;
}
return (T) EnumUtil.getIEnum(this.targerType,source);
}
}
}
注入枚举工厂类
@Configuration
public class WebContextConfiguration {
@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
/**
* Get web context web context.
*
* @param request the request
* @return the web context
*/
@Bean
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public WebContext getWebContext(@Autowired HttpServletRequest request) {
return new WebContext(request);
}
/**
* Add conversion config.
*/
@PostConstruct
public void addConversionConfig() {
ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) requestMappingHandlerAdapter.getWebBindingInitializer();
if (initializer != null && initializer.getConversionService() != null) {
GenericConversionService genericConversionService = (GenericConversionService)initializer.getConversionService();
if(genericConversionService != null){
genericConversionService.addConverterFactory(new EnumConvertFactory());
}
}
}
}
工具类
public class EnumUtil {
/**
* Gets i enum.
*
* @param <T> the type parameter
* @param targerType the targer type
* @param source the source
* @return the i enum
*/
public static <T extends BaseEnum> Object getIEnum(Class<T> targerType, String source) {
for(T enumObj : targerType.getEnumConstants()){
if(source .equals( enumObj.getValue())){
return enumObj;
}
}
return null;
}
}