[Enhancement] 希望增加更通用的类型转换接口
- Dominant language
- Java
- Stars
- 6.2k
- Forks
- 532
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 42
Description
### Search before asking
- [x] I searched in the [issues](https://github.com/apache/fesod/issues) and found nothing similar.
### Motivation
实现枚举的通用转换,一个枚举转化器适用所有枚举(继承同一个接口,属性一样)
### Solution
参照springmvc参数转换接口,org.springframework.core.convert.converter.ConverterFactory和org.springframework.core.convert.converter.Converter
```
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new StringToIEnumConverterFactory());
}
}
```
```
@Slf4j
public class StringToIEnumConverterFactory implements ConverterFactory {
@Override
public Converter getConverter(Class targetType) {
return new StringToIEnumConverter(targetType);
}
private class StringToIEnumConverter implements Converter {
private final Class enumType;
public StringToIEnumConverter(Class enumType) {
this.enumType = enumType;
}
@Override
public T convert(String source) {
if (StrUtil.isBlank(source)) {
return null;
}
T result;
try {
ParameterizedType parameterizedType = (ParameterizedType) enumType.getGenericInterfaces()[0];
Class actualTypeArgument = (Class) parameterizedType.getActualTypeArguments()[0];
Method getEnumByValueMethod = enumType.getMethod("getEnumByValue", actualTypeArgument);
Object args = source;
if (StrUtil.equals(actualTypeArgument.getName(), Integer.class.getName())) {
args = Integer.valueOf(source);
}
result = (T) getEnumByValueMethod.invoke(null, args);
} catch (Exception e) {
log.error("字符串转IEnum枚举发生异常", e);
return null;
}
return result;
}
}
}
```
```
public interface IEnum {
T getValue();
}
```
```
@Getter
@AllArgsConstructor
public enum Sex implements IEnum {
MALE(1, "男"), FEMALE(0, "女");
private final int value;
private final String desc;
@JsonValue
@Override
public Integer getValue() {
return this.value;
}
@JsonCreator
public static Sex getEnumByValue(Integer value) {
if (value == null) {
return null;
}
return Arrays.stream(Sex.values()).filter(one -> Objects.equals(one.getValue(), value)).findAny().orElse(null);
}
}
```
### Alternatives
_No response_
### Anything else?
_No response_
### Are you willing to submit a PR?
- [ ] I'm willing to submit a PR!
Contributor guide
Assessment
This issue has not been assessed yet.