Как получить специальную ошибку вместо внутренней ошибки службы - PullRequest
0 голосов
/ 23 января 2019

Я получаю Внутреннюю ошибку сервера на почтальоне, даже если выбрасываю пользовательское исключение из своего исключения кода. Я хочу видеть исключение, имеющее действительное сообщение об ошибке и код ошибки, которые я выкидываю. Будет очень полезно, если кто-нибудь из вас сможет мне помочь в этом вопросе. Как то, как я могу получить лучшее сообщение об ошибке. Добавление ниже кода оснастки. Заранее спасибо

    @Service
public class FetchActionImpl implements FetchAction {

    private static Logger log = LoggerFactory.getLogger(FetchActionImpl.class);

    @Autowired
    FetchActionServiceImpl fetchActionService;// = new FetchActionServiceImpl();

    @Override
    public FetchResponse fetchActionRequest(String caseId) throws BBWException,Exception{
        //String resp ="";
        log.info("fetchaction Request: {}",ApplicationConstants.LOG_ENTRY_MESSAGE);
        log.info("The caseId received from BRASS:\n {}",caseId);
        FetchResponse resp = null;
        try{
            if(true) {
                throw new BBWException("500","Test");
                }
            resp = fetchActionService.fetchIt(caseId);

            log.debug("fetchaction Response: {}",resp.toString());

        } 
        catch (BBWException be) {
            throw be;
        }
        catch (Exception e) {
            throw new BBWException("500",e.getMessage());
        }
        return resp;
        }

}


@Api
@Path("/fetch_service")
public interface FetchAction {

    @GET
    @Path("/fetchaction/caseid/{caseid}")
    @Produces({MediaType.APPLICATION_JSON})
    //@Consumes({MediaType.TEXT_XML})
    @ApiOperation(
            value = "Respond BRASS Request",
            notes = "Returns a XML object "                 
    )
    @ApiResponses(
            value = {
                    @ApiResponse(code = 404, message = "Service not available"),
                    @ApiResponse(code = 500, message = "Unexpected Runtime error")
                    })
    public FetchResponse fetchActionRequest(@PathParam("caseid") String caseid) throws BBWException, Exception;

}`

    public class BBWException extends Exception {

            private static final long serialVersionUID = -7987978270260338068L;

            private String errorCode;
            private String errorMessage;

            public BBWException(String errorCode, String errorMessage) {
                super(errorMessage);
                this.errorCode = errorCode;
                this.errorMessage = errorMessage;
            }

            public String getErrorCode() {
                return errorCode;
            }


            public void setErrorCode(String errorCode) {
                this.errorCode = errorCode;
            }


            public String getErrorMessage() {
                return errorMessage;
            }
        public void setErrorMessage(String errorMessage) {
            this.errorMessage = errorMessage;
        }

        @Override
        public String toString() {

            return (this.errorCode + " " + this.errorMessage);
        }

}

1 Ответ

0 голосов
/ 23 января 2019

Каждый раз, когда генерируется исключение (uncaught), SpringBoot возвращает Http-500 Internal Server Error. В Spring есть много способов обработки исключений.

Допустим, у меня есть контроллер, и я неявно выкидываю исключение.

@RestController
public class HelloWorldController {

    @GetMapping("/hello-world")
    public String helloWorld() {
        throw new MyCustomException("I just can't say hello!");
    }
}

Он такой же, как ваш - вы можете указать что угодно в исключении.

First:

Один из способов справиться с этим - создать класс с аннотацией @ControllerAdvice.

@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(MyCustomException.class)
    public ResponseEntity<String> handlyMyCustomException(MyCustomException e) {
        logger.error("error occurred {}", e);
        return new ResponseEntity<>("Something happened: " + e.getMessage(), HttpStatus.I_AM_A_TEAPOT);
    }
}

Таким образом, вы можете перехватить исключение по вашему выбору (глобально) и вернуть сообщение с состоянием ответа HTTP по вашему выбору, а не обязательно I_AM_A_TEAPOT

Второй:

    @ExceptionHandler(MyCustomException.class)
        public ResponseEntity<String> handlyMyCustomException(MyCustomException e) {
            logger.error("error occurred {}", e);
            return new ResponseEntity<>("Something happened: " + e.getMessage(), HttpStatus.I_AM_A_TEAPOT);
        }

Вы также можете создать только метод, помеченный @ExceptionHandler в вашем классе контроллера - но это не глобально и будет работать только для этого точного вызова контроллера.

Результат ниже:

That's the result

Третье:

Другой способ справиться с исключениями - создать собственные файлы ошибок .html. Если вы поместите файл в resources/static/error/500.html, он должен быть возвращен при выдаче Http-500 Internal Server Error.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...