Невозможно создать экземпляр java.time.LocalDate (не существует создателей, таких как конструкция по умолчанию): невозможно десериализовать из значения объекта

Пожалуйста, помогите мне со следующей проблемой: я вызываю mysql SP с помощью simpleJdbcCall, но у меня проблема с атрибутом LocalDate в моем bean-компоненте. Я надеюсь, что кто-то может мне помочь

SP

CREATE DEFINER=`dbadmin`@`%` PROCEDURE `SP_LIST_EQUIPMENT`()
BEGIN
    SELECT `ID`,
        `PO_NUMBER`,
        `BRAND`,
        `SKU`,
        `DESCRIPTION`,
        `IMEI`,
        `QUANTITY`,
        `DISPATCH_DATE`,
        `CREATED_BY`,
        `UPDATED_BY`
    FROM `mandato_db`.`mandato_equipment`;
END

фасоль

public class Equipment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String poNumber;
    private String brand;
    private String sku;
    private String description;
    private String imei;
    private int quantity;
    private LocalDate dispatchDate;
    private String createdBy;
    private String updatedBy;

}

Дао

    @Override
    public List<Equipment> list() {
        String procedureName = "SP_LIST_EQUIPMENT";
        simpleJdbcCall = new SimpleJdbcCall(dataSource).withProcedureName(procedureName)
                .returningResultSet("equipments", BeanPropertyRowMapper.newInstance(Equipment.class));
        Map<String, Object> out = simpleJdbcCall.execute();

        ObjectMapper mapper = new ObjectMapper();
        // Here the error occurs
        List<Equipment> list = mapper.convertValue(out.get("equipments"), new TypeReference<List<Equipment>>() {});

        return list;
    }

StackTrace

org.springframework.dao.InvalidDataAccessApiUsageException: невозможно создать экземпляр java.time.LocalDate (не существует создателей, таких как конструкция по умолчанию): невозможно десериализовать из значения объекта (нет создателя на основе делегатов или свойств) в [Источник: НЕИЗВЕСТНО; строка: -1, столбец: -1] (через цепочку ссылок: java.util.ArrayList [0] -> pe.com.ripley.mandatobackend.bean.Equipment ["dispatchDate"]); вложенное исключение - java.lang.IllegalArgumentException: невозможно создать экземпляр java.time.LocalDate (не существует создателей, таких как конструкция по умолчанию): невозможно выполнить десериализацию из значения объекта (нет создателя на основе делегатов или свойств) в [Источник: НЕИЗВЕСТНО; строка: -1, столбец: -1] (через цепочку ссылок: java.util.ArrayList [0] -> pe.com.ripley.mandatobackend.bean.Equipment ["dispatchDate"]) в org.springframework.orm.jpa .EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible (EntityManagerFactoryUtils.java:374)


person Jhon Anaya Valiente    schedule 26.12.2019    source источник
comment
см. это   -  person Hadi J    schedule 27.12.2019


Ответы (1)


Java 8 позволяет сопоставить типы JDBC TIME, DATE и TIMESTAMP с типами java.time - LocalTime, LocalDate и LocalDateTime.

Чтобы выполнить преобразование между датой SQL и LocalDate, вам нужно будет использовать аннотацию перед объявлением в dispatchDate в вашем классе Equipment.

 @Column(name = "local_date", columnDefinition = "DATE")
 private LocalDate dispatchDate;
person Magdalena Fairfax    schedule 27.12.2019
comment
Не совсем правильно. Устаревший класс java.sql.Timestamp был заменен на java.time.OffsetDateTime или Instant. JDBC 4.2 требует поддержки OffsetDateTime. Все они представляют собой момент, конкретную точку на временной шкале. LocalDateTime не представляет момент. - person Basil Bourque; 28.12.2019