2016-09-22 5 views
1

JDBI 2.73과 함께 Dropwizard 1.0.0을 사용하고 있습니다. 일부 개체가있는 매퍼를 만들고 싶습니다. 따라서 몇 가지 인수가있는 생성자.DropWizard의 생성자와 JDBI 매퍼 주석 사용

하지만 던지고 예외 :

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 생성자가 하나 있어야합니다. objectMapper가 사용되지 않았으므로 제거했습니다. 아래의 매퍼는 잘 작동합니다. 인수 없음의 생성자가 있어야합니다 @Mapper 클래스를 사용하는 경우 Manikandan는 알 수 있듯이

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

.

그러나이 제한, 예컨대 :

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