복붙노트

[SPRING] 415 지원되지 않는 미디어 유형 (Spring 3.2 포함)

SPRING

415 지원되지 않는 미디어 유형 (Spring 3.2 포함)

jQuery 1.6 (Jackson 2.1.1 및 Spring 3.2.0)을 사용하여 JSON을 통해 PUT 메서드를 사용하여 데이터베이스에 데이터를 삽입 및 / 또는 업데이트하려고합니다.

JS 코드는 다음과 같습니다.

 var itemsArray=[];
 var id;

function insertOrUpdate()
{
    var i=0;

    $('input[name="txtCharge[]"]').each(function()
    {
        isNaN($(this).val())||$(this).val()==''?itemsArray[i][2]='':itemsArray[i][2]=$(this).val();
        i++;
    });                

    $.ajax({
        headers: { 
            'Accept': 'application/json',
            'Content-Type': 'application/json' 
        },
        datatype:"json",
        type: "PUT",
        url: "/wagafashion/ajax/InsertZoneCharge.htm",
        data: "items=" + JSON.stringify(itemsArray)+"&zoneId="+id+"&t="+new Date().getTime(),
        success: function(response)
        {
            alert(response);
        },
        error: function(e)
        {
            alert('Error: ' + e);
        }
    });
}

URL로 매핑되는 Spring Controller 내부의 메소드는 다음과 같습니다.

