2016-09-22 3 views
1

Я использую Dropwizard 1.0.0 вместе с JDBI 2.73. Я хочу создать картограф с некоторыми объектами. Следовательно, конструктор с некоторыми аргументами.Использование JDBI Mapper Annotation с конструктором в Dropwizard

Но это бросает исключение:

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

Вы можете оставить свой полный класс ReportMapper? – Manikandan

+0

@Manikandan Я обновил код класса Mapper – gagangupt16

ответ

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(); 
    } 
} 
+0

Я буду использовать ObjectMapper. Мне может потребоваться передать больше объектов. – gagangupt16

+0

Если вам нужно вводить объекты извне JDBI в ваш картограф, тогда ответ Джонатана должен сделать трюк. – qualidafial

2

Как следует Manikandan, при использовании @Mapper класса должен иметь конструктор без аргументов.

Однако вы можете зарегистрировать ResultSetMapper самостоятельно без этого ограничения, например .:

dbi.registerMapper(new ReportMapper(new ObjectMapper())); 
Смежные вопросы