복붙노트

[SPRING] Spring 3.x JSON 상태 406 "요청에 따라 수용 할 수없는 특성"accept "headers ()"

SPRING

Spring 3.x JSON 상태 406 "요청에 따라 수용 할 수없는 특성"accept "headers ()"

JSON에서 Spring 3.x를 사용하여 내 응답을 얻으려고하면 "이 요청으로 식별 된 리소스는 요청에 따라 수용 할 수없는 특성을 갖는 응답 만 생성 할 수 있습니다."라는 헤더 오류 (406)를받습니다.

여기 내 환경이있다.

* Spring 3.2.0.RELEASE
* included jackson-mapper-asl-1.7.9.jar, jackson-core-asl-1.7.9.jar
* Tomcat 6.x
* mvc:annotation-driven in Spring configuration XML file

내 컨트롤러 :

@RequestMapping("/contest")
public class ContestController {

    @RequestMapping(value="{name}", headers="Accept=*/*", method = RequestMethod.GET)
    public @ResponseBody Contest getContestInJSON(@PathVariable String name) {
        Contest contest = new Contest();
        contest.setName(name);
        contest.setStaffName(new String("contestitem1"));

        return contest;
    }

}

내 스프링 구성 파일

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<context:component-scan base-package="com.contestframework.controllers" />

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

<property name="mediaTypes">
    <map>
      <entry key="atom" value="application/atom+xml"/>
      <entry key="html" value="text/html"/>
      <entry key="json" value="application/json"/>
    </map>
 </property>

 <property name="viewResolvers">
 <list>
  <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
  </bean>
 </list>
 </property>

 <property name="defaultViews">
  <list>
   <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
  </list>
 </property>

 </bean>

<mvc:annotation-driven />

</beans>

이 후 나는 아래를 사용하여 Controller에 접근한다.

http://domain/SpringWebProject/json/contest/abcd

내가 얻는 응답은 Status 406입니다. "이 요청으로 식별 된 리소스는 요청"accept "헤더 ()에 따라 수용 할 수없는 특성을 가진 응답 만 생성 할 수 있습니다."

또한 Javascript AJAX를 사용하여 요청 헤더에 application / JSON이 있는지 확인하기 위해 대체 메커니즘을 시도했지만 동일한 Status 406 결과가 나타났습니다.

