Один класс сущностей с двумя контроллерами (@RestController и @Controller) - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать веб-приложение, которое обрабатывает как @RestController, так и @Controller. Насколько я понимаю, @RestController для тестирования API с использованием почтальона для обработки процессов crud, с другой стороны, @Controller - для обработки crud в представлении модели. Можно ли создать оба этих контроллера для одного класса сущности в загрузочном приложении Spring и заставить их оба вызывать один и тот же метод из класса обслуживания, который обрабатывает logi c реализации crud? Пожалуйста, предоставьте пример вашего объяснения с классом сущности и обоими контроллерами, чтобы прояснить идею для меня.

Ответы [ 3 ]

1 голос
/ 27 марта 2020

Подход, который я бы использовал, заключается в том, чтобы использовать @Controller на уровне класса, а затем использовать @RequestBody + Content-type в качестве «application / json» на уровне метода для тестирования API из Postman.

И для представления модели не будет использоваться @RequestBody, указывать Content-type как «text / html» и возвращать страницу из метода.

Примеры фрагментов кода:

Для тестирования API:

@RequestMapping(value="/orders", method=RequestMethod.GET, produces="application/json")
@ResponseBody
public List<Order> getOrders {
    return orderManager.getAllOrders();
}

Для модели:

@RequestMapping(value="/accounts", method=RequestMethod.GET,produces="text/html")
public String accountSummary() {
    // Put data into model and return view name
    return "summary";
}
1 голос
/ 27 марта 2020
  1. RestController - это метааннотация аннотации Controller и ResponseBody. Аннотация была куплена в версии Spring 4.0, которая помогает вам разрабатывать контроллеры, чей ответ не является ModelandView, но вместо этого возвращаемое значение представляет собой необработанные данные в форме JSON / XML (существуют другие типы MediaType, которые можно определить с помощью создает и использует параметр @RequestMapping)
  2. Когда вы определяете контроллер, сервлет диспетчера обращается к ViewResolver, чтобы разрешить возвращенную строку в представлении / странице. В случае @RestController сервлет диспетчера использует HttpMessageConverters для отправки необработанного ответа клиенту в формате запроса - json / xml.
  3. Так что REST API - это конечная точка, которая помогает вам выставлять свои ресурсы по сети для другой услуги потреблять; Spring помогает вам писать REST API, используя классы @RestController. Если вы работаете над веб-приложением с jsp / thymeleaf в качестве движка рендеринга для взаимодействия человека с приложением, вы будете работать с @ Controller.

Итак, что вы написали:

@ RestContrller для тестирования API с использованием почтальона для обработки процессов crud, с другой стороны, @Controller для обработки crud в представлении модели

не совсем правильно. Вы строите REST API, используя @RestController. Вы тестируете конечные точки с помощью Postman, но @RestController не используется для тестирования API с использованием Postman. Вы используете его, чтобы построить конечную точку и протестировать ее с почтальоном (вы также можете использовать другие клиенты и платформы для тестирования вашей конечной точки).

Отвечая на ваш вопрос:

Возможно ли создать оба этих контроллера для одного класса сущности в загрузочном приложении Spring и заставить их оба вызывать один и тот же метод из класса обслуживания, который обрабатывает logi c реализации crud?

Да, это так возможно, чтобы @REstController и @Controller работали с одним и тем же классом обслуживания для одной и той же сущности (на самом деле, если бизнес-логика c одинакова для вашего просмотра и ответа в json - у вас будет только один компонент службы). Вполне возможно, что ваше приложение построено с использованием jsp для пользователей, а также предоставляет конечные точки для взаимодействия с другими службами; это обычно актуально в крупных компаниях, где несколько сервисов полагаются друг на друга в отношении функциональности и данных. Но вы должны убедиться, что ваши конечные точки не совпадают или не совпадают. Обычно, если у нас есть отображение контроллера как / books -> отображает список книг на экране, у нас будет аналогичное отображение контроллера остатка - / api / v1 / books ->, чтобы вернуть список книг.

0 голосов
/ 27 марта 2020

@RestController является @Controller + @ResponseBody. Вам не нужны два контроллера. Просто используйте один @RestController, и он будет работать в обоих случаях.

...