java: implementa un controlador de excepciones global de asesoramiento de controlador, intercepta las excepciones de tiempo de e

CorePress2024-01-24  16

Dada una clase de controlador de descanso FizzBuzzController.java, hay un punto final de API GET que se debe modificar, lo que puede generar tres tipos de excepciones de tiempo de ejecución:

Excepción Fizz

Excepción de zumbido

Excepción FizzBuzz

A continuación se muestra el punto final para el punto final de GET API con un único parámetro de ruta.

OBTENER /controller_advice/{código}

Las excepciones se deben lanzar según el valor del parámetro de ruta {código} pasado al resto de la API.

A continuación se muestran una serie de solicitudes y sus correspondientes respuestas esperadas:

OBTENER /controller_advice/fizz:

Código de respuesta: 500

Cuerpo de la respuesta:


{

"message": "Fizz Exception has been thrown",

"errorReason" : "Internal Server Error"

}

OBTENER /controller_advice/buzz:

Código de respuesta: 400

Cuerpo de la respuesta:


{

"message": "Buzz Exception has been thrown",

"errorReason" : "Bad Request"

}

OBTENER /controller_advice/fizzbuzz:

Código de respuesta: 507

Cuerpo de la respuesta:


{

"message": "FizzBuzz Exception has been thrown",

"errorReason" : "Insufficient Storage"

}

OBTENER /controller_advice/success:

Código de respuesta: 200

Cuerpo de la respuesta:


{

"message": "Successfully completed fizzbuzz test",

"statusCode": "200"

}

Su tarea es completar el proyecto dado para que pase todos los casos de prueba al ejecutar las pruebas unitarias proporcionadas.

Para eso, debe implementar un controlador de excepciones global de asesoramiento de controlador, interceptar las excepciones de tiempo de ejecución lanzadas desde el punto final de GET API y devolver una entidad de respuesta incluida en la clase GlobalError.java.

Las excepciones de tiempo de ejecución y las clases de respuesta de error ya están predefinidas en el proyecto. Sólo necesita completar la implementación del punto final GET API del controlador y las clases de asesoramiento del controlador.

Comandos correr:

mvn clean package; java -jar target/RestControllerAdvice-1.0.jar

instalar:

mvn clean install

prueba:

mvn clean test

ChallengeApplication.java

package com.hackerrank.restcontrolleradvice;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class ChallengeApplication {

  public static void main(String[] args) {

  SpringApplication.run(ChallengeApplication.class, args);

  }

}

FizzBuzzController.javun

package com.hackerrank.restcontrolleradvice.controller;

import com.hackerrank.restcontrolleradvice.dto.BuzzException;

import com.hackerrank.restcontrolleradvice.dto.FizzBuzzException;

import com.hackerrank.restcontrolleradvice.dto.FizzBuzzResponse;

import com.hackerrank.restcontrolleradvice.dto.FizzException;

import com.hackerrank.restcontrolleradvice.enums.FizzBuzzEnum;

import org.springframework.http.MediaType;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class FizzBuzzController {

@RequestMapping(value = "/controller_advice/{code}", method = 
RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)

public ResponseEntity<FizzBuzzResponse> getFizzBuzzResponse(@PathVariable("code") String code)

throws FizzException, BuzzException, FizzBuzzException {

if (FizzBuzzEnum.FIZZ.getValue().equals(code)) {

//throw new FizzException

} else if (FizzBuzzEnum.BUZZ.getValue().equals(code)) {

//throw new BuzzException

} else if (FizzBuzzEnum.FIZZBUZZ.getValue().equals(code)) {

//throw new FizzBuzzException

}

//return FizzBuzzResponse

return null;

}

}

BuzzException.java

package com.hackerrank.restcontrolleradvice.dto;

public class BuzzException extends RuntimeException {

private final String message;

private final String errorReason;

public BuzzException(String message, String errorReason) {

this.message = message;

this.errorReason = errorReason;

}

public BuzzException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String errorReason) {

super(message, cause, enableSuppression, writableStackTrace);

this.message = message1;

this.errorReason = errorReason;

}

@Override

public String getMessage() {

return message;

}

public String getErrorReason() {

return errorReason;

}

}

FizzBuzzException.java

package com.hackerrank.restcontrolleradvice.dto;

public class FizzBuzzException extends RuntimeException {

private final String message;

private final String errorReason;

public FizzBuzzException(String message, String errorReason) {

this.message = message;

this.errorReason = errorReason;

}

public FizzBuzzException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String errorReason) {

super(message, cause, enableSuppression, writableStackTrace);

this.message = message1;

this.errorReason = errorReason;

}

@Override

public String getMessage() {

return message;

}

public String getErrorReason() {

return errorReason;

}

}

FizzbuzzzResponse.java

package com.hackerrank.restcontrolleradvice.dto;

public class FizzBuzzResponse {

private String message;

private int statusCode;

public FizzBuzzResponse(String message, int statusCode) {

this.message = message;

this.statusCode = statusCode;

}

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

public int getStatusCode() {

return statusCode;

}

public void setStatusCode(int statusCode) {

this.statusCode = statusCode;

}

}

