Spring REST добавляет поле к 404 резонансному коду - PullRequest
0 голосов
/ 31 мая 2018

Использование последней весенней загрузки по состоянию на май 2018 года. Я создал ответ 404. Подобно этому.

@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException {

    private final int errorId;

    public NotFoundException(String errorMsg) {
        super("-1," + errorMsg);
        this.errorId = -1;
    }

    public NotFoundException(int errorId, String errorMsg) {
        super(errorId + "," + errorMsg);
        this.errorId = errorId;
    }


    public int getErrorId() {
        return errorId;
    }
}

Аннотация @ResponseStatus (HttpStatus.NOT_FOUND) делает мое исключение NotFoundException похожим на ответ 404, подобный этому

{
    "timestamp":1527751944754,
    "status":404,
    "error":"Not Found",
    "exception":"com.myapp.exception.NotFoundException",
    "message":"1000,Could not find data for owner: 1234","path":"/resource/owner/1234"
}

Я надеялся, что свойство "getErrorId" появится в ответе автоматически, как это

{
    "timestamp":1527751944754,
    "status":404,
    "error":"Not Found",
    "exception":"com.myapp.exception.NotFoundException",
    "message":"Could not find data for owner: 1234","path":"/resource/owner/1234",
    "errorId": 1000
}

Является ли способ просто (как аннотация кметод getErrorId), имеющий свойство "errorId" в ответе?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Что бы ни говорил Byeon0gam, все в порядке, здесь я собираюсь показать другой способ, означающий небольшую разницу в поддержке кода.

Мы уже знаем, что мы можем обрабатывать исключения в весеннем отдыхе 4 способами:1. Использование класса ResponseEntity.2. Использование аннотации @ResponseStatus.3. Использование аннотации @ExceptionHandler ().4. Вернуть представление об ошибке вместо HTML-ошибки по умолчанию.

Используя их, мы можем обрабатывать исключения только на уровне метода или класса.Но, если вы хотите обрабатывать глобальные средства во всем приложении, выполните следующие шаги:

Обработка глобального исключения: Чтобы обработать все исключения в наших приложениях, сначала нам нужно создать класс, посленам нужно использовать аннотацию @ControllerAdvice поверх класса.В этом теле класса мы можем обрабатывать исключения, возникающие в нашем приложении.В этом классе мы создадим методы обработки исключений, поверх каждого метода мы будем использовать аннотацию @ExceptionHandler () для навигации по исключениям и для обработки.Если в нашем приложении возникает какое-либо исключение, на основании аргумента аннотации @ExceptionHandler («аргумент») будет вызван метод хедлинга исключений, а оставшийся код обработки будет выполнен.

@ControllerAdvice 
public class SpringRestGlobalExceptionHandler {
@ExceptionHandler(Exception.class) 
  public ResponseEntity<?> exceptionHandler(HttpServletRequest req, Exception e) 
  {
    JSONObject obj =new JSONObject();
    obj.put("msgTxt","Unknown Server Error, Please Contact Admin." );
    obj.put("reqUrl", req.getRequestURI());
    obj.put("stackTrace", e.toString());
    obj.put("isErrorFlag", true);
    obj.put("httpStatusCode", HttpStatus.OK.value());
    gstcDaoi.saveExceptionOrErrorLog(prepareTGstcExceptionOrErrorLogObject(obj));
     e.printStackTrace();

    return new ResponseEntity<>(obj, HttpStatus.OK);
  }
0 голосов
/ 31 мая 2018

Вы используете @ControllerAdvice и @ExceptionHanlder в Spring.это контроллер исключений.Фактически вы создадите пользовательский контроллер исключений и определите исключение.

Это пример кода для вас:

@ControllerAdvice("your.package")
public class CommonExceptionHandler {

    @ExceptionHandler(value = NoHandlerFoundException.class)
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public @ResponseBody ResponseEntity<?> setNotFoundException(Exception exception) throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();

        // this is sample map. you will make your custom model and you use exception parameter.
        Map<String, String> map = new HashMap<String, String>();
        map.put("timestamp", String.valueOf(new Date().getTime()));
        map.put("status", HttpStatus.NOT_FOUND.toString());
        map.put("error", "Not Found");
        map.put("exception", exception.getMessage());
        map.put("message", "Could not find data for owner: 1234");
        map.put("path", "/resource/owner/1234");
        map.put("errorId", "1000");

        String json = mapper.writeValueAsString(map);

        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(json);
    }

}
...