Control de errores con la clase ResponseStatusException

JPG:

Todos los controladores de mis proyectos se extienden desde un controlador de base que utiliza la @ExceptionHandleranotación. Ya que lo que estoy utilizando actualmente es un poco mayor que la nueva forma de asa excepciones que la primavera introdujo Estoy tratando de actualizar mi proyecto mediante la sustitución de mis ExceptionHandleranotaciones con el más reciente ResponseStatusExceptionclase.

¿Algún consejo sobre cómo hacerlo correctamente?

Pratik Malani:

Antes de profundizar en ResponseStatusException, vamos a tomar rápidamente un vistazo a la @ResponseStatus anotación. Esta anotación fue introducido en la primavera de 3 para aplicar el código de estado HTTP para una respuesta HTTP.

Podemos utilizar la anotación @ResponseStatus para establecer el estado y la razón en nuestra respuesta HTTP:

@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Actor Not Found")
public class ActorNotFoundException extends Exception {
    // ...
}

Si esta excepción se produce al procesar una petición HTTP, entonces la respuesta incluirá el estado HTTP especificado en esta anotación.

Una desventaja del enfoque @ResponseStatus es que crea estrecho acoplamiento con la excepción. En nuestro ejemplo, todas las excepciones de tipo ActorNotFoundException generarán el mismo mensaje de error y código de estado en la respuesta.

ResponseStatusException

ResponseStatusException es una alternativa programática para @ResponseStatus y es la clase base para excepciones utilizados para la aplicación de un código de estado a una respuesta HTTP. Es un RuntimeException y por lo tanto no se requiere para ser añadido de manera explícita en una firma de método.

Spring proporciona 3 constructores para generar ResponseStatusException:

ResponseStatusException(HttpStatus status)
ResponseStatusException(HttpStatus status, java.lang.String reason)
ResponseStatusException(
  HttpStatus status, 
  java.lang.String reason, 
  java.lang.Throwable cause
)

ResponseStatusException, argumentos del constructor:

  • estado - un conjunto de estado HTTP de respuesta HTTP
  • razón - un mensaje que explica el conjunto excepción de respuesta HTTP
  • causa - una causa Throwable del ResponseStatusException

Nota: en primavera, intercepta HandlerExceptionResolver y procesa cualquier excepción levantado y no se maneja por un controlador.

Uno de estos controladores, ResponseStatusExceptionResolver, busca cualquier ResponseStatusException o excepciones no capturadas con apuntes sobre la @ResponseStatus y luego extrae el código de estado HTTP y razón y los incluye en la respuesta HTTP.

Beneficios ResponseStatusException

el uso ResponseStatusException tiene algunas ventajas:

  • En primer lugar, las excepciones del mismo tipo se pueden procesar por separado y diferentes códigos de estado se pueden establecer en la respuesta, la reducción de estrecho acoplamiento
  • En segundo lugar, se evita la creación de clases de excepciones adicionales innecesarios
  • Finalmente, proporciona un mayor control sobre el manejo de excepciones, como las excepciones se pueden crear mediante programación

Spring 5 introdujo la clase ResponseStatusException. Podemos crear una instancia del mismo proporcionando una httpStatus y, opcionalmente, una razón y una causa:

@GetMapping("/actor/{id}")
public String getActorName(@PathVariable("id") int id) {
    try {
        return actorService.getActor(id);
    } catch (ActorNotFoundException ex) {
        throw new ResponseStatusException(
        HttpStatus.NOT_FOUND, "Actor Not Found", ex);
    }
}

¿Cuáles son los beneficios de usar ResponseStatusException?

  • Excelente para la creación de prototipos: Podemos implementar una solución básica bastante rápido
  • Un tipo, múltiples códigos de estado: Un tipo de excepción puede conducir a múltiples respuestas diferentes. Esto reduce estrecho acoplamiento en comparación con el @ExceptionHandler
  • No vamos a tener que crear tantas clases de excepción personalizada
  • Más control sobre el manejo de excepciones ya que las excepciones se pueden crear mediante programación

Y qué decir de las ventajas y desventajas?

  • No hay manera unificada de gestión de excepciones: Es más difícil hacer cumplir algunas convenciones en toda la aplicación, en lugar de @ControllerAdvice que proporciona un enfoque global
  • La duplicación de código: Podemos encontrarnos replicar código en varios controladores

También debemos señalar que es posible combinar diferentes enfoques dentro de una aplicación.

Por ejemplo, podemos implementar un @ControllerAdvice a nivel mundial, sino también ResponseStatusExceptions localmente. Sin embargo, hay que tener cuidado: si la misma excepción puede ser manejado en múltiples formas, se puede notar un comportamiento extraño. Una posible convención es manejar un tipo específico de excepción siempre de una manera.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=191995&siteId=1
Recomendado
Clasificación