< 에러 메시지 >
4월 25, 2024 9:58:39 오후 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: 경로 [/04]의 컨텍스트 내의 서블릿 [pf]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 7]을(를) 발생시켰습니다.
org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 7
IncorrectResultSetColumnCountException
: 작업 중에 ReultSet(쿼리 결과 집합)의 열 수가 예상과 다른 경우 발생
- 쿼리 실행 시 반환되는 열 수와 기대하는 열 수가 다름
- ResultSet의 get메서드 사용시 열 수 오류
< 원인 >
프로그램은 1개를 예상하였지만 실제로는 7개의 열을 반환하여 에러 발생
public MemberAuthDto getMemberAuthDto(String uri) {
String sql ="SELECT auth_seq, member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn "
+ "FROM forum.member_auth "
+ "WHERE auth_uri ='"+uri+"' AND auth_yn='N'";
return queryForObject(sql, MemberAuthDto.class);
}
queryForObject는 기본형의 싱글컬럼에 사용
MemberAuthDto에서 나오는 컬럼이 1개인건 맞지만 위에 컬럼 7개중 어느컬럼인지 모르기에 에러 발생
어느 컬럼인지 알려주는 Mapper 필요
< 해결 >
public class MemberAuthRowMapper implements ResultSetExtractor<MemberAuthDto>{
@Override
public MemberAuthDto extractData(ResultSet rs) throws SQLException{
MemberAuthDto memberAuthDto = null;
//실행하지 않으면 주소값이 없는 상태(선언만하면 객체인지 주소가 없는지 모름)
//그렇기에 확실하게 객체를 생성 또는 주소값이 없다고 null값을 넣어준다
while(rs.next()) { //다음 로우가 있을때까지(다음로우가 없을때까지 돔)
memberAuthDto = new MemberAuthDto();
memberAuthDto.setAuthSeq(rs.getInt("auth_seq"));
memberAuthDto.setMemberSeq(rs.getInt("member_seq"));
memberAuthDto.setAuthNum(rs.getString("auth_num"));
memberAuthDto.setAuthUri(rs.getString("auth_uri"));
memberAuthDto.setRegDtm(rs.getString("reg_dtm"));
memberAuthDto.setExpireDtm(rs.getString("expire_dtm"));
memberAuthDto.setAuthYn(rs.getString("auth_yn"));
}
return memberAuthDto;
//만약 이 코드에서 select된게 하나도 없으면 사용자는 null을 받는데
//이 코드는 null을 돌려주지 않는다
}
}
MemberAuthRowMapper만들어주고
public MemberAuthDto getMemberAuthDto(String uri) {
String sql ="SELECT auth_seq, member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn "
+ "FROM forum.member_auth "
+ "WHERE auth_uri ='"+uri+"' AND auth_yn='N' ";
return query(sql, new MemberAuthRowMapper());
}
queryForObject 대신 query 사용
'에러 모음' 카테고리의 다른 글
TransientDataAccessResourceException, SQLException (0) | 2024.04.27 |
---|---|
EmptyResultDataAccessException (0) | 2024.04.26 |
CannotGetJdbcConnectionException, CommunicationsException (0) | 2024.04.25 |
DataIntegrityViolationException, SQLIntegrityConstraintViolationException (0) | 2024.04.25 |
NotWritablePropertyException, BeanCreationException (0) | 2024.04.25 |