Estoy probando el marco de primavera. Tengo RestController y función:
@RequestMapping(value="/changePass", method=RequestMethod.POST) public Message changePassword(@RequestBody String id, @RequestBody String oldPass, @RequestBody String newPass){ int index = Integer.parseInt(id); System.out.println(id+" "+oldPass+" "+newPass); return userService.changePassword(index, oldPass, newPass); }
y código angularJS
$scope.changePass = function(){//changePass $scope.data = { id: $scope.userId, oldPass:$scope.currentPassword, newPass:$scope.newPassword } $http.post("http://localhost:8080/user/changePass/", $scope.data). success(function(data, status, headers, config){ if(date.state){ $scope.msg="Change password seccussful!"; } else { $scope.msg=date.msg; } }) .error(function(data, status, headers, config){ $scope.msg="TOO FAIL"; }); }
y cuando lo ejecuto.
Mensaje de error :
Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.csc.mfs.messages.Message com.csc.mfs.controller.UserController.changePassword(java.lang.String,java.lang.String,java.lang.String)
Ayúdame a arreglarlo, por favor...
El problema está en este código.
@RequestBody String id, @RequestBody String oldPass, @RequestBody String newPass
No puede tener varios
@RequestBody
en el mismo método, ya que solo puede vincularse a un solo objeto (el cuerpo solo se puede consumir una vez).
ENFOQUE 1:
El remedio a ese problema crea un objeto que capturará todos los datos relevantes y luego crea los objetos que tienes en los argumentos.
Una forma para usted es tenerlos todos incrustados en un solo JSON como se muestra a continuación
{id:"123", oldPass:"abc", newPass:"xyz"}
Y tenga su controlador como parámetro único como se muestra a continuación
public Message changePassword(@RequestBody String jsonStr){ JSONObject jObject = new JSONObject(jsonStr); ....... }
ENFOQUE 2:
Cree una implementación personalizada propia para ArgumentResolver
No puede tener un cuerpo de solicitud para el método GET. Si desea pasar el nombre de usuario y la contraseña como parte del cuerpo de la solicitud, cambie el tipo RequestMethod a POST/PUT.
Si desea usar GET solo, deberá pasar el nombre de usuario y la contraseña como variables de ruta o como parámetros de solicitud/consulta, lo cual no es una buena práctica.
Recomendaría cambiar RequestMethod y pasar el nombre de usuario y la contraseña como cuerpo de la solicitud.