Принять пустую строку для Enum в вызовах REST в приложении Spring Boot - PullRequest
0 голосов
/ 19 мая 2018

Я сделал REST-приложение Spring Boot 2.Я потребляю отдых с Angular.У меня проблема с перечислением.

Типичная сторона сервера перечислений:

public enum EngineType {
    DIESEL, METHANE, ELECTRIC;

    @Nullable
    public static EngineType valueOfNullable(String value) {
        try {
            return valueOf(value);
        } catch (Exception e) {
            return null;
        }
    }
}

Некоторые сущности используют эти перечисления в качестве полей и, конечно, они могут быть нулевыми.К сожалению, когда клиент делает POST объекта, отправляющего «» (пустую строку) для перечисления (потому что оно может быть нулевым), у меня появляется ошибка на стороне сервера:

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `server.model.enums.EngineType` from String "": value not one of declared Enum instance names: [DIESEL, METHANE, ELECTRIC]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `server.model.enums.EngineType` from String "": value not one of declared Enum instance names: [DIESEL, METHANE, ELECTRIC]
 at [Source: (PushbackInputStream); line: 1, column: 153] (through reference chain: server.model.tickets.Ticket["engineType2"])

Я понимаю смыслсообщения, и я могу решить проблему создания собственного десериализатора следующим образом:

@Component
public class EngineTypeDeserializer extends JsonDeserializer<EngineType> {

    @Override
    public EngineType deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        return EngineType.valueOfNullable(node.asText());
    }

}

, но я должен поместить эту аннотацию @JsonDeserialize(using = EngineTypeDeserializer.class) во все поля EngineType в моих бобах.

Я искал лучший способ решить эту проблему.У вас есть совет?

1 Ответ

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

Вы можете зарегистрировать свой пользовательский сериализатор программно.

В вашем @Configuration классе:

@Bean
@Primary // Use this to shadow other objectmappers, if anny
public ObjectMapper objectMapper(){
    ObjectMapper objMapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addDeserializer(EngineType.class, new EngineTypeDeserializer());
    objMapper.registerModule(module);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...