在Dropwizard中使用JDBI Mapper Annotation和Constructor

时间:2016-09-22 16:56:03

标签: java dropwizard jdbi

我正在使用Dropwizard 1.0.0和JDBI 2.73。 我想用一些对象创建一个mapper。因此,一个带有一些参数的构造函数。

但它抛出异常:

java.lang.NoSuchMethodException: com.xyz.db.ReportMapper.<init>()

创建了DAO

@SqlQuery("SELECT * FROM reports")
@Mapper(ReportMapper.class)
List<Report> findReports();

创建了Mapper。

public class ReportMapper implements ResultSetMapper<Report> {
    private static final String ID_COLUMN = "id";
    private static final String NAME_COLUMN = "name";
    private static final String START_DATE_COLUMN = "start_date";
    private static final String END_DATE_COLUMN = "end_date";

    private final ObjectMapper mapper;

    public ReportMapper(ObjectMapper objectMapper){
        this.mapper = objectMapper;
    }

    @Override
    public Report map(int index, ResultSet resultSet, StatementContext statementContext) throws SQLException {

        return Report.builder()
            .id(resultSet.getInt(ID_COLUMN))
            .name(resultSet.getString(NAME_COLUMN))
            .startDate(resultSet.getDate(START_DATE_COLUMN))
            .endDate(resultSet.getDate(END_DATE_COLUMN))
            .build();
    }

如何创建带有构造函数的映射器并将其用作注释?

2 个答案:

答案 0 :(得分:3)

正如Manikandan所建议的,当使用@Mapper时,该类必须具有无参数构造函数。

但是,您可以在没有此限制的情况下自行注册ResultSetMapper,例如:

dbi.registerMapper(new ReportMapper(new ObjectMapper()));

答案 1 :(得分:1)

Mappers应该有一个没有args构造函数。由于未使用objectMapper,我删除了它。下面的映射器应该可以正常工作。

public class ReportMapper implements ResultSetMapper<Report> {
  private static final String ID_COLUMN = "id";
  private static final String NAME_COLUMN = "name";
  private static final String START_DATE_COLUMN = "start_date";
  private static final String END_DATE_COLUMN = "end_date";

  @Override
  public Report map(int index, ResultSet resultSet, StatementContext statementContext) throws SQLException {

    return Report.builder()
        .id(resultSet.getInt(ID_COLUMN))
        .name(resultSet.getString(NAME_COLUMN))
        .startDate(resultSet.getDate(START_DATE_COLUMN))
        .endDate(resultSet.getDate(END_DATE_COLUMN))
        .build();
  }
}