apache / apache/fesod

[Enhancement] 希望增加更通用的类型转换接口

Open
#817 1 comment 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.