如何解决spring控制器中绑定枚举的问题
当我使用commonparam通过spring执行一些公共逻辑时。我发现我无法使用枚举进行输入。与postman或其他类似。在JSON负载中,KeyTypeEnum的值应该是如何解决spring控制器中绑定枚举的问题,spring,spring-boot,spring-mvc,Spring,Spring Boot,Spring Mvc,当我使用commonparam通过spring执行一些公共逻辑时。我发现我无法使用枚举进行输入。与postman或其他类似。在JSON负载中,KeyTypeEnum的值应该是PHONE。按您期望的值1进行唯一解析是不可行的。您可以有多个具有相同值的枚举。为了解决这个问题,我尝试了很多方法。最后,感谢上帝,我成功了 这仅适用于RequestMethod.POST,并且您的参数必须是object(可能RequestMethod.GET或single param也可用。但我还没有找到如何做到这一点)
PHONE
。按您期望的值1
进行唯一解析是不可行的。您可以有多个具有相同值的枚举。为了解决这个问题,我尝试了很多方法。最后,感谢上帝,我成功了
这仅适用于RequestMethod.POST,并且您的参数必须是object(可能RequestMethod.GET或single param也可用。但我还没有找到如何做到这一点)
例子
最后但并非最不重要
通过使用@JsonCreator
我们可以确保像“1”(此代码是KeyTypeEnum已经定义的值)这样的输入可以成功转换为enum。
@JsonValue
确保spring可以成功获取“1”
为了得到正确的答案,你实际上需要问一个问题。你发布的内容看起来像问题中的问题答案。编辑您的问题以移动答案中的答案部分。谢谢。我已被移动@davidxxx@Forest10. 很好,这解释得很好。您有我的投票权。参数名称已限定应转换哪个枚举。我尝试了
电话
,但失败。你能展示一些示例代码吗?谢谢!
@Data
@Builder
@AllArgsConstructor
@RequiredArgsConstructor
public class CommonParam implements Serializable {
/**
*
*/
@Size(min = 1, max = CommonConstants.MAX_PARTITION_SIZE)
private List<String> texts;
/**
*
*/
@NotNull
private KeyTypeEnum keyTypeEnum;
}
@PostMapping("/do")
public RpcResult do(@RequestBody @Valid CommonParam commonParam) {
.....
}
public enum KeyTypeEnum {
/**
* 手机号
*/
PHONE(1, "phone");
private int value;
private String desc;
KeyTypeEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
public static KeyTypeEnum getByDesc(String desc) {
for (KeyTypeEnum b : KeyTypeEnum.values()) {
if (b.getDesc()
.equals(desc)) {
return b;
}
}
return null;
}
@JsonCreator
public static KeyTypeEnum getByValue(int value) {
for (KeyTypeEnum b : KeyTypeEnum.values()) {
if (Objects.equals(b.getValue(), value)) {
return b;
}
}
return null;
}
@JsonValue
public int getValue() {
return value;
}
public String getDesc() {
return desc;
}
}