2016-09-22 163 views
1

我使用Dropwizard 1.0.0以及JDBI 2.73。 我想用一些對象創建一個映射器。因此,有一些參數的構造函數。在Dropwizard中使用JDBI Mapper註解和構造函數

但它引發異常:

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

DAO創建

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

創建映射。

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類註冊ResultSetMapper自己嗎? – Manikandan

+0

@Manikandan我已經更新了Mapper類的代碼 – gagangupt16

回答

1

映射器應該有一個沒有參數的構造函數。由於沒有使用objectMapper,我將其刪除。下面的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"; 

    @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外部注入對象到您的映射器中,那麼Jonathan的答案應該能夠做到。 – qualidafial

2

由於Manikandan表明,使用@Mapper類時必須有一個無參數的構造函數。

然而,你可以沒有這個限制,例如:

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