FizzException.java

package com.hackerrank.restcontrolleradvice.dto;

public class FizzException extends RuntimeException {

private final String message;

private final String errorReason;

public FizzException(String message, String errorReason) {

this.message = message;

this.errorReason = errorReason;

}

public FizzException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String errorReason) {

super(message, cause, enableSuppression, writableStackTrace);

this.message = message1;

this.errorReason = errorReason;

}

@Override

public String getMessage() {

return message;

}

public String getErrorReason() {

return errorReason;

}

}

GlobalError.java

package com.hackerrank.restcontrolleradvice.dto;

public class GlobalError {

private String message;

private String errorReason;

public GlobalError() {

}

public GlobalError(String message, String errorReason) {

this.message = message;

this.errorReason = errorReason;

}

public void setMessage(String message) {

this.message = message;

}

public void setErrorReason(String errorReason) {

this.errorReason = errorReason;

}

public String getMessage() {

return message;

}

public String getErrorReason() {

return errorReason;

}

}
package com.hackerrank.restcontrolleradvice.enums;

public enum FizzBuzzEnum {

FIZZ("fizz"),

BUZZ("buzz"),

FIZZBUZZ("fizzbuzz");

private final String value;

private FizzBuzzEnum(String value) {

this.value = value;

}

public String getValue() {

return value;

}

public static FizzBuzzEnum getStatus(String value) {

switch (value) {

case "Fizz":

return FizzBuzzEnum.FIZZ;

case "Buzz":

return FizzBuzzEnum.BUZZ;

case "FizzBuzz":

return FizzBuzzEnum.FIZZBUZZ;

default:

return null;

}

}

}
package com.hackerrank.restcontrolleradvice.exception;

import org.springframework.web.bind.annotation.RestControllerAdvice;

import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@RestControllerAdvice

public class FizzBuzzExceptionHandler extends ResponseEntityExceptionHandler {

//TODO:: implement handler methods for FizzException, BuzzException and FizzBuzzException

}

1

¡Bienvenido a Stackoverflow! Si sangra su código correctamente, será más fácil de leer. Gracias.

- Kaj Hejer

27/03/2021 a las 19:22

Además, parece que pegaste alguna tarea tal como está, no dice qué lo intentaste y qué no funcionó y ya tienes consejos del controlador en tu código.

-code_mechanic

28 de marzo de 2021 a las 4:11



------------------------------------

Si entendí bien, no sabes cómo implementar tu clase ResControllerAdvice. Así es como debes hacerlo:

@ExceptionHandler(FizzException.class)
public final ResponseEntity<Object> handleFizzException(Exception ex, WebRequest request) {
    ExceptionResponse eR = new ExceptionResponse(ex.getMessage(), request.getDescription(false), ex.getClass());
    return new ResponseEntity<>(eR, HttpStatus.INTERNAL_SERVER_ERROR);
}

@ExceptionHandler(BuzzException.class)
public final ResponseEntity<Object> handleBuzzException(Exception ex, WebRequest request) {
    ExceptionResponse eR = new ExceptionResponse(ex.getMessage(), request.getDescription(false), ex.getClass());
    return new ResponseEntity<>(eR, HttpStatus.BAD_REQUEST);
}

@ExceptionHandler(FizzBuzzException.class)
public final ResponseEntity<Object> handleFizzBuzzException(Exception ex, WebRequest request) {
    ExceptionResponse eR = new ExceptionResponse(ex.getMessage(), request.getDescription(false), ex.getClass());
    return new ResponseEntity<>(eR, HttpStatus.INSUFFICIENT_STORAGE);
}

Espero poder ayudarte y mi respuesta es lo que buscabas. ¡Sigue con tu gran trabajo!



------------------------------------

A continuación encontrará la implementación de su clase RestControllerAdvice.

@ExceptionHandler(FizzException.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public @ResponseBody GlobalError handleFizzException(final FizzException exception,
        final HttpServletRequest request) {

    GlobalError error = new GlobalError();
    error.setMessage(exception.getMessage());
    error.setErrorReason(exception.getErrorReason());
    return error;
}

@ExceptionHandler(BuzzException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public @ResponseBody GlobalError handleBuzzException(final BuzzException exception,
        final HttpServletRequest request) {

    GlobalError error = new GlobalError();
    error.setMessage(exception.getMessage());
    error.setErrorReason(exception.getErrorReason());
    return error;
}

@ExceptionHandler(FizzBuzzException.class)
@ResponseStatus(value = HttpStatus.INSUFFICIENT_STORAGE)
public @ResponseBody GlobalError handleFizzBuzzException(final FizzBuzzException exception,
        final HttpServletRequest request) {

    GlobalError error = new GlobalError();
    error.setMessage(exception.getMessage());
    error.setErrorReason(exception.getErrorReason());
    return error;
}

Espero que te sea útil.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare