我尝试使用spring MVC运行ajax方法,但我得到错误406:"此请求标识的资源只能生成具有不可接受的特征的响应。对请求"接受"标题"
控制器:
@Transactional
@Controller("user")
@SessionAttributes("user")
public class HomeController {
@Autowired
private UserDAO daoUser;
@Autowired
private EnterpriseDAO daoEnterprise;
@Autowired
private FuncDAO daoFunc;
@Autowired
private LastPeriodDAO daoLastPeriod;
@RequestMapping("/")
public String index() {
return "redirect:menu";
}
@RequestMapping(value = "/menu", method = RequestMethod.GET)
public ModelAndView menu(@ModelAttribute("user") User user, Enterprise enterprise) {
ModelAndView mav = new ModelAndView("user/menu");
Func func = daoFunc.getFunc(user);
mav.addObject("func", func);
mav.addObject("enterprise", enterprise);
mav.addObject("enterpriseList", daoEmpresa.listEnterprise(func));
return mav;
}
@RequestMapping(value = "/dynamicMenu", method = RequestMethod.POST)
public @ResponseBody List<LastPeriod> dynamicOption(@ModelAttribute("enterprise") Enterprise enterprise) {
System.out.println(enterprise.getCnpj());
List<LastPeriod> options = daoLastPeriod.getLastPeriod(enterprise);
System.out.println(options.size());
return options;
}
请求ajax:
$(document).ready(function() {
function enterpriseSelectChange() {
var enterprise= $(this).serialize();
$.ajax({
type: 'POST',
url: 'dynamicMenu',
data: enterprise,
})
.done(function(data) {
console.log("success");
console.log(data)
})
.fail(function() {
console.log("error");
});
}
$("#cnpj").change(enterpriseSelectChange);
});
表格:
<form:form modelAttribute="enterprise" commandName="enterprise" class="form-horizontal" method="POST">
<fieldset>
<legend>Olá, ${func.name}</legend>
<!-- Select enterprise -->
<div class="form-group">
<label for="enterprise">Enterprise</label>
<form:select path="cnpj" class="form-control">
<form:option value="0" label=" Select"/>
<form:options items="${enterpriseList}" itemValue="cnpj"/>
</form:select>
</div>
</form:form>
请,有人有任何解决方案吗?
修改
包含的控制器和表单
答案 0 :(得分:1)
406表示&#34;不可接受&#34;。尝试在发送请求时添加标题内容类型:
$.ajax({
type: 'POST',
headers:{
'Content-type:application/x-www-form-urlencoded'
},
url: 'dynamicMenu',
data: enterprise,
})
.done(function(data) {
console.log("success");
console.log(data)
})
.fail(function() {
console.log("error");
});
应用程序/ x-WWW窗体-urlencoded
答案 1 :(得分:0)
基本上,错误消息是服务器无法生成AJAX调用可接受的响应类型。服务器期待您的接受&#34;接受&#34; header包含一个可以在其中生成响应的类型。
尝试设置&#34;接受&#34; AJAX调用中的标题:
$.ajax({
type: 'POST',
headers:{
'Accept:application/json'
},
...
})
注意标题之间的区别
其他评论会要求您设置内容类型,但您发布的错误消息似乎表明您需要设置&#34;接受&#34;报头中。
答案 2 :(得分:0)
所以这是你的问题,
您需要返回jsonObject
,但实际上您要返回LastPeriod对象列表,即List<LastPeriod>
。
所以你需要改变方法,
@RequestMapping(value = "/dynamicMenu", method = RequestMethod.POST)
public @ResponseBody List<LastPeriod> dynamicOption(@ModelAttribute("enterprise") Enterprise enterprise) {
List<LastPeriod> options = daoLastPeriod.getLastPeriod(enterprise);
JSONArray jsonArray = new JSONArray();
for(LastPeriod lastPeriod: options){
JSONObject jsonObject = new JSONObject();
//Here put data in jsonObject from lastPeriod like
jsonObject.put("name", "populate field from lastPeriod");
jsonArray.add(jsonObject);
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("data", jsonArray);
return jsonObject.toJSONString();
}
现在你将获得ajax响应,就像数组一样。
$.ajax({
type: 'POST',
url: 'dynamicMenu',
data: enterprise,
success: function(resp){
var parseJson = JSON.parse(resp);
console.log(parseJson.data);
}
});
答案 3 :(得分:0)
首先感谢你的帮助。
我在弹簧配置中遇到问题,该问题已配置为JsonViewResolver
,configureContentNegotiation
,contentNegotiatingViewResolver
。我想我必须在控制器上指定一个回报。
正如我只需要JSON一样忽略这些设置并且现在正在运行。
个人,首先感谢你的帮助。
我在spring配置中遇到了问题,配置了JsonViewResolver,configureContentNegotiation,contentNegotiatingViewResolver。我想我必须在控制器上指定一个回报。
正如我只需要JSON一样忽略这些设置并且现在正在运行。
我也改变了我的方法,因为它不需要接收一个对象,只需要一个id。因此它看起来像这样:
@RequestMapping(value = "/dynamicMenu/{cnpj}", method = RequestMethod.GET)
public @ResponseBody List<UltimoPeriodoAberto> DynamicOptions(@PathVariable final String cnpj) {
return daoLastPeriod.getLastPeriod(new Enterprise(cnpj));
}
请求ajax:
var cnpj = $(this).val();
$.ajax({
type: 'get',
url: 'http://localhost:8080/myincome/dynamicMenu/' + cnpj,
})
.done(function(data) {
console.log("success");
console.log(data[0]);
for ( var i = 0; i < data.length; i++) {
console.log(data[i].description);
}
})
.fail(function(jqXHR, textStatus, errorThrown) {
console.log("The following error occured: " + textStatus, errorThrown);
});