Как сохранить исключение Сообщение в конвертере моделей - PullRequest
0 голосов
/ 18 сентября 2018

Я использую ModelMapper и там я определяю некоторые PostConverters как:

    modelMapper
            .createTypeMap(TestDTO.class, Test.class)
            .setPostConverter(converter -> {
                Test dest = converter.getDestination();
                TestDTO source = converter.getSource();
                if (source.getDependency() != null) {
                    Dependency dependency = dependencyRepository
                            .findById(source.getDependency().getId())
                            .orElseThrow(() -> new BadRequestException("Invalid Dependency"));
                    dest.setDependency(dependency);
                }
                return dest;
            });

Проблема с этим кодом заключается в том, что, если я добавлю недопустимый идентификатор для зависимости, то получу полезную нагрузку ответа, такую ​​как:

{
    "timestamp": "2018-09-18T13:51:05.203+0200",
    "status": 400,
    "error": "Bad Request",
    "message": "ModelMapper mapping errors:\n\n1) Converter ....",
    "path": "/api/test"
}

Но я хочу, чтобы в сообщении об ошибке я получил Invalid Dependency.Любая идея, как это сделать?

Вот определение исключения BadRequestException:

@ResponseStatus(HttpStatus.BAD_REQUEST)
public class BadRequestException extends RunTimeException {

    public BadRequestException() {
        super("Bad Request");
    }

    public BadRequestException(String message) {
        super(message);
    }

    public BadRequestException(String pattern, Object... parameters) {
        super(pattern, parameters);
    }
}

1 Ответ

0 голосов
/ 18 сентября 2018

Ошибка, по-видимому, связана с обработкой исключений с помощью аннотации, см. Здесь:
https://docs.spring.io/spring/docs/4.2.4.RELEASE/javadoc-api/org/springframework/web/bind/annotation/ResponseStatus.html

В нем говорится:
"Предупреждение: при использовании этой аннотации в классе исключений илипри установке атрибута причины этой аннотации будет использоваться метод HttpServletResponse.sendError. "Похоже, что метод не использует ваше сообщение об исключении по умолчанию.Таким образом, вы можете либо попытаться определить «жестко закодированное» сообщение и указать конкретную строку с помощью

 @ResponseStatus(value = HttpStatus.BadRequest, reason = "Invalid Dependency")

, либо сделать это следующим образом:

public class BadRequestException extends RunTimeException {

public BadRequestException() {
    super("Bad Request");
}

public BadRequestException(String message) {
    super(message);
}

public BadRequestException(String pattern, Object... parameters) {
    super(pattern, parameters);
}

}

@ControllerAdvice
public class CustomExceptionResolver {

    @ExceptionHandler(BadRequestException.class)
    public ResponseEntity<Error> resolveAndSendException(BadRequestException e) throws IOException {
        return new ResponseEntity<Error>(e, HttpStatus.BadRequest); 
    }
}

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

...