복붙노트

[SPRING] Spring MVC @ResponseBody가 Map을 리턴하면 "Error 406 NOT ACCEPTABLE"

SPRING

Spring MVC @ResponseBody가 Map을 리턴하면 "Error 406 NOT ACCEPTABLE"

@ResponseBody를 설정하여 컬렉션을 반환하는 데 문제가 있습니다. 클래스 패스에 JAXB jar가 있는데 ContentNegotiatingViewResolver를 설정하지 않았습니다.

이것은 내 간단한 개체입니다 :

@XmlRootElement(name = "test-object")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestObject implements Serializable {

    @XmlAttribute
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

단일 객체를 반환하는 간단한 테스트를 작성했습니다 ... 문제없이 작동하며 생성 된 XML을 볼 수 있습니다.

@RequestMapping(value = "one", method = RequestMethod.GET)
public @ResponseBody TestObject getSingleObject() {
    TestObject obj = new TestObject();
    obj.setId(1);

    return obj;
}

내가 정말로 원하는 것은 객체의 목록을 반환하는 것입니다. 주위를 읽은 후 그렇게하는 방법은지도에 목록을 배치하고지도를 반환하는 것입니다.

@RequestMapping(value = "all", method = RequestMethod.GET)
public @ResponseBody Map<String, ? extends Object> getAllObjects() {
    TestObject obj1 = new TestObject();
    obj1.setId(1);

    TestObject obj2 = new TestObject();
    obj2.setId(2);

    List<TestObject> list = Arrays.asList(obj1, obj2);

    return Collections.singletonMap("all-objects", list);
}

위를 실행할 때 "오류 406 Not Acceptable"이 표시됩니다.

나는 여기서 무엇을 잘못 했는가? 차이가 나는 경우 부두 6.1에서 실행 중입니다.

감사.

해결법

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

    1.pom.xml에 추가 된이 두 가지 종속성이 필요합니다!

    pom.xml에 추가 된이 두 가지 종속성이 필요합니다!

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-lgpl</artifactId>
        <version>1.8.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-lgpl</artifactId>
        <version>1.8.1</version>
    </dependency>
    
  2. ==============================

    2.나는 동일한 문제가 있었고 디버깅을 2 시간 수행 한 후에 마침내 해결책을 찾았습니다. 누군가 다른 사람이 같은 문제에 얽매여있는 경우를 대비해서 내가 찾은 것입니다.

    나는 동일한 문제가 있었고 디버깅을 2 시간 수행 한 후에 마침내 해결책을 찾았습니다. 누군가 다른 사람이 같은 문제에 얽매여있는 경우를 대비해서 내가 찾은 것입니다.

    아마 당신은 mvc : annotation-driven 설정 요소를 사용할 것을 지시하는 Spring 3의 Ajax Simplification을 따를 것입니다.

    mvc : annotation-driven은 이미 정의 된 빈 중 하나를 제외하고는 몇 가지 표준 빈을 정의하는 바로 가기입니다!

    mvc : annotation-driven 구성을 사용하면 MappingJacksonHttpMessageConverter가 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter에 messageConverter로 등록됩니다.

    자신의 AnnotationMethodHandlerAdapter를 정의한 경우이 MappingJacksonHttpMessageConverter도 수동으로 정의해야합니다.

    AnnotationMethodHandlerAdapter에 등록 된 Cfr 사용자 지정 메시지 변환기는 사용되지 않고 기본 변환기 만 사용됩니다. 비슷한 문제를 논의합니다. 또한 SPR-6524 및 SPR-6306을 확인하고 스팸 방지로 인해 링크를 게시 할 수 없습니다.

    내 봄 설정의 관련 부분이 이렇게 보였다 :

        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
            <property name="webBindingInitializer">
                <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
                    <property name="validator">
                        <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
                        </bean>
                    </property>
                </bean>
            </property>
             <property name="messageConverters">
                <list>   
                    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter"/>
                    <bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter"/>
                </list>
            </property>
    </bean>
    
  3. ==============================

    3.나는이 질문이 약간 오래된 것을 알고 있지만, 나는 똑같은 문제가있다.

    나는이 질문이 약간 오래된 것을 알고 있지만, 나는 똑같은 문제가있다.

    jackson-core-asl-1.x.jar 및 jackson-mapper-asl-1.x.jar 경로 2 개의 병을 빌드하기 위해 추가했습니다. http://wiki.fasterxml.com/JacksonDownload에서 다운로드하거나 Maven을 사용하는 경우 projet 종속성으로 추가 할 수 있습니다.

    버전 1.x (1.9, 내 경우에는)를 사용하고 2.x는 사용하지 않았습니다. 마지막 버전이 나에게 적합하지 않았습니다.

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

    4.답변보다는 제안이 많지만지도를 만든 다음 개체를 추가하고 다음과 같이지도를 반환하려고 했습니까?

    답변보다는 제안이 많지만지도를 만든 다음 개체를 추가하고 다음과 같이지도를 반환하려고 했습니까?

    @RequestMapping(value = "all", method = RequestMethod.GET)
    public @ResponseBody Map<String, ? extends Object> getAllObjects() {
        TestObject obj1 = new TestObject();
        obj1.setId(1);
    
        TestObject obj2 = new TestObject();
        obj2.setId(2);
    
        List<TestObject> list = Arrays.asList(obj1, obj2);
        Map<String, Object> map = new TreeMap<String, Object>();
        map.put("all-objects",list);
        return map;
    }
    
  5. from https://stackoverflow.com/questions/7336875/spring-mvc-responsebody-returning-a-map-produces-error-406-not-acceptable by cc-by-sa and MIT license