枚举类
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'