SpringMVC和Ajax错误406

SpringMVC和Ajax错误406,ajax,spring,spring-mvc,Ajax,Spring,Spring Mvc,我试图用SpringMVC运行一个ajax方法,但是我得到了错误406:“这个请求标识的资源只能根据请求“accept”头生成具有不可接受特征的响应” 控制器: @Transactional @Controller("user") @SessionAttributes("user") public class HomeController { @Autowired private UserDAO daoUser; @Autowired private EnterpriseDAO daoEnter

我试图用SpringMVC运行一个ajax方法,但是我得到了错误406:“这个请求标识的资源只能根据请求“accept”头生成具有不可接受特征的响应”

控制器:

@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;
}
}))

表格:

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

Olá,${func.name}
企业
拜托,有人有办法吗

编辑

包含的控制器和表格406表示“不可接受”。发送请求时尝试添加标题内容类型:

$.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");
});

application/x-www-form-urlencoded

从本质上讲,错误消息表示服务器无法生成AJAX调用可接受的响应类型。服务器希望您的“Accept”头包含一个它可以生成响应的类型

尝试在AJAX调用中设置“Accept”标题:

$.ajax({
    type: 'POST',
    headers:{
        'Accept:application/json'
    },
    ...
})
请注意标题之间的差异

  • “内容类型”-->请求内容属于此类型/格式
  • “Accept”-->我将接受此类型/格式的响应

  • 另一条评论要求您设置内容类型,但您发布的错误消息似乎表明您需要设置“接受”标题。

    因此,这是您的问题

    您需要返回
    jsonObject
    ,但实际上您返回的是LastPeriod对象的列表,即
    List

    所以你需要改变方法

    @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();
    }
    

    首先谢谢你的帮助

    我在spring配置中遇到了一个问题,它被配置为
    jsonviewsolver
    configureContentNegotiation
    contentnegotingviewresolver
    。我想我必须在控制器上指定一个返回

    正如我所需要的,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));
    }
    
    @RequestMapping(value=“/dynamicMenu/{cnpj}”,method=RequestMethod.GET)
    public@ResponseBody列表动态选项(@PathVariable最终字符串cnpj){
    返回daoLastPeriod.getLastPeriod(新企业(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);
        });
    
    var cnpj=$(this.val();
    $.ajax({
    键入:“get”,
    网址:'http://localhost:8080/myincome/dynamicMenu/“+cnpj,
    })
    .完成(功能(数据){
    控制台日志(“成功”);
    console.log(数据[0]);
    对于(变量i=0;i
    非常感谢。我添加了行“headers”,内容类型:application/x-www-form-urlencoded',但仍然有相同的错误。可能是这个jquery序列化有问题。尝试硬编码,只是为了测试。尝试
    数据:“field1=value1&field2&value2“
    我在控制器上做了一个返回字符串的测试,它成功了。。。问题是当我试图返回一个对象列表时……从第一篇文章开始,我就知道你在发送数据时有问题,现在你说你在返回对象列表时确实有问题。请给我你的表格和
    Enterprise
    课程。你到底想向管理员发送什么?var enterprise=$(this).serialize();这就是表单序列化发生的地方吗?我正在发送用户选择的公司的id。此id是访问选项列表的参数。当我得到id并实现查询时。该错误发生在请求的响应中,该请求无法发送该列表以使用javascript装载元素。如果您发送的
    id
    类型为string或long,则控制器方法不应将
    @modeldattribute(“企业”)enterprise
    作为输入。那么,您是否要将模型对象发送回控制器?我正在将ajax请求作为企业对象。我会把控制员和表格放在邮局。
    @RequestMapping(value = "/dynamicMenu/{cnpj}", method = RequestMethod.GET)
    public @ResponseBody List<UltimoPeriodoAberto> DynamicOptions(@PathVariable final String cnpj) {
    
        return daoLastPeriod.getLastPeriod(new Enterprise(cnpj));
    }
    
    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);
        });