为什么这个Spring MVC控制器方法无法处理这个简单的GET AJAX请求?

时间:2016-03-30 14:05:13

标签: jquery ajax spring spring-mvc

我正在研究Spring MVC应用程序,我在尝试检索由JQuery AJAX请求传递的String值时遇到了一些问题。

function aggiungiAppunti() {
    console.log("INTO aggiungiAppunti()");
    //alert("INTO aggiungiAppunti()");

    var testoNotaCorrente = $('#notaCorrente').val();

    alert("NOTA CORRENTE: " + testoNotaCorrente);

    var message = 'Sei sicuro di voler salvare questi appunti?';

    mostraConferma(message, function (){
        $.ajax({
            type : "GET",
            url : "aggiungiAppunti",
            data : { 
                'testoNotaCorrente': testoNotaCorrente
            },
            processData: false,
            contentType: false
        }).done(function(principal) {
            replaceFragment($('#situazioniDocumentali'),principal);
            inizializzazioneGestioneValidazione();
        }).error(function(error) {
            showErrorMessage("errore");
        }); 
    });

}

因此,正如您在前面的代码片段中所看到的,我有这个JavaScript函数对 aggiungiAppunti URL执行GET AJAX请求,传递 testoNotaCorrente 文本参数包含 testoNotaCorrente 从textview中检索它的值(我有一个警告,以确保它被正确地定价,并且确实如此)。

然后进入一个控制器类,我声明了这个方法必须处理以前的AJAX请求:

@RequestMapping(value = "/aggiungiAppunti", method = RequestMethod.GET)
public String aggiungiAppunti(HttpServletRequest request, Model model, Locale locale, @RequestParam("testoNotaCorrente") String testoNotaCorrente) throws Exception {
    System.out.println("INTO aggiungiAppunti(), testo nota corrente: " +  testoNotaCorrente);

    return "blablabla";
}

但是当执行AJAX请求时,不执行此方法,并在stacktrace中获取此错误消息:

15:58:48,332 INFO  [stdout] (http-localhost/127.0.0.1:8080-1) org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'testoNotaCorrente' is not present

为什么呢?怎么了?我错过了什么?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

看起来你是从javascript传递变量作为POST变量,但映射Java方法以查找GET变量。

有关详情,请参阅文档:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMethod.html#enum.constant.summary

请求网址在服务器访问日志中的含义是什么?

更改您的JavaScript以将变量放入网址。

$.ajax({
            type : "GET",
            url : "aggiungiAppunti",
            data : { 
                'testoNotaCorrente': testoNotaCorrente
            },
            processData: false,
            contentType: false
        })

$.ajax({
            type : "GET",
            url : "aggiungiAppunti?testtoNotaCorrente="+testtoNotacorrente,
            processData: false,
            contentType: false
        })

-Or -

将Java更改为使用POST而不是GET:

@RequestMapping(value = "/aggiungiAppunti", method = RequestMethod.GET)

@RequestMapping(value = "/aggiungiAppunti", method = RequestMethod.POST)

答案 1 :(得分:0)

我自己解决了从AJAX请求中删除这些行的问题:

processData: false,
contentType: false

成为:

    $.ajax({
        type : "GET",
        url : "aggiungiAppunti",
        data : { 
            'testoNotaCorrente': testoNotaCorrente
        },
        contentType:"application/json"
    }).done(function(principal) {
        replaceFragment($('#situazioniDocumentali'),principal);
        inizializzazioneGestioneValidazione();
    }).error(function(error) {
        showErrorMessage("errore");
    }); 

因此,它可以使用我原来的控制器方法,而无需进行其他更改

答案 2 :(得分:-2)

而不是像这样传递参数:

$.ajax({
        type : "GET",
        url : "aggiungiAppunti",
        data : { 
            'testoNotaCorrente': testoNotaCorrente
        },
        processData: false,
        contentType: false
    }).done(function(principal) {
        replaceFragment($('#situazioniDocumentali'),principal);
        inizializzazioneGestioneValidazione();
    }).error(function(error) {
        showErrorMessage("errore");
    }); 

试试这个:

url:“aggiungAppunti?testoNotaCorrente = testoNotaCorrente”