Necesito tener mi propio cuerpo de la respuesta de error cuando algo va mal con mi solicitud y estoy tratando de utilizar el @NotEmpty
atributo del mensaje limitación para devolver el mensaje de error,
Esta es mi clase que devuelve el mensaje de error utilizando el cuerpo que necesito:
package c.m.nanicolina.exceptions;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
@ControllerAdvice
public class CustomResponseEntityExceptionHandler {
@ExceptionHandler(value = {MissingServletRequestParameterException.class})
public ResponseEntity<ApiError> handleConflict(MissingServletRequestParameterException ex, WebRequest request) {
ApiError apiError = new ApiError(ex.getMessage(), ex.getMessage(), 1000);
return new ResponseEntity<ApiError>(apiError, null, HttpStatus.BAD_REQUEST);
}
}
Con esto CustomResponseEntityExceptionHandler
puedo volver a mi propio cuerpo de la respuesta en caso de errores de validación.
Lo que estoy tratando ahora es conseguir que el mensaje de las restricciones de validación.
Este es mi controlador con la NotEmpty
restricción:
package c.m.nanicolina.controllers;
import c.m.nanicolina.models.Product;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotEmpty;
@RestController
public class MinimumStockController {
@RequestMapping(value = "/minimumstock")
public Product product(
@RequestParam(value = "product.sku") @NotEmpty(message = "Product.sku cannot be empty") String sku,
@RequestParam(value = "stock.branch.id") String branchID) {
return null;
}
}
En mi excepción, no puedo encontrar una manera de conseguir ese mensaje Product.sku cannot be empty
y mostrarlo en mi respuesta de error.
También he comprobado la clase MissingServletRequestParameterException
y no es el método getMessage
que se devuelve el mensaje predeterminado.
Sí es factible y primavera muy bien lo soporta. Usted se acaba perdiendo alguna configuración que le permita en primavera.
- Uso de Primavera
@Validated
de anotación para permitir la primavera hasta el controlador de validación- Manija
ConstraintViolationException
en suControllerAdvice
para coger todos los mensajes de validación fallidos.- Marcos
required=false
en@RequestParam
, por lo que no va a tirar MissingServletRequestParameterException y más bien pasar a la siguiente etapa de validación restringida.
@ControllerAdvice
public class CustomResponseEntityExceptionHandler {
@ExceptionHandler
public ResponseEntity<ApiError> handle(ConstraintViolationException exception) {
//you will get all javax failed validation, can be more than one
//so you can return the set of error messages or just the first message
String errorMessage = new ArrayList<>(exception.getConstraintViolations()).get(0).getMessage();
ApiError apiError = new ApiError(errorMessage, errorMessage, 1000);
return new ResponseEntity<ApiError>(apiError, null, HttpStatus.BAD_REQUEST);
}
}
@RestController
@Validated
public class MinimumStockController {
@RequestMapping(value = "/minimumstock")
public Product product(
@RequestParam(value = "product.sku", required=false) @NotEmpty(message = "Product.sku cannot be empty") String sku,
@RequestParam(value = "stock.branch.id", required=false) String branchID) {
return null;
}
}
NOTA: MissingServletRequestParameterException
no tendrá acceso a los mensajes de validación javax, ya que es lanzada antes de que ocurra validación restringida en la solicitud de ciclo de vida.