sharp-common支持HttpMessageConverter对枚举Enum自定义转换

枚举类

StatusEnum code是String类型

@AllArgsConstructor
@Getter
public enum StatusEnum {
    DEFAULT("DEFAULT");

    @JsonValue
    public String getCode() {
        return this.name();
    }

    private final String label;

    public static StatusEnum valueOfCode(String code) {
        return valueOf(code);
    }
}

SexEnum code是int类型

@AllArgsConstructor
@Getter
public enum SexEnum {
    DEFAULT(1, "DEFAULT");

    private static final Map<Integer, SexEnum> codeMap = new HashMap<>();

    static {
        for (SexEnum e : values()) {
            codeMap.put(e.code, e);
        }
    }

    private final int code;

    private final String label;

    @JsonValue
    public int getCode() {
        return this.code;
    }

    public static SexEnum valueOfCode(int code) {
        return codeMap.get(code);
    }
}

枚举中必须包含静态方法 valueOfCode 和 方法 getCode

添加对Enum的转换配置

MvcConfig.java

@Configuration
@AllArgsConstructor
public class MvcConfig implements WebMvcConfigurer {

    private final ObjectMapper objectMapper;

    @Override
    public void addFormatters(FormatterRegistry registry) {
        // 排在前面优先使用 如果没有找到code仍然会尝试NAME。所以SexEnum可以通过1或者DEFAULT去反序列化
        registry.addConverterFactory(new CodeToEnumConverterFactory());
    }

    @PostConstruct
    public void postConstruct() {
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addDeserializer(Enum.class, new EnumJsonDeserializer());
        objectMapper.registerModule(simpleModule);
    }

}
  • addFormatters方法处理 FormHttpMessageConverter 对Enum的反序列化。如果没有找到code仍然会尝试NAME。所以SexEnum可以通过 1 或者 DEFAULT 去反序列化
  • postConstruct方法处理 MappingJackson2HttpMessageConverter 对Enum的反序列化

User.java

@Data
public class User {

    private SexEnum sex;

    private StatusEnum status;

    private String name;

}

测试

添加API接口

@RestController
public class TestController {

    @GetMapping("/test")
    public User test(@RequestBody User user) {
        System.out.println(user);
        return user;
    }

    @GetMapping("/test1")
    public User test1(User user) {
        System.out.println(user);
        return user;
    }
}

客户端请求

application/json 发起请求,后端 @RequestBody 接收数据

curl -X GET \
  http://127.0.0.1:8080/test \
  -H 'Content-Type: application/json' \
  -d '{
    "status": "DEFAULT",
    "name": "Rick",
    "sex": 1
}'

通过参数的方式发起数据

curl -X GET \
  'http://127.0.0.1:8080/test1?sex=1&status=DEFAULT&name=Rick'

curl -X GET \
  'http://127.0.0.1:8080/test1?sex=DEFAULT&status=DEFAULT&name=Rick'