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 Hejer27/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_mechanic28 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.