Spring boot add error сообщение об ошибке для ответа без выдачи исключения, но с сохранением напечатанного ответа - PullRequest
0 голосов
/ 07 мая 2019

Мои конечные точки REST возвращают ResponseEntity<SomeDto> или только SomeDto.Из этого я генерирую чванство, которое будет поглощено внешним интерфейсом.Конечно, информация о типе SomeDto имеет решающее значение.

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

Возвращение ResponseEntity.badRequest().build() в таких случаях работает нормально, но я хочу добавить сообщение об ошибке в тело.Но добавление String к телу невозможно в отношении ResponseEntity<SomeDto>.

Вопрос Как добавить сообщение об ошибке при сохранении подписи / контракта без необходимости повышенияисключение (см. «Эффективное Java, 3-е издание -« Элемент 69: Использовать исключения только для исключительных условий »)?

Один (плохой) способ, который я вижу, - добавить поле сообщения об ошибке ко всем моим dtos (может бытьуказывается интерфейсом).

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Либо использовать ResponseEntity.badRequest().body(xxx).build(), либо выбрасывать исключение - это нормально, как только контракт остается прежним.

Вы используете библиотеку для создания документа Swagger (такого как Springfox)? Ну, это хорошо для некоторых ситуаций, но не может творить чудеса. Генерация документации не должна влиять на то, как вы пишете свой код. В таком случае @ApiResponse - это то, что вам нужно.

1 голос
/ 07 мая 2019

Вам не нужно добавлять модель ошибки к отдельному объекту, вместо этого расширять модель Response из базового класса, для которого определено определение ошибки, так я бы ее реализовал.

static abstract class ApiResponse {
        enum Status {
            SUCCESS,
            FAILURE,
        }

        @Getter
        @Setter

        private Status status;
        @Getter
        @Setter
        private String errorMessage;

    }

    class NamesDto extends ApiResponse {
        @Setter
        @Getter
        String[] names;
    }

    @GetMapping(value = "namesdto")
    public ResponseEntity<ApiResponse> getNames() {
        final NamesDto namesDto = new NamesDto();
        namesDto.setStatus(ApiResponse.Status.FAILURE);
        namesDto.names = new String[]{"john", "doe"};
        return ResponseEntity.ok(namesDto);
    }


    @GetMapping(value = "errordto")
    public ResponseEntity<ApiResponse> erroDto() {
        final NamesDto namesDto = new NamesDto();
        namesDto.setErrorMessage("No names found");
        namesDto.setStatus(ApiResponse.Status.FAILURE);
        return ResponseEntity.ok(namesDto);
    }

@Getter/@Setter - это импортиз import lombok.* упаковки

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