简体   繁体   中英

Spring MVC + Ajax error 400

I have a simple java application on Spring MVC and I send ajax request to Spring controller. When I set headers "Accept", "application/json" and "Content-Type", "application/json;charset=utf-8" in AJAX call I get error 400 in dubugger, when I delete it I get error 415 .

If I change controller method signature to public String logoutPage (@RequestBody String obyavleniye) I get JSON string. What problem can be with parse request in controller?

JS method:

$("#advertForm").submit(function(e) {
        e.preventDefault();
        var token = $("meta[name='_csrf']").attr("content");
        var header = $("meta[name='_csrf_header']").attr("content");
        var obyavleniye = {
            title: "Title",
            price: "80",
            description: "desc",
            date: "2016-11-07 18:30:21",
            authorid: "2",
            category: "A",
            state: "new",
            img1: "http",
            img2: "http",
            img3: "http",
            img4: "http",
        };
        var post_data = JSON.stringify(obyavleniye);

        console.log(post_data);
        $.ajax({
            url : "/upload",
            type: "POST",
            dataType: 'json',
            data: post_data,
            beforeSend: function(xhr) {
                xhr.setRequestHeader("Accept", "application/json");
                xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8");
                xhr.setRequestHeader(header, token);
            },
            complete: function() {
                console.log("Sent");
            },
            success: function (response) {
                console.log("success");
                console.log("response" + response);
            },
            error: function (data) {
                console.log("error");
                console.log(data);
            }
        });
    });

Controller method:

@ResponseBody
    @RequestMapping(value="/upload", method = RequestMethod.POST)
    public String logoutPage (@RequestBody Advert obyavleniye) {
//    public String logoutPage (@RequestBody String obyavleniye) {
        System.out.println("Enter: " + obyavleniye);
        this.advertService.addAdvert(obyavleniye);
//        return "{\"msg\":\"success\"}";
        return "{\"title\":\"Title\",\"price\":\"80\",\"description\":\"normm\",\"date\":\"2016-11-07 18:30:21\",\"authorid\":\"2\",\"category\":\"A\",\"state\":\"new\",\"img1\":\"http\",\"img2\":\"http\",\"img3\":\"http\",\"img4\":\"http\"}";
    }

My sample code.

js

  Company.prototype.saveCompanyLocation = function() {
        /* company */
        var companyIdx = $('#companyIdx').val();
        var locationIdx = $('#locationIdx').val();

        var data = {
            idx : locationIdx,

            postCode : $('#postCode').val(),
            address : $('#address').val(),
            detailAddress : $('#detailAddress').val(),

            tel : $('#tel').val(),
            fax : $('#fax').val(),
            email : $('#email').val(),
            language : $("#language").val(),

            latitude : $('#latitude').val(),
            longtitude : $('#longtitude').val()

        };

        data = JSON.stringify(data);

        $.ajax({
            url : "/gpim/company/settings/location/save/" + companyIdx,
            type : 'POST',
            data : data,
            contentType : 'application/json',

            success : function(response) {
                if (response == "success") {
                    document.location.reload(true);
                } else {
                    $("#editMsg").text("you can`t save location information.");
                }
            },
            error : function(request, status, error) {

            }
        });
    };

controller

@RequestMapping(value = "/settings/location/save/{companyIdx}", method = RequestMethod.POST)
    public @ResponseBody String saveLocation(@PathVariable int companyIdx, @RequestBody CompanyLocation location) {
        Company company = companyService.findCompanyByIdx(companyIdx);

        company = companyService.saveCompanyLocation(company, location);

        if (company != null) {
            return "success";
        }

        return "fail";
    }

Do the below steps:

1) try to keep the jackson jar files in your classpath

2) eighter you have remove the datatype while sending ajax request ie,

dataType : "json"

or you have to produce the application/json response as below

@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

3) Check your DTO or Advert class properties which type should be matched with incoming request. ie request params should match with DTO members both names and type.

These are possible ways to avoid your case.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM