Создание REST контроллера

 
 
 
Сообщения:41
Добрый день. Я работаю на своим учебным проектом. У меня есть обычные контроллеры, но сейчас хочу переделать их в REST. К примеру, вот один из моих контроллеров:
@Controller
public class MainController {
	
	private static final Logger logger = Logger.getLogger(MainController.class);
	
	@Autowired
	private OrderService orderService;
	
	@Autowired
	private UserService userService;
	
	@RequestMapping(value = {"/", "/home"}, method = RequestMethod.GET)
	public ModelAndView ApplicationEntry() {
		ModelAndView mav = new ModelAndView("startpage");
		logger.info("Startpage loaded");
		return mav;
	}
	
	@RequestMapping(value = "/welcome", method = RequestMethod.GET)
	public ModelAndView showHomePage() {
		ModelAndView mav = new ModelAndView("me");
		logger.info("Welcome page loaded");
		return mav;
	}
	
	@ModelAttribute(name = "orderList")
	public Iterable<OrderBean> showOrders() {
		Iterable<OrderBean> orderList = orderService.findByStatusAndEmployeeId(true, 0);
		for (OrderBean order : orderList) {
			int userId = order.getUserId();
			UserBean user = userService.findUserById(userId);
			String name = user.getName();
			order.setUserName(name); 
		}
		return orderList;
	}
 }


С помощью этого контроллера на стартовую страницу выводится общий список доступных заказов. Я хочу написать rest api, чтоб можно было в дальнейшем использовать ajax(Jquery). Я понимаю, что нужно использовать ResponseEntity, но как мне запихнуть туда ModelAttribute?
Изменен:24 авг 2018 08:59
 
 
Сообщения:9717
ModelAttribute в REST API уже не нужен. Вместо него используется ResponseEntity, ResponseBody, а также HTTP headers. ResponseEntity/ResponseBody сериализуется в JSON с помощью Jackson или другого сериализатора. Ну и затем отправляется на UI.
 
 
Сообщения:41
Староверъ:
ModelAttribute в REST API уже не нужен

Но ведь у меня в ModelAttribute производятся дополнительные действия(добавление имени). Как мне тогда это прописать? В контроллере в каждом рест методе отдельно
public ResponseEntity<Iterable<OrderBean>> showOrders() {
    Iterable<OrderBean> orderList = orderService.findByStatusAndEmployeeId(true, 0);
	for (OrderBean order : orderList) {
		int userId = order.getUserId();
		UserBean user = userService.findUserById(userId);
		String name = user.getName();
		order.setUserName(name); 
    }
    return new ResponseEntity<Iterable<OrderBean>>(orderList, HttpStatus.OK);
}

или сразу вбить это в метод сервис слоя может быть, чтоб в контроллере не производить этих манипуляций? тогда в контроллере будет что-то вроде этого:
public ResponseEntity<Iterable<OrderBean>> showOrders() {
    Iterable<OrderBean> orderList = orderService.findByStatusAndEmployeeId(true, 0);
    return new ResponseEntity<Iterable<OrderBean>>(orderList, HttpStatus.OK);
}
Изменен:24 авг 2018 09:30
 
 
Сообщения:9717
Как правило создают объект который удобно трансформировать в JSON/XML - Data Transfer Object (DTO). В твоем случае это будет OrderDto. Именно такая DTO возвращается в ResponseEntity и сериализуется.

Простую конвертацию из Entity в DTO можно производить либо в самой DTO, либо в Entity: orderBean.toWebDto(). Вызывать эту конвертацию в сервисе или в контроллере - это повод для дебатов. У обоих подходов если свои плюсы и минусы. Если же конвертация сложная (приходится еще лазить в БД или другие сервисы за доп данными), то тут без вариантов - такое заполнение прийдется делать на уровне сервисов и соответственно сервисный метод будет возвращать DTO.
 
 
Сообщения:41
Староверъ:
Как правило создают объект который удобно трансформировать в JSON/XML - Data Transfer Object (DTO).

У меня OrderBean - это и есть уже сконвертированный DTO. Для Entity у меня есть отдельный класс.

А как использовать аннотацию @ResponseBody? Вернее, в каких случаях? Просто я пишу метод в контроллере, смотрю на него, и мне кажется, что эта аннотация нужна. Но хочется научиться отличать те моменты, когда ее нужно использовать, а когда нет.
 
 
Сообщения:9717
ResponseEntity дает бОльший контроль над возвращаемой информацией - можно указывать как само тело, так и хедеры. А ResponseBody позволяет задать только тело, а статус код и хедеры будут по умолчанию. Поэтому если нужен контроль над хедерами и статусом - нужно использовать ResponseEntity.
 
Модераторы:wedens
Сейчас эту тему просматривают:Нет