Не удалось преобразовать значение свойства типа java.lang.String в требуемый тип java.time.LocalDateTime - PullRequest
0 голосов
/ 26 января 2019

Есть много похожих вопросов для моей проблемы, но я не нашел решения. Фрагмент объекта:

@DateTimeFormat
private LocalDateTime valid_from;

@DateTimeFormat
private LocalDateTime valid_to;

Моя форма имеет формат гггг-мм-дд. Я уже пробовал аннотации @DateTimeFormat (format = "yyyy-MM-dd") и ISO. Я пробовал с:

 @InitBinder
public void initBinder(WebDataBinder webDataBinder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setLenient(true);
    webDataBinder.registerCustomEditor(LocalDateTime.class, new CustomDateEditor(dateFormat, true));
}

И

@Converter(autoApply = false)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, String> {

private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

@Override
public String convertToDatabaseColumn(LocalDateTime locDate) {
    return (locDate == null ? null : formatter.format(locDate));
}

@Override
public LocalDateTime convertToEntityAttribute(String dateValue) {
    return (dateValue == null ? null : LocalDateTime.parse(dateValue, formatter));
}

но у меня все еще есть ошибки привязки:

Не удалось преобразовать значение свойства типа java.lang.String в требуемый тип java.time.LocalDateTime для свойства valid_from; вложенным исключением является org.springframework.core.convert.ConversionFailedException: не удалось преобразовать тип [java.lang.String] в тип [@ org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime] для значения 2019-01- 20; вложенное исключение - java.lang.IllegalArgumentException: попытка синтаксического анализа завершилась неудачно для значения [2019-01-20]

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вы можете добавить пользовательский сериализатор и десериализатор, чтобы выполнить то, что вы хотите сделать. Определите сериализатор, как показано ниже.

public class MyDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime();

    @Override
    public DateTime deserialize(final JsonParser jsonParser,
                                final DeserializationContext deserializationContext) throws IOException {
        String dateStr = null;
        String timeStr = null;
        String fieldName = null;

        dateStr = jsonParser.getValueAsString();
        if (dateStr != null) {

            return LocalDateTime.parse(dateStr, formatter);
        }
        return null;
     }
}

Вы можете написать десериализатор, как показано ниже.

public class MyDateTimeSerializer extends JsonSerializer<LocalDateTime> {

    private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime();

    @Override
    public void serialize(final DateTime dateTime,
                          final JsonGenerator jsonGenerator, 
                          final SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(formatter.print(dateTime));
    }   
}

Теперь вы можете комментировать поля даты и времени, как показано ниже.

@JsonSerialize(using = MyDateTimeSerializer.class)
@JsonDeserialize(using = MyDateTimeDeserializer.class)
private LocalDateTime valid_to;
0 голосов
/ 26 января 2019

Почему бы вам не использовать sql Date в вашей сущности и в вашей базе данных, ваш столбец будет иметь метку времени без часового пояса вместо строки ... и если вам нужен формат даты, почему бы вам не использовать LocalDate вместо LocalDateTime? Если вы используете LocalDate, конвертировать в sql Date довольно просто. :)

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