반응형
@RestController 어노테이션을 사용해서 API를 만들려고했으나 오류가 발생해서
egov-comservelt.xml에
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" id="jsonView">
<property name="contentType" value="text/html;charset=UTF-8"/>
</bean>
를 추가해서
package com.test.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import cms.cmm.controller.BaseController;
import cms.cmm.util.StringUtil;
import cms.cmm.util.WebUtil;
import egovframework.rte.psl.dataaccess.util.EgovMap;
@Controller
@RequestMapping("/api")
public class testAPIController extends BaseController {
@Resource(name = "testService")
private testService testService;
@CrossOrigin(origins = "*") //CORS 설정 모든 client 요청 허용
@RequestMapping(value="/test/testList", method = RequestMethod.GET)
public String ajaxHistGet(ModelMap model
, HttpServletRequest request
, HttpServletResponse response)throws Exception{
HashMap<String, Object> param = WebUtil.getRequestToHashMap( request );
// 전체 레코드 수
int listCount = testService.getListCount(param);
SetPager(model, param, listCount);
//목록
List<HashMap<String, Object>> bizList = testService.getList(param);
model.addAttribute("list", list );
return "jsonView";
}
}
model에 담은 list를 json으로 변경해주는 방식으로 진행했었다.
오류를 잡고있을 시간이 없어서 급한데로 기존에 사용하던 방식을 가져와 사용했었지만 프로젝트가 마무리되고 @RestController로 변경하는 작업을위해 오류를 찾아보았다.
@controller를 @RestController로 변경해주고 return도 변경해주었다
package com.test.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import cms.cmm.controller.BaseController;
import cms.cmm.util.StringUtil;
import cms.cmm.util.WebUtil;
import egovframework.rte.psl.dataaccess.util.EgovMap;
@RestController
@RequestMapping("/api")
public class testAPIController extends BaseController {
@Resource(name = "testService")
private testService testService;
@CrossOrigin(origins = "*") //CORS 설정 모든 client 요청 허용
@RequestMapping(value="/test/testList", method = RequestMethod.GET)
public String ajaxHistGet(ModelMap model
, HttpServletRequest request
, HttpServletResponse response)throws Exception{
HashMap<String, Object> param = WebUtil.getRequestToHashMap( request );
// 전체 레코드 수
int listCount = testService.getListCount(param);
SetPager(model, param, listCount);
//목록
List<HashMap<String, Object>> list = testService.getList(param);
return list;
}
}
실행했을때 아무런 에러로그도 찍히지 않고 바로 에러페이지가 나오는 상황이어서
log4j2.xml을 수정해주었다
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[log4j]%d %5p [%c] %m%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="java.sql" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="egovframework" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="jdbc.sqltiming" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="org.springframework" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="org.springframework.web" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="org.springframework.web.servlet" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Root level="DEBUG">
<AppenderRef ref="console" />
</Root>
</Loggers>
</Configuration>
추가한 부분은
<Logger name="org.springframework.web.servlet" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
이쪽이고 에러 로그를 확인 한 결과
REST API가 JSON 형식으로 데이터를 반환해야 하는데, Spring MVC가 ArrayList를 JSON으로 변환하지 못했기 때문이라는걸 알게되었다
1. pom.xml 추가
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.10</version>
</dependency>
2. egov-com-servlet.xml 추가
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageConverter"/>
</list>
</property>
</bean>
<!-- Message converters for JSON -->
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper"/>
</property>
</bean>
3. 실행결과
요약
1. 문제 발생: ArrayList를 반환할 때 메시지 컨버터 오류 발생.
2, 원인 분석: JSON 변환을 위한 메시지 컨버터가 설정되지 않음.
3. 해결 방법:
- MappingJackson2HttpMessageConverter 설정 추가.
- 컨트롤러에서 @RestController 애노테이션 사용.
4. 결과: ArrayList를 JSON으로 변환하여 클라이언트에게 올바르게 응답할 수 있게 됨.
*실행환경
전자정부 프레임워크 3.9
jdk 1.8
반응형
'개발노트' 카테고리의 다른 글
[javascript] DateRangePicker 달력 라이브러리 (0) | 2024.09.27 |
---|---|
[Github Pages] 깃허브 페이지(github.io) 만들기 (0) | 2024.06.25 |
[ubuntu] Apache Rewrite 설정하기 (1) | 2024.05.24 |
[apache2] 아파치 Mod_jk 설정 (0) | 2024.05.24 |
[mysql ] Ibatis procedure OUT 파라미터 받기 (0) | 2024.04.26 |