Spring-Boot Controller无法识别来自Ajax的数据

时间:2019-04-08 19:07:07

标签: javascript java ajax spring-boot

我正在尝试将ajax中的json(电子邮件和密码)发送到Spring-Boot中的Controller方法。

我确定我要从html中获取数据并以正确的方式在json中进行解析,但控制器仍然表示缺少电子邮件预期字段。 我还使用了form.serialized(),但没有任何变化,因此我决定创建自己的对象,然后将其解析为json。

单击“提交”按钮时,Ajax调用开始:

function login() {
var x = {
    email : $("#email").val(),
    password : $("#password").val()
  };
$.ajax({
    type : "POST",
    url : "/checkLoginAdministrator",
    data : JSON.stringify(x),
    contentType: "application/json",
    dataType: "json",
    success : function(response) {
        if (response != "OK")
            alert(response);
        else
            console.log(response);
    },
    error : function(e) {
        alert('Error: ' + e);
      }
});

这是控制器内部的方法:

@RequestMapping("/checkLoginAdministrator")
public ResponseEntity<String> checkLogin(@RequestParam(value = "email") String email,
                                         @RequestParam(value = "password") String password) {
    String passwordHashed = Crypt.sha256(password);

    Administrator administrator = iblmAdministrator.checkLoginAdministrator(email, passwordHashed);

    if (administrator != null) {
        Company administratorCompany = iblmCompany.getAdministratorCompany(administrator.getCompany_id());

        String administratorCompanyJson = new Gson().toJson(administratorCompany);

        return new ResponseEntity<String>(administratorCompanyJson, HttpStatus.OK);
    }
    return new ResponseEntity<String>("{}", HttpStatus.OK);
}

我可以通过console.log()看到的json如下:

{"email":"fantasticemail@email.it","password":"1234"}

在IJ控制台中,我得到此Java WARN:

Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'email' is not present]

2 个答案:

答案 0 :(得分:2)

问题是您正在使用@RequestParam,它从网址中获取参数,您应该使用@RequestBody进行POST请求

我建议创建一个DTO对象,您可以使用它来读取POST请求的正文,如下所示:

public ResponseEntity<String> checkLogin(@RequestBody UserDTO userDTO){

DTO是这样的:

public class UserDTO {
  private String email;
  private String password;

  //getter & setters
}

答案 1 :(得分:0)

您可以按照以下方法进行操作:

  1. 使用contentType:“ application / json; charset = utf-8”,

  2. 创建一个域对象,该域对象是电子邮件和密码的包装,并使用@RequestBody

    读取json。
    public class Login{
     private String email;
     private String password;
     //Getters and Setters
    }
    
    
    
    @RequestMapping("/checkLoginAdministrator")
    public ResponseEntity<String> checkLogin((@RequestBody Login login) {
     //logic
    }