< 에러 메시지 >
SEVERE: 경로 [/13]의 컨텍스트 내의 서블릿 [pf]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 3]을(를) 발생시켰습니다.
org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 3
IncorrectResultSizeDataAccessException
Spring 프레임워크 예외
데이터 베이스에서 쿼리를 실행할 때 유일한 결과를 반환해야하는데 여러개의 결과를 반환된 경우 발생
< 원인 >
첨부파일을 단일이아닌 복수첨부로 변경하였지만 읽어오는 페이지에서 단일 값만 읽어오기에 기대값은 1인데 실제는 3개의 값이 있어서 에러 발생
//단일 업로드 가져오기
public BoardAttachDto getAttachInfo(int boardSeq, int boardTypeSeq) {
String sql = "SELECT * FROM board_attach ba "
+ "WHERE ba.board_seq = ? "
+ "AND ba.board_type_seq = ? ";
Object[] args = {boardSeq, boardTypeSeq};
return queryForObject(sql, new BoardAttachRowMapper(), args);
}
class BoardAttachRowMapper implements RowMapper<BoardAttachDto>{//하나RowMapper
@Override
public BoardAttachDto mapRow(ResultSet rs, int rowNum) throws SQLException{
BoardAttachDto dto = new BoardAttachDto();
dto.setAttachSeq(rs.getInt("attach_seq"));
dto.setBoardSeq(rs.getInt("board_seq"));
dto.setBoardTypeSeq(rs.getInt("board_type_seq"));
dto.setOrgFileNm(rs.getString("org_file_nm"));
dto.setSavePath(rs.getString("save_path"));
dto.setChngFileNm(rs.getString("chng_file_nm"));
dto.setFileSize(rs.getInt("file_size"));
dto.setFileType(rs.getString("file_type"));
dto.setAccessUri(rs.getString("access_uri"));
dto.setRegDtm(rs.getString("reg_dtm"));
return dto;
}
}
< 해결 >
//다중 업로드파일 가져오기
public List<BoardAttachDto> getAttachInfo(int boardSeq, int boardTypeSeq) {
String sql = "SELECT * FROM board_attach ba "
+ "WHERE ba.board_seq = ? "
+ "AND ba.board_type_seq = ? ";
Object[] args = {boardSeq, boardTypeSeq};
return query(sql, new BoardAttachListMapper(), args);
}
class BoardAttachListMapper implements ResultSetExtractor<List<BoardAttachDto>>{//하나RowMapper
@Override
public List<BoardAttachDto> extractData(ResultSet rs) throws SQLException, DataAccessException {
ArrayList<BoardAttachDto> list = new ArrayList<>();
BoardAttachDto dto = null;
while(rs.next()) {
dto = new BoardAttachDto();
dto.setAttachSeq(rs.getInt("attach_seq"));
dto.setBoardSeq(rs.getInt("board_seq"));
dto.setBoardTypeSeq(rs.getInt("board_type_seq"));
dto.setOrgFileNm(rs.getString("org_file_nm"));
dto.setSavePath(rs.getString("save_path"));
dto.setChngFileNm(rs.getString("chng_file_nm"));
dto.setFileSize(rs.getInt("file_size"));
dto.setFileType(rs.getString("file_type"));
dto.setAccessUri(rs.getString("access_uri"));
dto.setRegDtm(rs.getString("reg_dtm"));
list.add(dto);
}
return list;
}
}
BoardAttachDao의 getAttachInfo의 반환값인 queryForObject는 단일 결과만 가져옴으로 quey로 변경해야합니다
또한 Mapper도 List로 변경하여 해결
'에러 모음' 카테고리의 다른 글
NullPointerException (0) | 2024.05.17 |
---|---|
IllegalArgumentException (0) | 2024.05.17 |
PropertyNotFoundException (0) | 2024.05.11 |
UnsatisfiedDependencyException, BeanCreationException, IllegalArgumentException (0) | 2024.05.10 |
CannotLoadBeanClassException (0) | 2024.05.09 |