枚举类
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。
ItemCategoryEnum 自定义 code,code 允许为””
@AllArgsConstructor
@Getter
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum ItemCategoryEnum {
STANDARD("", "Standard"),
CONSIGNMENT("K", "Consignment"),
SUBCONTRACTING("L", "Subcontracting"),
THIRD_PARTY("S", "Third-party"),
TEXT("T", "Text");
private final String code;
private final String description;
/**
* code枚举 必须重写toString()
*
* @return
*/
@Override
public String toString() {
return code;
}
public static ItemCategoryEnum valueOfCode(String code) {
for (ItemCategoryEnum category : ItemCategoryEnum.values()) {
if (category.getCode().equals(code)) {
return category;
}
}
return null;
}
}
枚举中必须包含静态方法 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'