我有以下class
和enum
s:
import lombok.Data;
// other imports...
@Data
public class MapTest{
private MyFirstEnum myFirstEnum;
private MySecondEnum mySecondEnum;
}
public enum MyFirstEnum{
MY_FIRST_ENUM1,
MY_FIRST_ENUM2
}
public enum MySecondEnum {
MY_SECOND_ENUM1,
MY_SECOND_ENUM2
}
和这个弹簧控制器:
@PostMapping("/testMap")
@ResponseBody
public void TestMap(@RequestBody MapTest mapTest){
}
由于an enum can be looked up by its name我想要做的是将json
发布到控制器,并且相应的道具将按其名称序列化:
{
"myFirstEnum": "MY_FIRST_ENUM1",
"mySecondEnum": "MY_SECOND_ENUM2"
}
我尝试设置@JsonDeserialize
,但我无法在重写的函数中获取枚举的类型:
// what type should i use here?
public static class StringToEnum extends JsonDeserializer<???> {
// how do i get the type of the current enum?
@Override
public ??? deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
??? res = Enum.valueOf(p.getText());
return res;
}
}
更新
我没有提到我使用lombok's @data attribute自动生成getter和setter,这对枚举绑定效果不佳(不确定原因)。
我想懒惰会带来代价。
答案 0 :(得分:0)
它应该通过jackson自动序列化,但你可以通过 @JsonCreator 强制它 重新定义您的枚举
public enum MyFirstEnum{
MY_FIRST_ENUM1,
MY_FIRST_ENUM2;
@JsonCreator
public static MyFirstEnum fromString(String raw) {
return MyFirstEnum.valueOf(raw.toUpperCase());
}
}
同样以类似的方式定义你的第二个枚举。
Imp Note(强制性)
MapTest 应该为两个枚举设置公共setter / getter(如果声明为私有,首选),或者将它们公开(应该避免,不是首选)