복붙노트

[SPRING] Spring의 Json은 적절한 응답으로 해결되지 않습니다.

SPRING

Spring의 Json은 적절한 응답으로 해결되지 않습니다.

JSON 응답을 3.0에서 권장 된대로 Jackson 클래스를 사용하여 사용하지 않으려 고 Spring의 컨트롤러를 사용하려고했습니다. 물론 클래스 경로에는 jackson jar 파일 (jackson-core-asl-1.5.5.jar 및 jackson-mapper-asl-1.5.5.jar)이 있습니다.

appconfig.xml 항목에 대해서는 필자가 필요로하는지 잘 모르겠습니다. 저는 그들을 패션계의 비 json ajax로 돌아 오기 전에 절망적 인 마지막 행동으로 생각했습니다.

디버그에서 컨트롤러가 요청을 받고, foo를 반환 한 다음, 방화 광에서 406을 얻는 것을 봅니다.

오류 메시지는 다음과 같습니다. 디버거로 설정할 때 로거에서 : org.springframework.web.HttpMediaTypeNotAcceptableException : 받아 들일 수있는 표현을 찾을 수 없습니다.

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

내 appconfig.xml은 다음과 같습니다.

    <!-- Configures support for @Controllers -->
    <mvc:annotation-driven />

    <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="mediaTypes">
    <map>
      <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/views/"/>
        <property name="suffix" value=".jsp"/>
      </bean>
    </list>
  </property>
  <property name="defaultViews">
    <list>
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
  </property>
</bean>
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages"></property>
    </bean>

내 컨트롤러

@RequestMapping(value="foo/bar", method=RequestMethod.GET)
public @ResponseBody foo getFoo(@RequestParam String fooId) {
    return new foo(fooId); 
}

jsp에서 ajax 호출이 수행되는 위치 :

function addRow() {
$.getJSON("foo/bar",{ fooId: 1} , function(data) {
alert("it worked.");        
});

}

더 많은 정보가 필요한 경우 알려주십시오.