@RequestMapping(value=("ajax/InsertZoneCharge"), method=RequestMethod.PUT, produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String insertZoneCharge(@RequestBody final MultiValueMap<String, String > data, final HttpServletResponse response, HttpServletRequest request)
{
    String message="";
    try
    {
        Map<String, String> params = data.toSingleValueMap();
        if(params.get("zoneId")==null||params.get("zoneId").equals("")||params.get("items")==null||params.get("items").equals(""))
        {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        }
        else
        {
            message=zoneChargeService.insertZoneCharge(params.get("zoneId"), params.get("items"));
        }
    }
    catch (IOException ex)
    {
        message="An error occured. Data can not be saved.";
        Logger.getLogger(ZoneCharge.class.getName()).log(Level.SEVERE, null, ex);
    }

    return message;
}

서버는 질문이 암시 하듯이 응답합니다.

헤더 정보는 다음과 같습니다.

Request URL:http://localhost:8080/wagafashion/ajax/InsertZoneCharge.htm
Request Method:PUT
Status Code:415 Unsupported Media Type
Request Headersview source
Accept:application/json
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:352
Content-Type:application/json
Cookie:JSESSIONID=72AAFCC832C29D14FFA937D00D428A81
Host:localhost:8080
Origin:http://localhost:8080
Referer:http://localhost:8080/wagafashion/admin_side/ZoneCharge.htm
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17
X-Requested-With:XMLHttpRequest
Request Payload
items=[[1,10,"12.35"],[2,10.5,"16.00"],[3,11,"20.00"],[4,11.5,"30.00"],[5,12,"40.00"],[6,12.5,"50.00"],[7,13,"60.00"],[8,13.5,"70.00"],[9,14,""],[10,14.5,""],[11,15,""],[12,15.5,""],[13,16,""],[14,16.5,""],[15,17,""],[16,17.5,""],[17,18,""],[18,18.5,""],[19,19,""],[20,19.5,""],[24,20,""],[25,20.5,""],[26,21,""],[41,21.5,""]]&zoneId=45&t=1359485680332
Response Headersview source
Content-Length:1048
Content-Type:text/html;charset=utf-8
Date:Tue, 29 Jan 2013 18:54:40 GMT
Server:Apache-Coyote/1.1

전체 dispatcher-servlet.xml 파일은 다음과 같습니다.

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">


    <context:component-scan base-package="controller" />
    <context:component-scan base-package="validatorbeans" />

    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" >
        <mvc:message-converters register-defaults="false">
        <bean id="jacksonMessageConverter"
              p:supportedMediaTypes="application/json"
              class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
    </mvc:message-converters>
    </mvc:annotation-driven>

    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="favorPathExtension" value="false" />
        <property name="favorParameter" value="false" />
        <property name="ignoreAcceptHeader" value="false" />
        <property name="mediaTypes" >
            <value>
                atom=application/atom+xml
                html=text/html
                json=application/json
                *=*/*
            </value>
        </property>                    
    </bean>


    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="index.htm">indexController</prop>
            </props>
        </property>
    </bean>

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <bean name="indexController"
          class="org.springframework.web.servlet.mvc.ParameterizableViewController"
          p:viewName="index" />
</beans>

@RequestBody 최종 MultiValueMap 데이터, 메서드 매개 변수를 제거하고 단순히 @PathVariable을 사용하여 요청 매개 변수를 수락하면 작동합니다.

해결법

  1. ==============================

    1.브라우저가 전송하는 콘텐츠 유형, Content-Type : application / json이 @RequestBody final MultiValueMap 데이터와 일치하지 않는 것 같습니다.

    브라우저가 전송하는 콘텐츠 유형, Content-Type : application / json이 @RequestBody final MultiValueMap 데이터와 일치하지 않는 것 같습니다.

    어느 한 쪽:

  2. ==============================

    2.나는 같은 문제를 겪었다. 해결 방법은 @RequestBody를 제거한 다음 요청 (아파치 공유지에서 IOUtils를 사용하여)에서 데이터를 가져 오는 것이었다. 수신 된 데이터는 js 오류를 기록하는 데만 사용되었습니다.

    나는 같은 문제를 겪었다. 해결 방법은 @RequestBody를 제거한 다음 요청 (아파치 공유지에서 IOUtils를 사용하여)에서 데이터를 가져 오는 것이었다. 수신 된 데이터는 js 오류를 기록하는 데만 사용되었습니다.

    /**
     * this method logs with log4j the received js errors 
     */
    @RequestMapping(value = "/jsloggerservice/{applicationName}", method = RequestMethod.POST)
    public void jsLogger(HttpServletRequest request, HttpServletResponse response) {
        try {
            String message = IOUtils.toString( request.getInputStream());
            log.info("JAVASCRIPT-ERROR: " + message);
            response.getWriter().write("OK");
        } 
        catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
  3. ==============================

    3.서버 측에서는 Spring 3에서 다음과 같이해야한다.

    서버 측에서는 Spring 3에서 다음과 같이해야한다.

    <bean id = "mappingJacksonHttpMessageConverter" class = "org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
    
    <!-- starting Spring MVC annotation usage,handling request and annotation pojo mapping-->
    <bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
        <property name= "messageConverters" >
             <list>
                <ref bean= "mappingJacksonHttpMessageConverter"/>
             </list>
        </property>
    </bean>
    

    Spring 4는 mappingJackson2HttpMessageConverter를 사용합니다. AnnotationMethodHandlerAdapter 빈 선언이 없으면 @RequestBody를 사용할 수 있으며, 선언하면 mappingJackson2HttpMessageConverter를 messageConverters로 설정할 수 있습니다. 이것은 내가 관찰 한 현상에 의해 결론 지어진다.

  4. ==============================

    4.내 생각에 귀하의 브라우저는 귀하의 반품을지지하지 않습니다. HTTP 415에 대한 설명은이를 나타냅니다. 응답에서 Content-Type으로 보내는 서버는 무엇입니까?

    내 생각에 귀하의 브라우저는 귀하의 반품을지지하지 않습니다. HTTP 415에 대한 설명은이를 나타냅니다. 응답에서 Content-Type으로 보내는 서버는 무엇입니까?

  5. ==============================

    5.누군가가 이것을 만난 경우를 대비해서 : 저는 두 가지 방법을 가졌습니다.

    누군가가 이것을 만난 경우를 대비해서 : 저는 두 가지 방법을 가졌습니다.

    void setLevel (레벨 레벨) void setLevel (캐릭터 라인 레벨)

    @RequestBody로 주석이 달린 클래스에서 415가 발생했습니다.

  6. from https://stackoverflow.com/questions/14590640/415-unsupported-media-type-with-spring-3-2 by cc-by-sa and MIT license