Jquery Ajax抛出错误406 - 在Spring MVC中不可接受

时间:2014-06-03 20:48:39

标签: jquery spring-mvc

我正在使用Jquery AJAX调用控制器方法。我的控制器方法被正确调用 但是ajax返回错误=错误406 - 不可接受。

我查看过其他帖子并遵循所有必要步骤。我错过了什么吗?

我使用的是jackson-core-asl-1.9.4.jar 带有弹簧3.2的jackson-mapper-asl-1.9.4.jar

我的spring-servlet.xml有以下

<context:component-scan  base-package="org.lacare.frc.controller" />  
<mvc:annotation-driven></mvc:annotation-driven> 
<context:annotation-config/> 

我的JSP遵循ajax调用

$.ajax({
      url: '<c:url  value="getServiceCategoriesForVisitType.html"/>' + '?visitTypeCode=' +$(this).val(),
      data: "",
      type: "GET",
      contentType: "application/json",
      dataType:"json" , 
      success: function(respContent) {

       alert(respContent); 

       },
       error:function( jqXHR,  textStatus,  errorThrown ){
            alert('error '+errorThrown);
                    }
        });  

我的控制器方法如下

   @RequestMapping(value={"/getServiceCategoriesForVisitType"},method=RequestMethod.GET,headers="Accept=*/*",produces = "application/json")
   public @ResponseBody List<String> loadreateVisitType(HttpServletRequest request,@RequestParam(value="visitTypeCode", required=true) long visitTypeCode) {    

    List<String> serviceCategories1=new ArrayList<String>();   
    serviceCategories1.add("abc"); 
    serviceCategories1.add("pqr"); 
    return serviceCategories1; 

   }

4 个答案:

答案 0 :(得分:4)

您只需添加:

@ResponseStatus(HttpStatus.OK)

就在下方:

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

我也遇到了同样的错误。这是一个答案。

答案 1 :(得分:2)

可能是标题问题。尝试将其添加到$.ajax()

headers: { 
    Accept : "application/json"
}

答案 2 :(得分:1)

尝试更改方法以返回String,并在您的方法中将列表转换为JSON字符串。为此,您可以使用google-gson但是,鉴于我们已经在使用spring并且可能已经在项目中拥有这些依赖项,您可以使用Jackson的ObjectMapper。像这样:

       @RequestMapping(value={"/getServiceCategoriesForVisitType"},method=RequestMethod.GET,headers="Accept=*/*",produces = "application/json")
   public @ResponseBody String loadreateVisitType(HttpServletRequest request,@RequestParam(value="visitTypeCode", required=true) long visitTypeCode)
throws JsonProcessingException {    
    // NOTE1: change the method to return a "String"
    // NOTE2: add "throws JsonProcessingException" to the method (or catch it)
    List<String> serviceCategories1=new ArrayList<String>();   
    serviceCategories1.add("abc"); 
    serviceCategories1.add("pqr"); 
    //return serviceCategories1; 
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(serviceCategories1);
   }

还要添加这两个导入:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

我很确定以上内容会为您解决。但只是为了确保这个答案是完整的(如果有其他人提出有关406错误的问题),另一件要尝试的是将其添加到@RequestMapping(你已经将它添加到你的方法所以也许给别人留言):

headers="Accept=*/*",produces = "application/json"

例如:

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

答案 3 :(得分:0)

这里的问题是路径 value="getServiceCategoriesForVisitType.html" 在检查 Accept 标头的值之前将首先使用内容协商。使用像 *.html 这样的扩展名,Spring 将使用 org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy 并解决返回的可接受媒体类型是 text/html 这与 MappingJacksonHttpMessageConverter 产生的内容不匹配,即。 application/json,因此返回 406。

OR

Following Maven dependency could be help if there is version issue with jackson :

<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>