복붙노트

[SPRING] Spring MVC 406은 JSON 응답 대신 허용되지 않는다.

SPRING

Spring MVC 406은 JSON 응답 대신 허용되지 않는다.

Spring 3.0.6에서 JSON 응답을 리턴하려고하는데, 다음과 같은 설명과 함께 406 응답 "Not Acceptable"이 표시됩니다. "이 요청으로 확인 된 자원은 특성을 가진 응답 만 생성 할 수 있습니다 요청에 따라 허용되지 않는 "accept"headers (). "

전에도 비슷한 질문을했지만 프로젝트에도 많은 도움을 줄 수는 없습니다. 테스트와 나는 내가 뭘 잘못하고 있는지 이해하지 못한다.

내 Maven pom.xml에는 다음과 같은 것들이 있습니다.

<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-mapper-asl</artifactId>
  <version>1.8.5</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-core-asl</artifactId>
  <version>1.8.5</version>
  <scope>compile</scope>
</dependency>

web.xml에서 webmvc-config.xml을 참조하고 로그가로드되었는지 확인합니다.

<servlet>
    <servlet-name>mainServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

webmvc-config.xml에서 나는 다음을했습니다 :

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
    </bean> 
    <mvc:annotation-driven />

내 컨트롤러 :

@Controller
public class ClassifiedController {

    @RequestMapping(value = "/classified/{idClassified}", headers = "Accept=*/*",
                    method = RequestMethod.GET)
    @ResponseBody
    public final Classified getClassified(@PathVariable final int idClassified) {
        ...

같은 결과를 가진 headers 매개 변수와 함께 또는없이 시도했습니다. URL을 호출하면 Firefox에서 요청 헤더에는 다음이 포함됩니다 (방화 광과 함께 확인).

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

다음 JQuery를 사용하는 경우 :

$.ajax({
        url: '/classified/38001',
        type: 'GET',
        dataType: 'json'
});

다음 헤더가 전송됩니다.

Accept: application/json, text/javascript, */*; q=0.01

두 경우 모두 406 오류가 발생합니다. 내가 무엇을 확인해야하는지 모르겠다. 그것은 작동합니다.

업데이트 : 저는 Spring을 통해 디버깅하기로 결정했고 Jackson이 올바르게 호출되었고 org.codehaus.jackson.map.ser.StdSerializerProvider에서 _findExplicitUntypedSerializer 메서드에 다음 코드가 포함되어 있음을 알았습니다.

try {
    return _createAndCacheUntypedSerializer(runtimeType, property);
} catch (Exception e) {
    return null;
}

이것은 문제의 원인을 숨기기 때문에 불행합니다. 디버거를 사용하여 그 예외에는 매우 기술적 인 오류 메시지가 있다는 것을 알았습니다.

Conflicting getter definitions for property "reminded": 
ClassifiedImpl#isReminded(0 params) vs
ClassifiedImpl#getReminded(0 params)

이제 오류 메시지가 어리석은 실수이며 쉽게 고칠 수 있다고 보았습니다. 그러나 그 오류 메시지가 그다지 명백하지 않았습니다. 사실, 문제를 수정하여 작업 직렬화로 이어졌습니다.

해결법

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

    1.MappingJacksonJson 처리와 관련하여 Jackson ObjectMapper가 직렬화를 위해 오브젝트 유형을 지원하는지 확인해야합니다.

    MappingJacksonJson 처리와 관련하여 Jackson ObjectMapper가 직렬화를 위해 오브젝트 유형을 지원하는지 확인해야합니다.

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

    2.DispatcherServlet-servlet.xml에 다음을 추가하십시오.

    DispatcherServlet-servlet.xml에 다음을 추가하십시오.

    <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter"/>
            </list>
        </property>
    </bean>
    
  3. ==============================

    3.나는 Spring MVC와 @RestController annotation과 같은 에러 (406 : content not acceptable)를 우연히 발견했다.

    나는 Spring MVC와 @RestController annotation과 같은 에러 (406 : content not acceptable)를 우연히 발견했다.

    Spring 핸들러 :

    @RequestMapping(value = "/stuff-acknowledgment/{id}", produces ="application/json;charset=UTF-8", headers="Accept=*")
    public Message acknowledgeStuff(@PathVariable("id") String id, @ModelAttribute("ack") AckBean acquittement) {
    

    관측:

    따라서:

    Spring MVC는 확장을 해석하고 동일한 MIME 타입 (결과를 경로 변수로 정의한다하더라도)을 생성하고자한다. 여기서는 JSON을 생성하라고 말하더라도 "image / png"MIME 타입이다. 따라서 406 예외가 발생합니다.

    고치다:

    URI에서 ".png"확장자를 제거하거나 PathVariable을 제거하고 본문에 넣거나 pathVariable 뒤에 접미어를 추가합니다 (테스트하지는 않았지만 잘 작동해야 함). 끝에는 파일 확장명을 사용하지 않는 것이 좋습니다. URI의.

    추신 : 그것은 문제의 (업데이트 솔루션에) 질문에 대답하지 않는다는 것을 알지만 그 문제를 검색하고 레코드에 대한 여기 내 수정 사항을 게시 할 때 그 스레드를 찾았습니다. 미래.

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

    4.JSON으로 반환하려는 객체에 해당 속성에 대한 getter 메서드가 없으므로이 문제가 발생했습니다. 아마 잭슨이 필요해. 그것들을 더하고 나면 효과가있었습니다.

    JSON으로 반환하려는 객체에 해당 속성에 대한 getter 메서드가 없으므로이 문제가 발생했습니다. 아마 잭슨이 필요해. 그것들을 더하고 나면 효과가있었습니다.

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

    5.이 스레드는 조금 오래되었지만 ...

    이 스레드는 조금 오래되었지만 ...

    다음을 추가해야합니다 (종속 종속성).

    org.codehaus.jackson jackson-mapper-asl 1.9.13

  6. from https://stackoverflow.com/questions/7473498/spring-mvc-406-not-acceptable-instead-of-json-response by cc-by-sa and MIT license