Контроллер Spring-Boot не распознает данные из ajax

#javascript #java #ajax #spring-boot

#javascript #java #ajax #spring-boot

Вопрос:

Я пытаюсь отправить json (адрес электронной почты и пароль) из ajax в метод контроллера в Spring-Boot.

Я уверен, что я беру данные из 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);
}
  

Передаваемый мной json, который я вижу с помощью console.log() , является следующим:

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

В консоли IJ я получаю это предупреждение Java:

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

Комментарии:

1. Почему вы отправляете строку (путем упорядочивания JSON), когда вы указываете, что ajax отправит ContentType application / json? Кроме того, в вашем коде вы ожидаете параметр, который поступил бы, если бы вы использовали «GET»; однако вы используете «POST», поэтому вместо этого вам следует проверить @RequestBody.

Ответ №1:

Проблема в том, что вы используете @RequestParam который принимает параметры из URL-адреса, который вы должны использовать @RequestBody для запросов POST

Я бы рекомендовал создать объект DTO, который вы можете использовать для чтения тела запроса POST, например:

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

С DTO, являющимся чем-то вроде этого:

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

  //getter amp; setters
}
  

Ответ №2:

Вы можете либо следовать приведенным ниже подходам:

  1. Используйте ContentType: «application /json; charset=utf-8»,

  2. Создайте объект домена, который является оболочкой электронной почты и пароля, и прочитайте json, используя @RequestBody

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