Spring MVC和Ajax错误406

时间:2015-06-09 19:01:10

标签: ajax spring spring-mvc

我尝试使用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>

请,有人有任何解决方案吗?

修改

包含的控制器和表单

4 个答案:

答案 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'
    },
    ...
})

注意标题之间的区别

  1. &#34;内容类型&#34; - &GT;请求内容属于此类型/格式
  2. &#34;接受&#34; - &GT;我将接受此类型/格式的回复
  3. 其他评论会要求您设置内容类型,但您发布的错误消息似乎表明您需要设置&#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)

首先感谢你的帮助。

我在弹簧配置中遇到问题,该问题已配置为JsonViewResolverconfigureContentNegotiationcontentNegotiatingViewResolver。我想我必须在控制器上指定一个回报。

正如我只需要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);
    });