#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:
Вы можете либо следовать приведенным ниже подходам:
-
Используйте ContentType: «application /json; charset=utf-8»,
-
Создайте объект домена, который является оболочкой электронной почты и пароля, и прочитайте json, используя @RequestBody
public class Login{ private String email; private String password; //Getters and Setters } @RequestMapping("/checkLoginAdministrator") public ResponseEntity<String> checkLogin((@RequestBody Login login) { //logic }