前端传的值都是Integer类型,有的方法能直接接收成LeaseStatus枚举类型,但有的方法只能接收为Integer类型
枚举类
public enum LeaseStatus implements BaseEnum {
SIGNING(1, "签约待确认"),
SIGNED(2, "已签约"),
CANCELED(3, "已取消"),
EXPIRED(4, "已到期"),
WITHDRAWING(5, "退租待确认"),
WITHDRAWN(6, "已退租"),
RENEWING(7, "续约待确认");
@EnumValue
@JsonValue
private Integer code;
private String name;
LeaseStatus(Integer code, String name) {
this.code = code;
this.name = name;
}
@Override
public Integer getCode() {
return this.code;
}
@Override
public String getName() {
return this.name;
}
}
问题解决:
创建StringToBaseEnumConverterFactory,集中编写各枚举类的转换逻辑
@Component
public class StringToBaseEnumConverterFactory implements ConverterFactory<String, BaseEnum> {
@Override
public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
return new Converter<String, T>() {
@Override
public T convert(String source) {
for (T enumConstant : targetType.getEnumConstants()) {
if (enumConstant.getCode().equals(Integer.valueOf(source))) {
return enumConstant;
}
}
throw new IllegalArgumentException("非法的枚举值:" + source);
}
};
}
}
再注册上述类
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Autowired
private StringToBaseEnumConverterFactory stringToBaseEnumConverterFactory;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(this.stringToBaseEnumConverterFactory);
}
}