从ajax发送POST方法后出现404错误(@ResponseStatus& ResponseEntity)

时间:2015-03-08 04:16:54

标签: java jquery ajax spring http

我使用Spring MVC并尝试使用jQuery。我在我的网页上有这个:

$(document).ready(function () {
    var entity = {mag: "status_key", paper: "View10"};
    $("#btn").click(function () {
        $.ajax({
            url: "ajaxJsonPost",
            type: 'post',
            dataType: 'json',
            data: JSON.stringify(entity),
            contentType: 'application/json',
        });
    });
});

Spring服务器有这个:

@RequestMapping(value = "ajaxJsonPost", method = RequestMethod.POST)
public void postJson(@RequestBody Entity en) throws IOException {
    System.out.println("writing entity: " + en.toString());
}

好的,实体来到服务器。但浏览器控制台会打印 404 not found 。我知道我的POST请求需要任何响应。在Internet上,我找到了建议我返回ResponseEntity对象的解决方案,或者使用注释@ResponseStatus。他们都很好地返回HttpStatus,但我不知道在哪些情况下我应该使用它们。什么是最好的方式?

1 个答案:

答案 0 :(得分:1)

@Controller
@RequestMapping("/apipath")
public class SomeController {
@RequestMapping(value = "/ajaxJsonPost", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String postJson(@RequestBody final Entity en) {
        System.out.println(en.toString());

        //assuming you have a class "EntityService" and 
        //it has a method postData 
        //which takes Entity object as parameter and pushes into database.
        EntityService.postData(en);

        System.out.println("added");
        return "success";
    }
}

服务器端的实体对象

@JsonAutoDetect
public class Entity {

    private String mag;
    private String paper;

    public String getMag() {
        return mag;
    }

    public void setMag(final String mag) {
        this.mag = mag;
    }

    public String getPaper() {
        return paper;
    }
    public void setPaper(final String paper)
        this.paper = paper;
    }
}

AJAX

$(document).ready(function () {
    var entity = {mag: "status_key", paper: "View10"};
    $("#btn").click(function () {
        $.ajax({
            url: "/apipath/ajaxJsonPost",
            type: 'post',
            dataType: 'json',
            data: JSON.stringify(entity),
            contentType: 'application/json',
            success : function(response) {    
                  alert(response);
            },
            error : function() {
                  alert('error');
            }
        });
    });
});

至于为何以及何时使用@ResponseStatus和@ResponseEntity,@Sotirios Delimanolis已经有一个简短的答案。 When use @ResponseEntity

它说:

  

ResponseEntity 旨在表示整个HTTP响应。您可以   控制进入它的任何东西:状态代码,标题和正文。

     

@ResponseBody 是HTTP响应正文的标记    @ResponseStatus 声明HTTP响应的状态代码。

     

@ResponseStatus 不是很灵活。它标志着整个方法,所以你   必须确保您的处理程序方法始终表现相同   办法。你仍然无法设置标题。你需要的   HttpServletResponse或HttpHeaders参数。

     

基本上,ResponseEntity可以让您做得更多。