PostgreSQL을 이용해서 특정 컬럼을 json 배열로 조회하도록 했는데, VO에 List<testVo> 로 만들어도 자동으로 매핑이 되지 않았다.
select문을 직접 DB에서 날렸을 땐 조회가 잘 되는데도 말이다.
찾아보니 my-batis에서 해당하는 컬럼에 핸들러를 이용해 매핑을 해주어야 한다네..
그래서 핸들러를 직접 만들어 사용하기로 했다. 핸들러에서 ObjectMapper를 이용해 매핑해주게끔 하였다.
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.json.JSONArray;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonArrayTypeHandler extends BaseTypeHandler<List<T>> {
Logger logger = LoggerFactory.getLogger(this.getClass());
ObjectMapper objectMapper = new ObjectMapper();
private List<T> convertToList(String s) {
if (s == null || "".equals(s)) {
return Collections.emptyList();
}
try {
List<T> list = objectMapper.readValue(s, new TypeReference<>(){});
return list;
} catch (IOException e) {
logger.error("[ExampleJsonTypeHandler] failed to convert string to list");
}
return Collections.emptyList();
}
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<T> ts, JdbcType jdbcType) throws
SQLException {
JSONArray jsonArray = JSONArray.fromObject(ts);
preparedStatement.setString(i, jsonArray.toString());
}
@Override
public List<T> getNullableResult(ResultSet resultSet, String s) throws SQLException {
return convertToList(resultSet.getString(s));
}
@Override
public List<T> getNullableResult(ResultSet resultSet, int i) throws SQLException {
return convertToList(resultSet.getString(i));
}
@Override
public List<T> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return convertToList(callableStatement.getString(i));
}
}
그리고 해당 핸들러를 xml에서 resultMap을 만들어 사용을 명시해주면 된다.
<resultMap id="맵 이름" type="VO명">
...
<result property="이름" column="컬럼명" typeHandler="com.prac.test.api.other.handler.JsonArrayTypeHandler" />
...
</resultMap>
'개발공부 > Spring' 카테고리의 다른 글
[Spring] 스프링 레거시 프로젝트에서 Message 사용하기 (0) | 2023.12.10 |
---|
댓글