복붙노트

[SPRING] HTTP 상태 406. Spring MVC 4.0, jQuery, JSON

SPRING

HTTP 상태 406. Spring MVC 4.0, jQuery, JSON

내 컨트롤러에서 JSON을 보내려고합니다. 나는 다음과 같은 구성을 가지고있다.

spring-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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven/>

    <mvc:resources mapping="/resources/**" location="/resources/"/>
    <context:component-scan base-package="com.castle.controllers"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

.js :

function testAjax() {
    var data = {userName: "MyUsername", password:"Password"};
    $.ajax({
        url: 'ajax/test.htm',
        dataType : 'json',
        type : 'POST',
        contentType: "application/json",
        data: JSON.stringify(data),
        success: function(response){
            alert('Load was performed.');
        }
    });
}

UserTest.java:

public class UserTest {
    private String userName;
    private String password;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

TestAjaxController.java :

@Controller
@RequestMapping("/ajax")
public class TestAjaxController {

    @RequestMapping(method = RequestMethod.POST, value = "/test.htm")
    public @ResponseBody
    UserTest testAjaxRequest(@RequestBody UserTest user) {
        return user;
    }
}

Pom.hml :

    <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-asl</artifactId>
                <version>1.9.13</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-core-asl</artifactId>
                <version>1.9.13</version>
</dependency>

이 요청을 할 때, 나는 UserTest 객체로 표현 된 내 Controller JSON에 들어간다. 그러나 돌아 오는 중 :

HTTP 상태 406 -이 요청으로 식별 된 자원은 요청 "수락"헤더에 따라 수용 할 수없는 특성을 갖는 응답 만 생성 할 수 있습니다.

내가 뭘 잘못하고있어? 그런 경우에 대해 많은 질문이 있지만 2 일 동안 고칠 수는 없습니다 ...

최신 정보 솔루션을 찾았습니다 !! 그것은 단지 객체를 반환 할 필요가 있습니다. 사용자 객체가 아닙니다. 그러나 return Object;

 public @ResponseBody Object testAjaxRequest(@RequestBody UserTest user) {
        List<UserTest> list = new ArrayList<>();
        list.add(user);
        list.add(user);
        list.add(user);
        return list;

해결법

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

    1.여기서 중요한 문제는 "/test.htm"경로가 Accept 헤더 값을 확인하기 전에 먼저 내용 협상을 사용한다는 것입니다. * .htm과 같은 확장을 사용하면 Spring은 org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy를 사용하고 반환 할 수있는 미디어 유형이 MappingJacksonHttpMessageConverter가 생성하는 텍스트 / HTML과 일치하지 않는다는 것을 해결합니다. application / json이므로 406이 반환됩니다.

    여기서 중요한 문제는 "/test.htm"경로가 Accept 헤더 값을 확인하기 전에 먼저 내용 협상을 사용한다는 것입니다. * .htm과 같은 확장을 사용하면 Spring은 org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy를 사용하고 반환 할 수있는 미디어 유형이 MappingJacksonHttpMessageConverter가 생성하는 텍스트 / HTML과 일치하지 않는다는 것을 해결합니다. application / json이므로 406이 반환됩니다.

    간단한 해결책은 / test와 같은 경로를 경로로 변경하여 경로를 기반으로하는 콘텐츠 협상이 응답의 콘텐츠 유형을 해결하지 못하도록하는 것입니다. 대신 헤더를 기반으로하는 다른 ContentNegotiationStrategy가 Accept 헤더 값을 해석합니다.

    복잡한 해결책은 @ResponseBody를 처리하는 RequestResponseBodyMethodProcessor로 등록 된 ContentNegotiationStrategy 객체의 순서를 변경하는 것입니다.

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

    2.나는 결국 같은 문제가있었습니다. org.codehaus.jackson 1.9.x의 버전이었습니다. 내 pom.xml에서 1.9.x jackson을 2.x (fasterxml)로 바꿨을 때

    나는 결국 같은 문제가있었습니다. org.codehaus.jackson 1.9.x의 버전이었습니다. 내 pom.xml에서 1.9.x jackson을 2.x (fasterxml)로 바꿨을 때

    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.2.3</version>
    </dependency>
    
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.2.3</version>
    </dependency>
    
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.2.3</version>
    
    </dependency>
    

    또한 필요하다 :

  3. ==============================

    3.레거시 프로젝트에서 Spring을 업그레이드 할 때이 문제가 발생했습니다. JSON을 반환하려고했던 AJAX 종점의 .html 접미사는 실제로 접미사로 인해 HTML을 생성하려고 시도했으며 핸들러가 객체를 반환 했으므로 Spring에서 406 오류가 발생하여 요청이 종료되었습니다. 일반 자바 객체에서 HTML을 만드는 법을 이해해야한다.

    레거시 프로젝트에서 Spring을 업그레이드 할 때이 문제가 발생했습니다. JSON을 반환하려고했던 AJAX 종점의 .html 접미사는 실제로 접미사로 인해 HTML을 생성하려고 시도했으며 핸들러가 객체를 반환 했으므로 Spring에서 406 오류가 발생하여 요청이 종료되었습니다. 일반 자바 객체에서 HTML을 만드는 법을 이해해야한다.

    끝점 접미사를 변경하거나 사용자 정의 ContentNegotiationStrategy의 전체 구성을 수행하는 대신이 변경으로 충분했습니다.

    <mvc:annotation-driven />
    

    로 변경:

    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="favorPathExtension" value="false" />
    </bean>
    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
    
  4. ==============================

    4.컨텍스트 구성에이 줄을 추가하면 같은 문제가 해결되었습니다.

    컨텍스트 구성에이 줄을 추가하면 같은 문제가 해결되었습니다.

        <mvc:annotation-driven>
          <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
          </mvc:message-converters>
        </mvc:annotation-driven>
    

    나는 Spring 4.1.x와 Jackson 2.4.2를 사용했다.

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

    5.어노테이션에서 produce = "application / json"을 사용해야합니다.

    어노테이션에서 produce = "application / json"을 사용해야합니다.

  6. from https://stackoverflow.com/questions/21235472/http-status-406-spring-mvc-4-0-jquery-json by cc-by-sa and MIT license