отобразить строку json в enum - PullRequest
0 голосов
/ 02 мая 2018

У меня есть следующие 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){

}

Поскольку можно найти enum по его имени , я хотел бы опубликовать 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;
    }
}

Обновление: Я не упомянул, что я использую атрибут @data lombok для автоматической генерации методов получения и установки, что не очень хорошо работает с привязками перечисления (не знаю почему).
Я думаю, что лень имеет цену.

1 Ответ

0 голосов
/ 02 мая 2018

Он должен быть сериализован автоматически через Джексона, но вы можете форсировать его через @ JsonCreator
Переопределите свои перечисления как

public enum MyFirstEnum{
    MY_FIRST_ENUM1,
    MY_FIRST_ENUM2;

    @JsonCreator
    public static MyFirstEnum fromString(String raw) {
        return MyFirstEnum.valueOf(raw.toUpperCase());
    }
}

Аналогичным образом определите ваше второе перечисление аналогичным образом.

Примечание к акциям (обязательно)

MapTest должен иметь общедоступный установщик / получатель для обоих перечислений (если он объявлен закрытым, предпочтительным) или объявить их общедоступными (следует избегать, но не предпочтительным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...