Я сделал 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
в моих бобах.
Я искал лучший способ решить эту проблему.У вас есть совет?