我正在使用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();
}
如何创建带有构造函数的映射器并将其用作注释?
答案 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();
}
}