实现控制器建议全局异常处理程序,拦截运行时异常

问题描述 投票:0回答:2

给定一个休息控制器类

FizzBuzzController.java
,有一个
GET
API端点需要修改,它可以抛出三种类型的运行时异常:

  1. 菲兹异常

  2. 嗡嗡声异常

  3. FizzBuzzException

下面是具有单个路径参数的

GET
API 端点的端点。

GET /controller_advice/{code}

将根据传递给其余 API 的路径参数

{code}
的值抛出异常。

以下是一系列请求及其相应的预期响应:

GET /controller_advice/fizz

响应代码:500

响应正文:


{

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

"errorReason" : "Internal Server Error"

}

GET /controller_advice/buzz

响应代码:400

响应正文:


{

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

"errorReason" : "Bad Request"

}

GET /controller_advice/fizzbuzz

响应代码:507

响应正文:


{

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

"errorReason" : "Insufficient Storage"

}

GET /controller_advice/success

响应代码:200

响应正文:


{

"message": "Successfully completed fizzbuzz test",

"statusCode": "200"

}

您的任务是完成给定的项目,以便在运行提供的单元测试时通过所有测试用例。

为此,您必须实现控制器建议全局异常处理程序,拦截从 GET API 端点抛出的运行时异常,并返回包装在

GlobalError.java
类中的响应实体。

项目中已经预定义了运行时异常和错误响应类。您只需完成实现

controller
GET API 端点和
controller advice
类。

命令

  • 运行:

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

  • 安装:

mvn clean install

  • 测试:

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.java

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

}
java spring-boot rest exception
2个回答
0
投票

请在下面找到 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;
}

希望对你有帮助。


0
投票

如果我没说错的话,你不知道如何实现你的

ResControllerAdvice
课程。

您应该这样做:

@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);
}

我希望我能帮助你,我的答案就是你所寻找的。

继续努力!

© www.soinside.com 2019 - 2024. All rights reserved.