2016-09-22 8 views
1

JDBI 2.73と一緒にDropwizard 1.0.0を使用しています。 いくつかのオブジェクトを持つマッパーを作成したいと思います。したがって、いくつかの引数を持つコンストラクタ。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

マッパーにはargsコンストラクタが1つ必要です。 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の外部からマッパーにオブジェクトを注入する必要がある場合は、Jonathanの答えがそのトリックを行う必要があります。 – qualidafial

2

Manikandanが示すように、@Mapperクラスを使用するときには、引数なしのコンストラクタを持っている必要があります。

ただし、この制限、例えば:

dbi.registerMapper(new ReportMapper(new ObjectMapper())); 
関連する問題