2014-10-29 4 views
0

간단한 컨트롤러에 내 REST 호출 설치 프로그램에 항상 406 (허용되지 않는) 응답 코드가 표시됩니다. 내 요청 헤더에 Accept : 'application/json'이 있고 또한 내 수업 경로에 jackson 라이브러리가 있습니다.스프링 4.0 REST 호출 결과 406 오류 코드

4.0.6 버전을 사용했습니다 (4.0.5도 사용). 응용 프로그램 서버 톰캣 8

나는 또한 나의 방법 주석을 변경하려고

@RestController 
@RequestMapping("/menu") 
public class TestController extends AbstractController { 


    @RequestMapping(method = RequestMethod.GET, value = "/config") 
    public Map getConfig (final HttpServletRequest request) 
    { 
     return new HashMap(); 
    } 

} 

내 클래스 :

@RequestMapping(method = RequestMethod.GET, value = "/config", produces={"application/json"}) 

내 봄 웹 컨텍스트 파일 :

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 
     http://www.springframework.org/schema/util 
     http://www.springframework.org/schema/util/spring-util.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> 

    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/> 

    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
     <property name="defaultContentType" value="application/xml" /> 
     <property name="mediaTypes"> 
      <map> 
       <entry key="json" value="application/json"/> 
      </map> 
     </property> 
    </bean> 
</beans> 

나는 또한 시도 간단하게

<mvc:annotation-driven/> 

태그가없고 contentNegotiationManager bean이 없습니다. 응용 프로그램이 두 가지 방법으로 시작하고 서버의 메소드가 호출되지만 매번 406 응답을받습니다.

클라이언트 요청 헤더 :

Host: 127.0.0.1:8002 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 
Accept: application/json,application/xml 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Content-Type: application/json 
X-Requested-With: XMLHttpRequest 
Referer: http://127.0.0.1:8002/myapp/login.rest 
Cookie: JSESSIONID=431505385C0E8A5AAC878BA2B8AE1F92; 
Connection: keep-alive 

잭슨 사용 라이브러리 내 클래스 경로에 : 나는 또한 잭슨을 사용하여 시도

 <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>2.4.3</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.4.3</version> 
     </dependency> 
     <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-annotations</artifactId> 
      <version>2.4.3</version> 
     </dependency> 

도서관 2.3.3.

예제가있는 간단한 봄 부팅 예제를 실행하면 정상적으로 작동합니다. 내가 여기서 무엇을 놓치고 있는지 잘 모르겠습니다.

Stackoverflow의 다른 Spring 406 문제 대부분은 누락 된 jackson 라이브러리 또는 잘못된 요청 헤더와 관련이있는 것처럼 보입니다. 둘 다 있습니다.

내 스프링 웹 컨텍스트 파일에 뭔가가 누락되어 있다고 생각합니다. 하지만 저는 Spring이 JSON에 대한 응답을 자동으로 변환해야한다는 인상하에있었습니다. 내가 여기에없는 것에 대한 아이디어가 있습니까?

내 모든 시도에서 서버 코드가 호출되었지만 매번 응답이 406입니다.

답변

0

확인. 이건 창피해.문제는 다른 application-context.xml 파일 (한 문자로 철자가 잘못됨)이 있다는 것으로 밝혀졌습니다. 철자가 틀린 응용 프로그램 컨텍스트 파일은 사용중인 스프링 3.2.4에 대한 구성이었습니다 (업그레이드 이전의 스프링 버전)

업데이트되지 않았던 application-context.xml 파일을 계속 업데이트하고 변경했습니다 web.xml에서 언급되었으므로 봄에 사용되지 않았습니다.

이전 설정으로 중복 파일을 제거하고 web.xml을 업데이트하여 올바른 파일을 참조하면 이제는 매력처럼 작동합니다!

+0

왜 @@ ResponseBody를 리턴 코드에 함께 선언하지 않았는지 궁금하다. Object –

+0

@ manuel-jordan, 봄 4.0부터 Restcontoller 주석을 사용하면 Responsebody가 필요하지 않다. – jazzkookie

+0

동의하지 않음, 죄송합니다. @ 컨트롤러 만 실수. 고맙습니다. –

0

브라우저에서이 URL을 직접 호출하려고하면 406 오류가 발생합니다. 그러나 AJAX 요청을 통해 그렇게하고 있는데도 여전히 406 오류가 발생하는 경우 다음 해결 방법을 시도해 볼 수 있습니다. [내 경우 작동] :

1. 다음 속성을 포함하도록 콘텐츠 협상 관리자를 편집하십시오.

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/> 

    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
     <property name="favorPathExtension" value="false" /> 
    </bean> 

    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/> 

2. 변경 다음

@RequestMapping(value = "yourURL", method = RequestMethod.GET, produces = "application/json", headers = "Accept=*/*") 

로 @RequestMapping이 내 사건에서 일했다. 그것이 당신을 위해 일하기를 바랍니다 너무 .. !!

+0

응답 해 주셔서 감사합니다. 그것을 시도했지만 그것은 나를 위해 작동하지 않습니다, 그리고 내 애플 리케이션에서 AJAX 전화를 만들고있어. – jazzkookie

+0

브라우저에서 직접이 URL을 테스트하지 않았는지 확인하십시오. ajax 요청을 통해 전화를 겁니다. –