Я пытаюсь сделать свое приложение, предназначенное для управления базой данных пациентов врачами, и у меня есть некоторые проблемы с сохранением информации об объекте, который когда-то отправляется методом почтового запроса. Я хочу, чтобы их запомнили в URL. Я пытался что-то сделать с @SessionAttributes
, но не думаю, что хорошо это понимаю.
Вот мой контроллер:
@Controller
@SessionAttributes("loggedInPersonelID")
@RequestMapping
public class PatientManagerController {
@Autowired
private PatientService patientService;
@Autowired
private PersonelService personelService;
private Personel getLoggedInPersonel(String personelID) {
return personelService.getPersonel(personelID);
}
@GetMapping
public ModelAndView getLoginView() {
ModelAndView mav = new ModelAndView("login-view");
mav.addObject("personel", new Personel());
return mav;
}
Сообщение метода передает вошедшему в систему пользователю следующий URL-адрес /user={id}
(используются атрибуты RedirectAttributes)
@PostMapping
public String loginUser(@ModelAttribute("personel") Personel personel,
RedirectAttributes redirectAttrs,
Model model) {
Personel loggedInPersonel = getLoggedInPersonel(personel.getPersonelID());
model.addAttribute("loggedInPersonelID", loggedInPersonel.getPersonelID());
if (loggedInPersonel != null) {
if (loggedInPersonel.getPassword().equals(personel.getPassword())) {
redirectAttrs.addAttribute("id", loggedInPersonel.getPersonelID());
return "redirect:/user={id}";
} else {
model.addAttribute("errorMessage", "Invalid credentials!");
return "login-view";
}
} else {
model.addAttribute("errorMessage", "User with given ID does not exist");
return "login-view";
}
}
Вот мой метод get, который перехватывает представление для вошедшего в систему пользователя. URL-адрес здесь работает, так как модель была передана в предыдущем методе публикации. У меня есть что-то вроде /user=john-smith-123
@GetMapping("/user={id}")
public ModelAndView getUserMainView(@PathVariable("id") String personelID) {
ModelAndView mav = new ModelAndView("personel-main-view");
Personel loggedInPersonel = getLoggedInPersonel(personelID);
mav.addObject("personelOccupation", loggedInPersonel.getOccupation());
mav.addObject("personelName", loggedInPersonel.getName());
mav.addObject("personelSurname", loggedInPersonel.getSurname());
return mav;
}
Однако следующая страница больше не запоминает идентификатор пользователя. Я думал, что передав его в атрибут модели с таким же именем, как определено в @SessionAttributes("loggedInPersonelID")
, информация запомнится.
@GetMapping("/user={id}/patients")
public ModelAndView getPatientsView(@PathVariable("id") String personelID) {
ModelAndView mav = new ModelAndView("patients-view");
Personel loggedInPersonel = getLoggedInPersonel(personelID);
mav.addObject("loggedInPersonelID", loggedInPersonel.getPersonelID());
mav.addObject("list", patientService.getPersonelsList(loggedInPersonel));
return mav;
}
Результат в URL: user=$%7BloggedInPersonelID%7D/patients
и ошибка There was an unexpected error (type=Internal Server Error, status=500).
No message available
Вот ссылка в представлении personel-main-view
, которая должна переместить меня на нужную страницу
<a th:href="@{/user=${loggedInPersonelID}/patients}">My patients</a>
Итак, как мне это сделать? Извините за грязный код. Является ли этот вопрос более сложным, чем кажется? Есть ли что-то более глубокое, что мне не хватает?
PS. Я работаю с тимелеафом
__.
. Оно должно предварительно обрабатывать выражение и передавать, например, user=1234 в виде строки в выражение@
, 11.11.2017