해결법

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

    1.모든 Jackson 콩을 제거하고 협상 진행자의 json 매핑을 제거합니다. mvc : annotation-driven은 Jackson 직렬화가 작동하는 데 필요한 모든 것을 구성해야합니다.

    모든 Jackson 콩을 제거하고 협상 진행자의 json 매핑을 제거합니다. mvc : annotation-driven은 Jackson 직렬화가 작동하는 데 필요한 모든 것을 구성해야합니다.

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

    2.나는이 오류가 두 번 있었어. 이제 막 내 pojo에 게터를 추가했습니다. 406 오류가 사라져서 예상대로 JSON을 얻었습니다. 필자는 필드가 패키지로 보호되어 있기 때문에 (기본 액세스) 필드를 잡아낼 것이라고 추측합니다. 레코드의 경우 중요한 경우, POJO에 Serializable, toString (), serialVersionUID, 인수 없음 생성자 및 명시 적 생성자도 구현했습니다.

    나는이 오류가 두 번 있었어. 이제 막 내 pojo에 게터를 추가했습니다. 406 오류가 사라져서 예상대로 JSON을 얻었습니다. 필자는 필드가 패키지로 보호되어 있기 때문에 (기본 액세스) 필드를 잡아낼 것이라고 추측합니다. 레코드의 경우 중요한 경우, POJO에 Serializable, toString (), serialVersionUID, 인수 없음 생성자 및 명시 적 생성자도 구현했습니다.

    이전에 Tomcat 캐시를 정리 / 지우거나 새로 고쳤으며 강제로 다시로드해야했습니다. 나는 Jackson의 종속성을 추가 할 때 컴파일 시간 오류를 고쳤다.하지만 Tomcat이 런타임에이를 놓치고 나서 Spring MVC가 Jackson 라이브러리를 발견하지 못했고 용납 할 수없는 응답 유형에 대한 406 오류가 발생했다.

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

    3.또한 jackson 관련 jar 파일 두 개를 추가했는지 확인하십시오.

    또한 jackson 관련 jar 파일 두 개를 추가했는지 확인하십시오.

    버전이 다를 수 있습니다.

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

    4.나는 이것이 오래된 쓰레드라는 것을 알고 있지만, 아마도 누군가 나와 같은 문제를 겪을 것이다. Spring 4.0.3.RELEASE에서 Spring 4.1.0.RELEASE로 애플리케이션을 마이그레이션 할 때 예외가 발생했습니다. 필자의 경우 잭슨을 1.9.x에서 2.4.x로 업데이트하는 것이 트릭을 만들었다.

    나는 이것이 오래된 쓰레드라는 것을 알고 있지만, 아마도 누군가 나와 같은 문제를 겪을 것이다. Spring 4.0.3.RELEASE에서 Spring 4.1.0.RELEASE로 애플리케이션을 마이그레이션 할 때 예외가 발생했습니다. 필자의 경우 잭슨을 1.9.x에서 2.4.x로 업데이트하는 것이 트릭을 만들었다.

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

    5.Accept : application / xml 헤더를 보내는 것은 작동하지 않습니다. 하지만 Accept : application / json이 실제로 작동하고 jackson mapper가 작동합니다. 406을 없애고 @ResponseBody보다 더 이상 설정하지 않고 json 형식으로 직렬화 된 java 객체를 가져 와서 새로운 MyObject ()를 반환합니다. :) 이 정보에 대해 skaffman에게 감사 드리며 작동중인 헤더 값에 대해 Bozho에게 감사드립니다. D

    Accept : application / xml 헤더를 보내는 것은 작동하지 않습니다. 하지만 Accept : application / json이 실제로 작동하고 jackson mapper가 작동합니다. 406을 없애고 @ResponseBody보다 더 이상 설정하지 않고 json 형식으로 직렬화 된 java 객체를 가져 와서 새로운 MyObject ()를 반환합니다. :) 이 정보에 대해 skaffman에게 감사 드리며 작동중인 헤더 값에 대해 Bozho에게 감사드립니다. D

  6. ==============================

    6.이 질문은 그물에 사방에 튀어 나와 나는 그것으로 몇 번 물렸다. Spring 3.0.6 (및 아마도 5)은 json을 렌더링 할 때 몇 가지 문제가있다. 3.1.0.RELEASE 버전으로 변경하면 eveyrything은 그대로 작동합니다. 구성 변경없이. 주의 할 점은 리턴 메소드는 @ResponseBody (앞의 예에서와 같이)가 있어야하며 servlet-context.xml 또는 스프링 컨텍스트 구성 파일에 있어야합니다.

    이 질문은 그물에 사방에 튀어 나와 나는 그것으로 몇 번 물렸다. Spring 3.0.6 (및 아마도 5)은 json을 렌더링 할 때 몇 가지 문제가있다. 3.1.0.RELEASE 버전으로 변경하면 eveyrything은 그대로 작동합니다. 구성 변경없이. 주의 할 점은 리턴 메소드는 @ResponseBody (앞의 예에서와 같이)가 있어야하며 servlet-context.xml 또는 스프링 컨텍스트 구성 파일에 있어야합니다.

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

    7.스프링 3.x에서 스프링 4.x로 마이그레이션 할 때도 동일한 예외가 있습니다.

    스프링 3.x에서 스프링 4.x로 마이그레이션 할 때도 동일한 예외가 있습니다.

    나는 잭슨 종속성을 업데이트하는 것으로 해결했다.

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

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

    나에게 필요한 것은 그 무엇도 없었다.

  8. ==============================

    8.내 대답은 조금 늦을 수도 있지만,이 질문을하는 다른 사람들을 도울 수 있습니다.

    내 대답은 조금 늦을 수도 있지만,이 질문을하는 다른 사람들을 도울 수 있습니다.

    나는 나의 문제를 추가함으로써 해결했다.

     hibernate-validator-4.0.2 
    

    (org.slf4j.LoggerFactory 클래스를 찾을 수 없습니다.) 추가 한 다른 예외를 준

    slf4j-api-1.5.6.jar
    

    누군가가 도움이되기를 바랍니다.

  9. from https://stackoverflow.com/questions/3340050/springs-json-not-being-resolved-with-appropriate-response by cc-by-sa and MIT license