Recibo el error ""El parámetro de búsqueda de nombre de usuario requerido 'nombre de usuario' no está presente" al enviar datos usando ajax con Spring y Thymeleaf. Mi secuencia de comandos es como se muestra a continuación
<script> $(document).ready(function() { $("#opusername").keyup(function() { var username = $('#opusername').text(); $.ajax({ type : "POST", contentType : "application/json", url : "/create/check-username-availability", data : {"username" : username}, dataType : 'json', timeout : 100000, success : function(data) { console.log("SUCCESS: ", data); }, error : function(e) { console.log("ERROR: ", e); }, done : function(e) { console.log("DONE"); } }); }); });Mi controlador tiene este método que debería recibir la cadena y devolver un valor para indicar si el nombre de usuario está disponible o no.
@RequestMapping(value = "/create/check-username-availability", method = RequestMethod.POST) @ResponseBody public String checkUsernameAvailability(@RequestParam("username") UsernameSearch username) { logger.info("Checking username availability for username = " + username.getUsername()); return "true"; }Este es el objeto que creo que contiene el nombre de usuario String. Hice esto después de seguir los tutoriales y las respuestas aquí, pero nada parece funcionar.
búsqueda de nombre de usuario de clase pública {
String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }}
Este es el error al depurar
error:"Bad Request" exception:"org.springframework.web.bind.MissingServletRequestParameterException"mensaje: "El parámetro de búsqueda de nombre de usuario requerido 'nombre de usuario' no está presente" ruta: "/ crear/verificar disponibilidad de nombre de usuario" estado: 400 marca de tiempo: 1489942516434
También quería preguntar cómo consumir el resultado del método de primavera. ¿Es posible obtener un valor booleano?
Cambie @RequestParam a @RequestBody. Request param != cuerpo de la solicitud.
El error HTTP 400 significa que la solicitud tiene un formato incorrecto. En su caso, el controlador espera que la URL tenga un parámetro de "nombre de usuario". Por lo tanto, puede cambiar la llamada ajax para enviar el nombre de usuario como parámetro de solicitud, es decir, adjuntando "? nombre de usuario = fooBar" a la URL que está realizando la solicitud POST y cambiar la firma del método del controlador para aceptar @RequestParam ("nombre de usuario" ) String nombre de usuario, o cambie la anotación en el parámetro del controlador a @RequestBody, que le dice al controlador que los datos se enviarán como un objeto en el cuerpo de la solicitud.
función ajax:
var data = { username: $('#opusername').text() }; $.ajax({ type: "POST", contentType: 'application/json; charset=utf-8', dataType: 'json', url: "/create/check-username-availability", data: JSON.stringify(data), // Note it is important success: function (result) { // do whatever you want with data } });y en tu método java
@RequestMapping(value = "/create/check-username-availability", method = RequestMethod.POST) @ResponseBody public String checkUsernameAvailability(@RequestBody UsernameSearch username) { logger.info("Checking username availability for username = " + username.getUsername()); return "true"; }¡No envíe sus datos como cadena! Haz lo siguiente:
data : {"username" : username},