2013-09-02 2 views
0

나는 다음과 같은 매핑 봄 컨트롤러Ajax 호출

@Controller 
@RequestMapping("/accreq") 

을 다음과 추가 부울 필드 org.springframework.samples.mvc.ajax.account.AvailabilityStatus 유사한 파일을 내가 노력하고있다 someBooleanValue

@RequestMapping(value = "/defRoles", method=RequestMethod.GET) 
public @ResponseBody AvailabilityStatus loadDefaultRoles(
    @RequestParam(value="idGroup", required=false) String groupID { 

다음 jquery 아약스로이 메소드를 호출하려면

$.getJSON("${pageContext. request. contextPath}/accreq/defRoles.htm", { idGroup: $('#infoGroup').val() }, function(availability) { 
     if (availability.someBooleanValue) { 
      //Do this 
     } else { 
      //Do else 
     } 
    }); 

스프링 메소드가 실행 중이지만 406 응답이 반환됩니다. 무엇 dataType 성공적인 응답을 얻으려면 설정해야합니까? 이 사용은 Spring 3.1.4에서 작동하며 이제는 3.2.4 또는 4.0.0과 같은 스프링의 상위 버전에서는 작동하지 않습니다. 즉, Ajax 응답에서 객체 반환을 처리하는 방법은 무엇입니까?

응답 헤더 - 406 오류

Request Headersview source 
Accept application/json, text/javascript, */*; q=0.01 
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Connection keep-alive 

구성은

<context:component-scan base-package="com.X" /> 
<mvc:annotation-driven /> 
<cache:annotation-driven /> 
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages" /> 
</bean> 
...mapping for controller.....database etc 

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
    <property name="cache" value="true" /> 
    <property name="order" value="1" /> 
</bean> 
+0

을 수정해야합니다. 그래서 기본적으로 Spring이 요청 매개 변수가 될 것으로 기대하는 반면 JSON은 콘텐츠를 서버에 보냅니다. –

+0

같은 느낌이지만 방법이 호출됩니다. 문제는 응답에 대한 자세한 내용입니다. '406' 오류를 피하기 위해 응답을 어떻게 공식화해야합니까? –

+0

메서드가 호출되는 것을 어떻게 테스트하고 있습니까? 응답은 요청한대로 HTML을 반환해야합니다 (콘텐츠가 HTML이 될 것으로 기대하는 .htm URL을 호출하고 있습니다). –

답변

1

봄 3.2 컨텐츠 협상 구현의 점검이 있었다. 그것에는 ContentNegotiationManager이 도입되었으며, 경로가 Accept-Header보다 우선한다는 사실도 소개되었습니다. crossbrowser와 호환되는 방식으로 Accept-Header를 사용하는 것은 다른 브라우저가 다른 헤더를 보내기 때문에 상당히 고통 스럽습니다.

의견 중 하나에서 언급했듯이 the reference guide은 어떻게 ContentNegotiationManager을 구성 할 수 있는지 명확히 문서화합니다. 내가 제대로 jQuery를`getJSON` 방법은 서버가 아닌 요청 매개 변수로 JSON으로 데이터를 전송하고 기억하는 경우 다음과 같은

뭔가 일

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> 
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="false" /> 
</bean> 
+0

나를 올바른 방향으로 향하게 해주셔서 감사합니다. –