给定一个休息控制器类
FizzBuzzController.java
,有一个GET
API端点需要修改,它可以抛出三种类型的运行时异常:
菲兹异常
嗡嗡声异常
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
}
请在下面找到 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;
}
希望对你有帮助。
如果我没说错的话,你不知道如何实现你的
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);
}
我希望我能帮助你,我的答案就是你所寻找的。
继续努力!