$.getJSON('contest/abcd', function(data) {
console.log(data) }

다음은 브라우저에서 요청한 요청 헤더입니다.

Request URL:http://localhost:8080/SpringWebProject/json/contest/abcd
Request Method:GET
Status Code:406 Not Acceptable

Accept:application/json, text/javascript, */*; q=0.01
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
Cookie:JSESSIONID=59689C95B0B9C21494EB0AB9D9F7BCCD
Host:localhost:8080
Referer:http://localhost:8080/SpringWebProject/json/welcome
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
X-Requested-With:XMLHttpRequest
Response Headersview source
Content-Length:1070
Content-Type:text/html;charset=utf-8
Date:Fri, 12 Oct 2012 18:23:40 GMT
Server:Apache-Coyote/1.1

이와 관련하여 도움을 주시면 감사하겠습니다.

해결법

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

    1.구성에 아무런 문제가 없지만 몇 가지 작은 변경을 제안합니다.

    구성에 아무런 문제가 없지만 몇 가지 작은 변경을 제안합니다.

    a) 네 네임 스페이스가 잘못 표시됩니다. 즉, 3.0 스키마를 참조하고 있습니다. 버전을 3.1로 변경하거나 예를 들어 버전을 명시 적으로 참조하지 마십시오.

    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
    

    또는

    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    

    b) 당신은 ContentNegotiatingViewResolver를 필요로하지 않는다. 설정에서 구성 요소 검사와 를 제외한 모든 것을 제거 할 수있다.

    c) "application / json"의 Accept 헤더가 명시 적으로 필요하므로 요청이 브라우저에서 직접 작동하지 않습니다. - $ .getJson 호출은 올바른 헤더를 전송하지만 작동해야합니다.

    d) @RequestMapping에서 headers = Acc ..를 제거하고, 생성 된 둘 다 올바른 매핑 된 메소드 호출을 일치시키는 필터링 기준입니다.

    이것들로, json이 밖으로 나오지 않아야하는 이유가 없습니다, 이것들을 시도해보고 그것들이 어떻게되는지 보시기 바랍니다.

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

    2.나는 또한 똑같은 문제를 경험했다. 내가 3.2.2.RELEASE를 가지고 있었던 것처럼 그것이 최근의 3.2.0.RELEASE의 문제인 것처럼 보일 것입니다. 그리고 그것은 모두 작동했습니다. 3.2.0.RELEASE로 변경하면 중단됩니다. 3.1.3.RELEASE로 테스트 한 결과 제대로 작동합니다. 그래서 지금은 3.1.3.RELEASE로 롤백 할 것을 제안합니다.

    나는 또한 똑같은 문제를 경험했다. 내가 3.2.2.RELEASE를 가지고 있었던 것처럼 그것이 최근의 3.2.0.RELEASE의 문제인 것처럼 보일 것입니다. 그리고 그것은 모두 작동했습니다. 3.2.0.RELEASE로 변경하면 중단됩니다. 3.1.3.RELEASE로 테스트 한 결과 제대로 작동합니다. 그래서 지금은 3.1.3.RELEASE로 롤백 할 것을 제안합니다.

    편집 : 다음 위치에 링크 된이 사이트의 다른 게시물 덕분에 : http://static.springsource.org/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc- config-content-negotiation

    이제는 요청 된 경로의 확장을 기반으로 미디어 유형을 가져 오지 못하게하여 작동시키고 있습니다. 이 작업은 다음과 같이 수행 할 수 있습니다.

    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <!-- Turn off working out content type based on URL file extension, should fall back to looking at the Accept headers -->
        <property name="favorPathExtension" value="false" />
    </bean>
    

    그리고 모든 xsd 스키마 위치에 대해 버전 3.2를 지정하십시오.

    그리고 이것은 다음의 잭슨 병을 사용하고 있습니다 :

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.1.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.1.2</version>
    </dependency>
    
  3. ==============================

    3.나는 같은 문제가있어서 다음 의존성을 추가하여 해결했다.

    나는 같은 문제가있어서 다음 의존성을 추가하여 해결했다.

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    

    이전에는 다음 종속성으로 수행하고 있습니다.

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${com.jackson.core-version}</version>
    </dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${com.jackson.core-version}</version>
    </dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${com.jackson.core-version}</version>
    </dependency>
    

    간단히 말해서 com.fasterxml.jackson.core를 org.codehaus.jackson으로 대체했습니다.

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

    4.나는 Spring MVC 4에서이 문제를 겪었다. jackson-annotations, jackson-core 및 jackson-databind를 추가해도 문제가 해결되지 않았다. 이 libs 시도 :

    나는 Spring MVC 4에서이 문제를 겪었다. jackson-annotations, jackson-core 및 jackson-databind를 추가해도 문제가 해결되지 않았다. 이 libs 시도 :

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.1.2</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.1.2</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
    </dependency>
    
  5. ==============================

    5.나는 당신이 @RequestMapping에 produce = "application / json"을 추가 할 필요가 있다고 생각한다. (잠시 동안 mvc를 보지 않았다. 그래서 나는 100 % 긍정적이다.) ...

    나는 당신이 @RequestMapping에 produce = "application / json"을 추가 할 필요가 있다고 생각한다. (잠시 동안 mvc를 보지 않았다. 그래서 나는 100 % 긍정적이다.) ...

    http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html

    @Controller
    @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
    @ResponseBody
    public Pet getPet(@PathVariable String petId, Model model) {    
        // implementation omitted
    }
    
  6. ==============================

    6.나는이 문제에서 Biju Kunjummen이 덧붙인 대답이 나를 위해 완벽하게 작용했다.

    나는이 문제에서 Biju Kunjummen이 덧붙인 대답이 나를 위해 완벽하게 작용했다.

    https://stackoverflow.com/a/12873170/20654

    그것은 Java 클래스에 public getters를 가지고 있습니다.

  7. ==============================

    7.비슷한 문제가 있었는데 jackson-databind 라이브러리를 추가 할 때 문제가 해결되었습니다.

    비슷한 문제가 있었는데 jackson-databind 라이브러리를 추가 할 때 문제가 해결되었습니다.

    내 의존성은 다음과 같습니다.

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.12</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.4.3</version>
    </dependency>
    
  8. ==============================

    8.경험을 공유해 주셔서 감사합니다. 같은 문제가 발생했으며 아래의 구성을 사용하여 저에게 효과적입니다.

    경험을 공유해 주셔서 감사합니다. 같은 문제가 발생했으며 아래의 구성을 사용하여 저에게 효과적입니다.

    스프링 MVC 설정 파일 :

    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <!-- Turn off working out content type based on URL file extension, should fall back to looking at the Accept headers -->
        <property name="favorPathExtension" value="false" />
    </bean>
    

    모델 클래스 : Country.java

     private Integer countryId;
     private String name;
     //public setters and getters
    

    제어기 방법 :

    @RequestMapping(value = "/get_country_json",method = RequestMethod.GET)
    @ResponseBody
    public Country getCountry()
    

    배포 설명자 (web.xml)

     <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>       
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    

    요청한 컨트롤러 메서드 호출 : /SpringCURDApp/get_country_json.htm

    나는 이것이 누군가를 도울 수 있기를 바랍니다.

  9. ==============================

    9.내가했던 것과 같은 실수를 저 지르지 말고, 스프링 구성으로 하루 종일 놀아 라. 실제로 웹 서비스에 반환 된 객체가 XML로 올바르게 마샬링되지 않을 때. Spring은 JAXB 마샬링 오류를 catch하고보고하지 않습니다. 이 샌드 박스 코드를 사용하여 JAXB 마샬링의 유효성을 검사합니다.

    내가했던 것과 같은 실수를 저 지르지 말고, 스프링 구성으로 하루 종일 놀아 라. 실제로 웹 서비스에 반환 된 객체가 XML로 올바르게 마샬링되지 않을 때. Spring은 JAXB 마샬링 오류를 catch하고보고하지 않습니다. 이 샌드 박스 코드를 사용하여 JAXB 마샬링의 유효성을 검사합니다.

    MyClass myclass = new MyClass();
    //populate myclass here
    
    JAXBContext context = JAXBContext.newInstance(MyClass.class);
    
    Marshaller m = context.createMarshaller();
    StringWriter w = new StringWriter();
    
    m.marshal(myclass, w);
    System.out.println(w);
    

    이로 인해 예외가 생성되어 표시되었습니다. 원인을 수정했으며 웹 서비스는 XML과 JSON에서 모두 사용할 수 있습니다.

  10. ==============================

    10.곧:

    곧:

    Spring MVC 4.1.6에서는 다음과 같이 충분하다.

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

    jackson-databind는 코어 및 주석 아티팩트에 종속됩니다.

    세부 사항 :

    HTTP 406 오류 란 무엇입니까?

    406 허용되지 않음 요청 된 리소스는 요청에서 보낸 Accept 헤더에 따라 수용 할 수없는 컨텐트를 생성 할 수 있습니다.

    이는 서버가 MEDIA TYPE이 Accept Header에 명시된 내용을 생성 할 수 없음을 의미합니다.

    그러나 서버는 어떤 미디어 유형을 생성 할 수 있는지, 어떤 미디어 유형을 생성 할 수 없는지를 어떻게 알 수 있습니까?

    Spring Web은 HttpMessageConverter의 개념을 가지고있다. 이러한 변환기 중 일부는 이미 Spring에 등록되어 있으며 AbstractMessageConverterMethodArgumentResolver는 속성 messageConverters에서이를 유지합니다.

    요청 처리 중에 AbstractMessageConverterMethodProcessor는 spring이 변환 할 수있는 것을 분석하고 지원되는 모든 MEDIA TYPES를 producibleMediaTypes 변수에 저장합니다. 요청한 미디어 유형이 생산 가능하지 않으면 오류 406 번을 말합니다. 요청한 미디어 유형을 생성 할 수 없습니다. 죄송합니다.

    긴 이야기를 짧게 자르려면 필요한 변환기를 등록해야합니다. 귀하의 경우에는 응용 프로그램 / json을 생성하는 잭슨 라이브러리입니다.

  11. ==============================

    11.http://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-content-negotiation을 참조하십시오. 보시다시피

    http://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-content-negotiation을 참조하십시오. 보시다시피

    URI 끝에 (예 : http : //domain/SpringWebProject/json/contest/abcd.json) ".json"을 추가해야합니다. 그것은 나를 위해 작동합니다.

  12. ==============================

    12.나는 비슷한 문제가 있었지만 이상했다. 나는 그것을 어떻게 해결했는지 설명 할 것이다.

    나는 비슷한 문제가 있었지만 이상했다. 나는 그것을 어떻게 해결했는지 설명 할 것이다.

    내 web.xml에서 디스패처 서블릿이 * .htm에 매핑되었습니다.

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    그리고 내가 뭘했는지에 상관없이 항상 던져 버렸습니다.

    마침내 나는 그것을 다음과 같이 바꿨다.

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    그리고 효과가있었습니다. 내가 생각하는 것은 당신이

    <mvc:annotation-driven/> 
    

    확장은 수락 헤더보다 우선하며 .htm은 문제를 만들고있었습니다. 그리고 서블릿 자체가 매핑되지 않았으므로 분명히 xml 또는 json을 사용할 수 없습니다.

    또한 스프링이 주석을 생성한다는 것을 추가하고 싶습니다. 스프링은 들어오는 요청의 헤더를 받아 들일 것입니다. json 및 xml에 대한 일반적인 요청 처리기 메서드를 만들고 있었다. Java 8을 사용하고 있기 때문에 Jaxb는 Java 7부터 JAXB 종속성을 필요로하지 않기 때문에 Java에서 inbuilt됩니다. json을 위해 나는 단지 추가 할 필요가 있었다 -

    <dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.8.5"/>
    

    종속성 관리를 위해 아이비를 사용하고 있습니다.

  13. ==============================

    13.아마 잭슨 도서관을 갱신해야 할거야. 저는 Spring v4.3.8을 사용하며 다음과 같이 사용합니다 :

    아마 잭슨 도서관을 갱신해야 할거야. 저는 Spring v4.3.8을 사용하며 다음과 같이 사용합니다 :

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.8.7</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.8.7</version>
    </dependency>
    
  14. ==============================

    14.Spring 4를 사용하고 있다면 라이브러리를 업데이트해야합니다 :

    Spring 4를 사용하고 있다면 라이브러리를 업데이트해야합니다 :

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.3.0</version>
        </dependency>
    
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.3.0</version>
        </dependency>
    
  15. from https://stackoverflow.com/questions/12865093/spring-3-x-json-status-406-characteristics-not-acceptable-according-to-the-requ by cc-by-sa and MIT license