본문 바로가기
프로그래밍 언어/java + jsp + jstl

[Java] ajax로 java(Spring) 연동시 다음과 같은 에러 발생 해결방법 - Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

by 우림 2018. 4. 27.

Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

이런 오류가 나네요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:158) ~[spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:167) ~[spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:102) ~[spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:78) ~[spring-web-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) [spring-web-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) [spring-web-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) [spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:775) [spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) [spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) [spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965) [spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:867) [spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) [servlet-api.jar:na]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:841) [spring-webmvc-4.1.9.RELEASE.jar:4.1.9.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) [servlet-api.jar:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [catalina.jar:7.0.67]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.67]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat7-websocket.jar:7.0.67]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.67]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.67]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) [catalina.jar:7.0.67]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) [catalina.jar:7.0.67]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) [catalina.jar:7.0.67]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) [catalina.jar:7.0.67]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) [catalina.jar:7.0.67]
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) [catalina.jar:7.0.67]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [catalina.jar:7.0.67]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) [catalina.jar:7.0.67]
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) [tomcat-coyote.jar:7.0.67]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) [tomcat-coyote.jar:7.0.67]
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) [tomcat-coyote.jar:7.0.67]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-coyote.jar:7.0.67]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]
cs


* jsp에서 ajax로 호출하는 자바스크립트(jquery)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$.ajax({
    type       : type,
    async      : async,
    data : JSON.stringify(data),
    dataType   : 'json',
    url        : url,
    error      : function(json){
        alert('저장중 오류가 발생하였습니다');
    },
    success    : function(data){
        if(data.resultFg == "SS" ) {
            alert('저장 하였습니다.');
            window.parent.opener.searchMain();
            self.close();                    
        } else if (data.resultFg == "DU" ){
            alert('메인코드명이 중복 되었습니다.');
            return;
        } else {
            alert('저장중 오류가 발생 하였습니다.');
            return;
        }
 
    }
});
cs


java에서는 다음과 같이 구현돼 있습니다.

스프링 프레임워크 사용중입니다.


1
2
3
4
5
6
7
8
9
@Transactional
@RequestMapping("/saveCode.json")
public @ResponseBody  Map<String , Object> saveCode(@RequestBody Map<StringObject> param, HttpServletRequest request) {
    
    Map<StringObject> jsonObject = new HashMap<StringObject>();
    param.put("userId", (String) request.getSession().getAttribute("sessionUserId"));
    String code = (String) param.get("code");
    String upCode = (String) param.get("upCode");
}
cs


뭐가 문제인지 몰라서 한참을 구글링 했네요.

뭔가 인코딩의 문제라는 생각은 드는데 한참이나 java 부분이 문제인지 알고 찾았는데

해결방법은 생각보다 간단하네요^^


1
contentType: 'application/json',
cs

ajax 호출시 요거 한줄 넣어주니 되네요.

아래처럼요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$.ajax({
    type       : type,
    async      : async,
    contentType: 'application/json',
    data : JSON.stringify(data),
    dataType   : 'json',
    url        : url,
    error      : function(json){
        alert('저장중 오류가 발생하였습니다');
    },
    success    : function(data){
        if(data.resultFg == "SS" ) {
            alert('저장 하였습니다.');
            window.parent.opener.searchMain();
            self.close();                    
        } else if (data.resultFg == "DU" ){
            alert('메인코드명이 중복 되었습니다.');
            return;
        } else {
            alert('저장중 오류가 발생 하였습니다.');
            return;
        }
    }
});
cs


ajax에서 파라미터를 json으로 넘기고

받을 때 Vo가 아닌 Map으로 받을 땐 이걸 꼭 넣어줘야 하나 봅니다.


1
@RequestBody Map<StringObject> param
cs

java에서 이렇게 받으면 json으로 넘어온 값들을 자동으로 매핑됩니다.

즉, 아래와 같은 json 값을 ajax에서 넘겨줬다고 가정해 봅시다.

1
{"codeNm":"하늘색","code":"BLUE","codeDiv":"COLOR"}
cs


그럼, 자바에서 아래와 같이 값을 확인할 수가 있답니다^^

1
String code = (String)param.get("code");
cs


댓글