본문 바로가기
개발노트

[restAPI] @restcontroller API converter 오류

by SoonNote 2024. 7. 5.
반응형

 

@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

반응형