У нас есть 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"]}
Как легко это настроить?
в вашем объекте ApiError не отправляйте exceptionMessage, поскольку это фактическое сообщение об ошибке. вместо этого отправьте пользовательскую строку сообщения об ошибке, например, что-то вроде «В запросе есть неизвестные свойства, пожалуйста, проверьте контракт API для получения подробной информации»
Спасибо, что изучили это. В конце концов, это было не так уж сложно.




Это решило это:
@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());
}
Можете ли вы добавить свой текущий ответ и ожидаемый ответ?