Spring Boot Rest API - Неизвестное поле - Настройка сообщения об ошибке

У нас есть api rest на основе весенней загрузки, который принимает HTTP-запросы от нескольких потребителей в json. Он не может принимать запросы с неизвестными полями и должен дать ответ, в котором говорится, что это неправильный запрос, и содержательно описать ошибку. Однако из соображений безопасности нам нужно только предоставить им достаточно информации об ошибке.

Вот что у нас есть на данный момент:

Вот что мы сделали для этого:

В файле свойств приложения указано следующее:
. spring.jackson.deserialization.fail-on-unknown-properties=true

Обработка исключений была настроена следующим образом (другие функции для краткости опущены):

@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    Logger logger = LoggerFactory.getLogger(RestExceptionHandler.class);

    @Override
    public ResponseEntity<Object> handleHttpMessageNotReadable(
            HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {

        //this message can't give them info about known properties
        exceptionMessage = ex.getLocalizedMessage();
        logger.debug("exceptionMessage: " + ex.getLocalizedMessage());

        //ApiError is a custom object to encapsulate the information to be sent in the api response.
        ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, "HTTP message not readable", exceptionMessage);
        apiError.setHttpStatus(HttpStatus.BAD_REQUEST);
        apiError.setErrorMessage(errorMessage);

        return new ResponseEntity<Object>(apiError, new HttpHeaders(), apiError.getHttpStatus());
    }
}

Запрос json, содержащий unknown-field, приведет к следующему исключению:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "unknown-field" (class mypackage.MyDomain), not marked as ignorable (2 known properties: "known-field-1", "known-field-2"])

Мы не хотим раскрывать подробности об известных свойствах из соображений безопасности (2 known properties: "known-field-1", "known-field-2"]).

Тело запроса:

{"known-field-1": 1, "unknown-field": 2}

Фактическое тело ответа:

{"status":"BAD_REQUEST","message":"HTTP message not readable","errors":[Unrecognized field "unknown-field" (class mypackage.MyDomain), not marked as ignorable (2 known properties: "known-field-1", "known-field-2"]}

Желаемое тело ответа:

{"status":"BAD_REQUEST","message":"HTTP message not readable","errors":["Unknown field: unknown-field"]}

Как легко это настроить?

Можете ли вы добавить свой текущий ответ и ожидаемый ответ?

Maruthi Adithya 16.10.2018 17:35

в вашем объекте ApiError не отправляйте exceptionMessage, поскольку это фактическое сообщение об ошибке. вместо этого отправьте пользовательскую строку сообщения об ошибке, например, что-то вроде «В запросе есть неизвестные свойства, пожалуйста, проверьте контракт API для получения подробной информации»

kj007 16.10.2018 18:06

Спасибо, что изучили это. В конце концов, это было не так уж сложно.

code4kix 16.10.2018 19:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
3
1 248
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это решило это:

@Override
public ResponseEntity<Object> handleHttpMessageNotReadable(
        HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {

    String exceptionMessage = null;

    Throwable rootCause = ex.getRootCause();
    if (rootCause instanceof UnrecognizedPropertyException)
    {
        exceptionMessage = "Unknown field: " + ((UnrecognizedPropertyException) rootCause).getPropertyName();
        logger.debug("exceptionMessage: " + exceptionMessage);
    }

    ApiError apiError = 
      new ApiError(HttpStatus.BAD_REQUEST, "HTTP message not readable", exceptionMessage);

    return new ResponseEntity<Object>(apiError, new HttpHeaders(), apiError.getStatus());
}

Другие вопросы по теме