Skip to content

fix: CalendarMapperTypeHandler의 CallableStatement getResult가 항상 null을 반환하는 문제 수정 - #328

Open
wantaekchoi wants to merge 1 commit into
eGovFramework:mainfrom
wantaekchoi:fix/calendar-mapper-callablestatement-getresult
Open

fix: CalendarMapperTypeHandler의 CallableStatement getResult가 항상 null을 반환하는 문제 수정#328
wantaekchoi wants to merge 1 commit into
eGovFramework:mainfrom
wantaekchoi:fix/calendar-mapper-callablestatement-getresult

Conversation

@wantaekchoi

Copy link
Copy Markdown
Contributor

수정 사유 Reason for modification

  • 버그수정 Bug fixes
  • 기능개선 Enhancements
  • 기능추가 Adding features
  • 기타 Others

수정된 소스 내용 Modified source

CalendarMapperTypeHandlergetResult 오버로드 넷 중 셋은 getTimestamp로 값을 읽어 Calendar로 변환하는데, getResult(CallableStatement, int)만 본문이 return null입니다.

getResult(ResultSet, String)      rs.getTimestamp(columnName)  -> Calendar
getResult(ResultSet, int)         rs.getTimestamp(columnIndex) -> Calendar
getResult(CallableStatement, int) return null

CallableStatement에도 getTimestamp(int)가 있으므로 못 읽는 것이 아닙니다. 저장 프로시저의 OUT 파라미터를 Calendar로 매핑하면 예외도 로그도 없이 항상 null이 돌아옵니다.

AS-IS

public Calendar getResult(CallableStatement cs, int columnIndex) throws SQLException {
    return null;
}

TO-BE

public Calendar getResult(CallableStatement cs, int columnIndex) throws SQLException {
    java.util.Calendar cal = java.util.Calendar.getInstance();
    if (cs.getTimestamp(columnIndex) == null) {
        return null;
    } else {
        java.sql.Timestamp ts = cs.getTimestamp(columnIndex);
        cal.setTime(ts);
        return cal;
    }
}

형제 오버로드 getResult(ResultSet, int)의 본문을 그대로 옮겼습니다.

영향 범위

종전에 항상 null이던 경로만 값을 돌려주게 됩니다. 다른 세 오버로드는 건드리지 않았습니다.

JUnit 테스트 JUnit tests

  • JUnit 테스트 JUnit tests
  • 수동 테스트 Manual testing

기존 CalendarMapperTypeHandlerTestCallableStatement 케이스 2건을 추가했습니다. 같은 파일이 이미 쓰고 있는 Proxy 방식을 그대로 따랐습니다.

수정 지점만 되돌린 상태(RED)

[ERROR] Tests run: 4, Failures: 0, Errors: 1, Skipped: 0
[ERROR]   CalendarMapperTypeHandlerTest.callableStatementNonNullColumnConverts NullPointer Cannot invoke "java.util.Calendar.getTimeInMillis()" because "cal" is null

수정 후(GREEN, 모듈 전체)

[INFO] Tests run: 121, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS

… 반환하는 문제 수정

TypeHandler<Calendar>의 getResult 오버로드 넷 중 셋은 getTimestamp로 값을 읽어
Calendar로 변환하는데, getResult(CallableStatement, int)만 본문이 return null이다.

  getResult(ResultSet, String)      rs.getTimestamp(columnName)  -> Calendar
  getResult(ResultSet, int)         rs.getTimestamp(columnIndex) -> Calendar
  getResult(CallableStatement, int) return null

CallableStatement에도 getTimestamp(int)가 있으므로 못 읽는 것이 아니다. 저장
프로시저의 OUT 파라미터를 Calendar로 매핑하면 예외도 로그도 없이 항상 null이
돌아온다. 이 오버로드가 미지원이라는 javadoc이나 주석은 없다.

형제 오버로드 getResult(ResultSet, int)의 본문을 그대로 옮겼다. 같은 파일에서
인덱스 기반 getResult가 컬럼명 기반 형제와 달라 NULL 가드가 없던 문제를 대칭으로
고친 선례(163b704)와 같은 결이다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant