Как правильно работать с RestController?
Сразу извиняюсь за возможно глупый вопрос, но:
У меня есть @Controller который я переделываю @RestController + js.
Вот один из методов:
@GetMapping
public ModelAndView showAll() {
ModelAndView mav = new ModelAndView("/departments");
List<DepartmentDto> departmentDtos = departmentService.findAll();
if (departmentDtos.isEmpty()) {
mav.setViewName("redirect:/api/departments/new");
} else {
mav.addObject("departmentDtos", departmentDtos);
}
return mav;
}
Насколько я понимаю, контроллер должен иметь следующий вид:
@GetMapping
public ResponseEntity<List<DepartmentDto>> showAll() {
List<DepartmentDto> departmentDtos = departmentService.findAll();
return new ResponseEntity<>(departmentDtos, HttpStatus.OK);
}
На JS я возвращаю этот объект и дальше делаю свою логику. Если список пустой - перенаправляю на другую стр и т.д. Это верно?
Доп вопросы:
Методы
RestControllerвозвращают только один объект? Если нет - как вернуть 2 и более (к примеру два списка)? (вариант c ModelAndView считаю некорректным)Если использовать
RestController- всю логику redirect и forward - лучше оставить на js?Возможно ли вернуть View (jsp/html etc.)
Ответы (2 шт):
- RestController. Может вернуть что в голову взбредет. Файл, объект, да хоть зелёного гнома.
@GetMapping("/manual")
void manual(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setHeader("Custom-Header", "foo");
response.setStatus(200);
response.getWriter().println("Hello World!");
}
Хочешь хоть напрямую сокет открывай и долби в него разную, ересь.
- Можно, но не нужно. Для этого есть обычный контроллер, создай обычный контроллер и там уже работай с вьюшками. Это избавит тебя от лишнего геморроя с ручной инициализацией ModelAndView
Основной вопрос
Верно, но лучше использовать обёртку и в контроллере возвращать что-то вроде следующего:
public class Response {
private List<DepartamentsDto> departamentsDtos;
public List<DepartamentsDto> getDepartamentsDtos() {
return departamentsDtos;
}
public void setDepartamentsDtos(List<DepartamentsDto> departamentsDtos) {
this.departamentsDtos = departamentsDtos;
}
}
ResponseEntity удобен, когда вам нужно заносить в ответ какие то кастомные заголовки или переопределять существующие. Если использовать его просто так, то когда-нибудь с Вас спросят смысл этого действия :)
Первый доп. вопрос
Опять же, если использовать обёртку то можно возвращать хоть миллиард полей:
public class Response {
private List<DepartamentsDto> departamentsDtos;
private List<Departaments1Dto> departaments1Dtos;
private List<Departaments2Dto> departaments2Dtos;
private List<Departaments3Dto> departaments3Dtos;
private String name;
private String age;
// ... Getters and setters
}
Endpoint будет выглядеть так:
@GetMapping("/response")
public Response getResponse() {
// logic
}
Второй доп. вопрос
Насчёт редиректов можете почитать тут: https://stackoverflow.com/questions/36638150/best-approach-to-redirect-an-url-using-rest
Третий доп. вопрос
Можете попробовать вот так ::
@GetMapping("/main")
public String getMain() {
return "view.jsp";
}