Как решить проблему привязки перечисления в контроллере spring

когда я использую общий параметр для выполнения некоторой общей логики с помощью spring. Я обнаружил, что не могу использовать enum для ввода. как почтальон или другой.

Чтобы получить правильный ответ, вам действительно нужно задать вопрос.

J-Alex 30.01.2019 12:12

То, что вы разместили, выглядит как вопрос-ответ в вопросе. Отредактируйте свой вопрос, чтобы переместить часть ответа в ответ.

davidxxx 30.01.2019 12:12

спасибо. Я был тронут. @davidxxx

Forest10 30.01.2019 13:13

@Лес10. Отлично, это очень хорошо объяснено. У вас есть мой голос.

davidxxx 30.01.2019 14:02
1
4
129
2

Ответы 2

Значение KeyTypeEnum должно быть PHONE в полезной нагрузке JSON. Невозможно однозначно разрешить значение 1, как вы ожидаете. У вас может быть несколько перечислений с одинаковым значением.

имя параметра было определено, какое перечисление должно быть преобразовано. Я пробовал PHONE, но не удалось. Можете ли вы показать пример кода? Спасибо!

Forest10 30.01.2019 13:07

Чтобы решить эту проблему, я пробую много способов. наконец, слава богу. Я добился успеха.

Это только для 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 Единицу можно успешно получить за весну.

Другие вопросы по теме