我该如何解决弹簧控制器中的绑定枚举的问题

时间:2019-01-30 10:51:29

标签: spring spring-boot spring-mvc

当我使用通用参数通过使用spring做一些通用逻辑时。我发现我不能用枚举输入。像邮递员或其他人。

2 个答案:

答案 0 :(得分:1)

为了解决这个问题,我尝试了很多方法。最后,感谢上帝。我成功了。

这仅适用于RequestMethod.POST。并且您的参数必须是对象(也许也可以使用RequestMethod.GET或单个参数。但我还没有找到如何实现的方法)

示例

@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;
    }

}

通过使用@JsonCreator,我们可以确保像'1'这样的输入(此代码是KeyTypeEnum已经定义的值)可以成功转换为枚举。 @JsonValue确保春季成功获得“ 1”。

enter image description here

答案 1 :(得分:0)

在JSON有效负载中,KeyTypeEnum的值应为PHONE。正如您期望的那样,用值1来唯一地解析是不可行的。您可以有多个具有相同值的枚举。