Сопоставитель компонентов с @SqlQuery и @RegisterBeanMapper не может создать экземпляр JDBI V3

Я не могу использовать Jdbi с интерфейсом Dao, как показано в документации, см. http://jdbi.org/#_reflection_mappers он выдает следующее исключение:

Exception in thread "main" java.lang.IllegalArgumentException: A bean, model.tipolog.TipoLog, was mapped which was not instantiable
List<TipoLog> tipoLogs1=jdbi.withExtension(TipoLogDao.class,dao->{
        return dao.listAllLogs();
});

public interface TipoLogDao {
    @SqlQuery("SELECT * FROM tamble")
    @RegisterBeanMapper(TipoLog.class)
    List<TipoLog> listAllLogs();
}

public class TipoLog {

    private String IdTipoLog;
    private String Nombre;
    private String Descripcion;
    private String Activo;

    @ConstructorProperties({"IdTipoLog", "Nombre", "Descripcion", "Activo"})
    public TipoLog(String IdTipoLog, String Nombre, String Descripcion, String Activo) {
        this.IdTipoLog = IdTipoLog;
        this.Nombre = Nombre;
        this.Descripcion = Descripcion;
        this.Activo = Activo;
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
3 405
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Примечание. Это решение работает, но если вы хотите использовать определенный конструктор (а не конструктор по умолчанию), то этот ответ не тот, который вы ищете. Как сказал Джигар Шах, используйте @RegisterConstructorMapper вместо @RegisterBeanMapper. BeanMapper использует только конструктор по умолчанию и устанавливает значения свойств. Чтобы использовать конкретный конструктор, решение состоит в том, чтобы использовать ConstructorMapper.

Вашему классу TipoLog нужен конструктор по умолчанию. Это работает:

User.java

import java.beans.ConstructorProperties;

public class User {
    int id;
    String name;

    // required default constructor
    public User() {
        super();
    }

    @ConstructorProperties({ "id", "name" })
    public User(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    // getter, setter, hashCode, equals, toString
}

UserDao.java

import java.util.List;

import org.jdbi.v3.sqlobject.config.RegisterBeanMapper;
import org.jdbi.v3.sqlobject.statement.SqlQuery;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;

public interface UserDao {
    @SqlUpdate("CREATE TABLE user (id INTEGER PRIMARY KEY, name VARCHAR)")
    void createTable();

    @SqlUpdate("INSERT INTO user(id, name) VALUES (?, ?)")
    void insertPositional(int id, String name);

    @SqlQuery("SELECT * FROM user ORDER BY name")
    @RegisterBeanMapper(User.class)
    List<User> listUsers();
}

ConstructorPropertiesExplore.java

import java.util.List;
import static org.assertj.core.api.Assertions.*;
import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.sqlobject.SqlObjectPlugin;

public class ConstructorPropertiesExplore {

    public static void main(String[] args) {
        Jdbi jdbi = Jdbi.create("jdbc:h2:mem:test");
        jdbi.installPlugin(new SqlObjectPlugin());

        List<User> users = jdbi.withExtension(UserDao.class, dao -> {
            dao.createTable();
            dao.insertPositional(0, "Alice");
            dao.insertPositional(1, "Bob");
            dao.insertPositional(2, "Clarice");
            dao.insertPositional(3, "David");

            return dao.listUsers();
        });

        assertThat(users).containsExactly(new User(0, "Alice"), new User(1, "Bob"), new User(2, "Clarice"),
                new User(3, "David"));
    }

}

это работает отлично, но как я могу улучшить это? потому что у него есть конструктор по умолчанию

Santiago molano perdomo 31.05.2019 18:11

Что вы хотите улучшить? Я не понимаю вашего комментария.

user11044402 31.05.2019 21:25

Вам не нужен конструктор по умолчанию. Используйте @RegisterConstructorMapper вместо @RegisterBeanMapper.

Другие вопросы по теме