JSON 오류 문의
- 작성자 :
- 문*
- 작성일 :
- 2019-06-21 17:58:38
- 조회수 :
- 4,941
- 구분 :
- 개발환경
- 진행상태 :
- 완료
Q
안녕하세요. 전자정부 3.7을 사용하다 3.8로 올려서 프로젝트를 개발 중입니다. API 구축을 위해 JSON 형태의 데이터를 반환받으려고 @RestController를 사용한 컨트롤러를 하나 만들어둔 상태인데요. 그 안에서 List<?> 형태로 반환받는 데이터를 ResponseEntity에 담아서 return 시키니 아래와 같이 오류가 나고 있습니다.
@RequestMapping(value="/boardlist.do")
public ResponseEntity<Map<String, List<?>>> getBoardList() throws Exception{
Map<String, List<?>> resultMap = new HashMap<>();
List<?> boardList = boardSvc.getBoardList();
resultMap.put("성공", boardList);
return new ResponseEntity<>(resultMap, HttpStatus.OK);
}
@RequestMapping(value="/boardlist2.do")
public String getBoardList2() throws Exception{
return "테스트";
}
java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.HashMap
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:187) ~[spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:208) ~[spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
...
(생략)
첫번째 메소드는 위와 같이 오류가 나고 두번째 메소드를 실행하면 오류는 안나지만 "테스트"라는 한글이 ???로 깨져 나옵니다.
egov-com-servlet.xml에는 아래와 같이 JsonView를 수정해주었습니다.
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="contentType" value="text/html;charset=UTF-8"/>
</bean>
pom.xml에 있는 JSON 관련 디펜던시는 아래와 같습니다.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
List나 Map 등의 형태가 JSON으로 변환되지 않고 오류가 나는 원인과 한글이 깨지는 원인을 알 수 있을까 싶어 문의드립니다. (이미 구글을 통해 검색을 해봤지만 다들 디펜던시를 추가하거나 servlet.xml 쪽에 <mvc:annotation-driven/> 를 추가하라는 답변이 대부분이고 해결이 되지 않았습니다.)
+ 같은 방식의 메소드를 스프링 부트(전자정부 사용 X)로 제작한 다른 프로젝트에서 돌려보았을 땐 List가 JSON 형태로 잘 return되어 브라우져 상에서 확인할 수 있었습니다.
@RequestMapping(value="/boardlist.do")
public ResponseEntity<Map<String, List<?>>> getBoardList() throws Exception{
Map<String, List<?>> resultMap = new HashMap<>();
List<?> boardList = boardSvc.getBoardList();
resultMap.put("성공", boardList);
return new ResponseEntity<>(resultMap, HttpStatus.OK);
}
@RequestMapping(value="/boardlist2.do")
public String getBoardList2() throws Exception{
return "테스트";
}
java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.HashMap
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:187) ~[spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:208) ~[spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
...
(생략)
첫번째 메소드는 위와 같이 오류가 나고 두번째 메소드를 실행하면 오류는 안나지만 "테스트"라는 한글이 ???로 깨져 나옵니다.
egov-com-servlet.xml에는 아래와 같이 JsonView를 수정해주었습니다.
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="contentType" value="text/html;charset=UTF-8"/>
</bean>
pom.xml에 있는 JSON 관련 디펜던시는 아래와 같습니다.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
List나 Map 등의 형태가 JSON으로 변환되지 않고 오류가 나는 원인과 한글이 깨지는 원인을 알 수 있을까 싶어 문의드립니다. (이미 구글을 통해 검색을 해봤지만 다들 디펜던시를 추가하거나 servlet.xml 쪽에 <mvc:annotation-driven/> 를 추가하라는 답변이 대부분이고 해결이 되지 않았습니다.)
+ 같은 방식의 메소드를 스프링 부트(전자정부 사용 X)로 제작한 다른 프로젝트에서 돌려보았을 땐 List가 JSON 형태로 잘 return되어 브라우져 상에서 확인할 수 있었습니다.
A
안녕하세요.
표준프레임워크센터 입니다.
공통컴포넌트처럼 여러개의 ViewResolver를 사용하는경우
return시에 ViewResolver를 지정해 주셔야 합니다.
다음과 같은 유형으로 코드를 작성 하셔야 합니다.
@RequestMapping(value="/boardlist3.do")
public ModelAndView getBoardList3() throws Exception{
ModelAndView jsonView = new ModelAndView("jsonView");
jsonView.addObject("resultState", "OK");
jsonView.addObject("resultDATA", "오케이");
return jsonView;
}
뷰리졸버 선언은 다음을 확인하셔야 합니다.
src/main/webapp/WEB -INF/config/egovframework/springmvc/egov-com-servlet.xml
DeviceAPI 실행환경의 웹 소스를 참고하실수도 있습니다.
http://www.egovframe.go.kr/EgovHybRunEnvRelease.jsp?menu=3&submenu=7&leftsub=1#
감사합니다.
표준프레임워크센터 입니다.
공통컴포넌트처럼 여러개의 ViewResolver를 사용하는경우
return시에 ViewResolver를 지정해 주셔야 합니다.
다음과 같은 유형으로 코드를 작성 하셔야 합니다.
@RequestMapping(value="/boardlist3.do")
public ModelAndView getBoardList3() throws Exception{
ModelAndView jsonView = new ModelAndView("jsonView");
jsonView.addObject("resultState", "OK");
jsonView.addObject("resultDATA", "오케이");
return jsonView;
}
뷰리졸버 선언은 다음을 확인하셔야 합니다.
src/main/webapp/WEB -INF/config/egovframework/springmvc/egov-com-servlet.xml
DeviceAPI 실행환경의 웹 소스를 참고하실수도 있습니다.
http://www.egovframe.go.kr/EgovHybRunEnvRelease.jsp?menu=3&submenu=7&leftsub=1#
감사합니다.