我正在使用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;
}
答案 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>