JSON Пользовательский ответ во всех моих REST API, может я не знаю, как он называется? - PullRequest
0 голосов
/ 13 мая 2019

Таким образом, проблема заключается в следующем: для всех моих конечных точек REST API в моем теле RESPONSE всегда должно быть 3 поля, например, для:

{ "status": "SUCCESS", "message": "A list of a recent post", "data" : [LIST OF POSTS] }

или

{ "status" : "NOT_AUTHORIZED", "message": "User does not have previledge to access this resource", "errors": ["User does not have Admin access"] }

Итак, вы можете понять, я хочу, чтобы это сообщение об ошибке состояния или поле данных присутствовало во всех ответах в моем REST API.

Ответы [ 3 ]

2 голосов
/ 13 мая 2019

Это может быть достигнуто с помощью ResponseBodyAdvice:

Позволяет настроить ответ после выполнения метода контроллера @ResponseBody или ResponseEntity, но дотело написано с помощью HttpMessageConverter.

Реализации могут быть зарегистрированы непосредственно с помощью RequestMappingHandlerAdapter и ExceptionHandlerExceptionResolver или, что более вероятно, аннотировано с помощью @ControllerAdvice, и в этом случае они будут автоматически обнаружены обоими.

Таким образом, у вас может быть что-то вроде:

@ControllerAdvice
public class MyResponseBodyAdvisor implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType,
                            Class<? extends HttpMessageConverter<?>> converterType) {

        return converterType.isAssignableFrom(MappingJackson2HttpMessageConverter.class);
    }

    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {

        MyResponseWrapper wrapper = new MyResponseWrapper();
        wrapper.setData(body);
        return wrapper;
    }
}

Где MyResponseWrapper - ваш класс, используемый для переноса полезной нагрузки ответа.

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

Вы можете использовать ResponseBodyAdvice<T> для глобального перехвата ответа POJO перед его маршалингом в JSON, но это, кажется, не подходит, поскольку каждый ваш метод REST должен генерировать отдельные сообщения на основе функциональности метода,Кроме того, это в любом случае заставит вас использовать некоторый класс-оболочку для ответов.

Итак, я полагаю, лучше обернуть данные (вместе со статусом и сообщением) в ответ вручную в каждом методе

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

Вы можете добавить фильтр в свой проект и добавить их в ответы перед отправкой ответа.

Следуйте https://stackoverflow.com/a/41825563/4597596, чтобы создать фильтр.

...