参数为非json格式,由Spring的Converter转换;
针对枚举类,默认是用name进行匹配转换枚举;
实际使用枚举会内部再定义code,使用code进行传参
@AllArgsConstructor
public enum StatusEnum {
SUCCESS(2),
FAIL(4),
;
public final Integer code;
}
为枚举单独定义Converter, 添加进WebMvcConfigurer
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@Slf4j
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
log.info("addConverter");
registry.addConverter(new StatusEnumConverter());
}
static class StatusEnumConverter implements Converter<String,StatusEnum >{
@Override
public StatusEnum convert(String s) {
for(StatusEnum e:StatusEnum.values())
if(e.code.toString().equals(s))
return e;
return null;
}
}
}
为每个枚举定义Converter有点重复工作,可以定义ConverterFactory
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.format.FormatterRegistry;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@Slf4j
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
log.info("addConverterFactory");
registry.addConverterFactory(new EnumConverterFactory());
}
static class EnumConverterFactory implements ConverterFactory<String, ConverterBaseEnum> {
@Override
public <T extends ConverterBaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
System.err.println("add EnumConverterFactory");
return source -> {
for (T e: targetType.getEnumConstants()) {
if (e.getCovertValue().equals(source)) {
return e;
}
}
return null;
};
}
}
}
ConverterBaseEnum为接口
public interface ConverterBaseEnum {
String getCovertValue();
}
需要转换的枚举实现这个接口, 就可以让框架自动转换
import com.fasterxml.jackson.annotation.JsonCreator;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum StatusEnum implements ConverterBaseEnum{
SUCCESS(2),
FAIL(4),
;
public final Integer code;
@Override
public String getCovertValue() {
return code.toString();
}
}
参数为json格式, 需要看项目框架使用了什么json转换器;
jackson处理枚举;
import com.fasterxml.jackson.annotation.JsonCreator;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum StatusEnum implements ConverterBaseEnum{
SUCCESS(2),
FAIL(4),
;
public final Integer code;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static StatusEnum create(Integer code){
for(StatusEnum e:StatusEnum.values()){
if(e.code.equals(code))
return e;
}
return null;
}
@Override
public String getCovertValue() {
return code.toString();
}
}
单独@JsonCreator如果报错,可以更改里面的mode为 DELEGATING;同时方法必须为static方法;
偷懒方式:
使用@JsonValue处理枚举也可以支持反序化;
这时候不可以同时存在@JsonCreator;
同时还要保证json的传参一定是字符串; 如果使用数字,会按照枚举的下标进行对应,导致结果与自己想要的不一致