我正在尝试将一个对象发送到一个类中的Spring-boot控制器,以便在另一个控制器的模型中可用。
似乎@SessionAttributes
适用于全局对象(如登录用户)。
我在控制器1
上试过这个@Component
@Controller
@SessionAttributes(value = { "user"})
public class FormController {
@GetMapping("/occurence/{occno}")
public String findOcc(@PathVariable String occno, OccViewModel occViewModel, Model model) {
Occ occ = occRepository.findByOccno(occno);
occViewModel.setOcc(occ);
occViewModel.setPersons(occPersonRepository.findOccPersonByOcc(occ.getId()));
List<OccPerson.OccRole> occRoles = Arrays.asList(OccPerson.OccRole.values());
model.addAttribute("occRoles", occRoles);
model.addAttribute("occViewModel", occViewModel);
model.addAttribute("countries", countries);
return "occ";
}
我在此表单上有一个按钮,将用户发送到此端点 - 我希望在控制器2
上可以使用相同的occViewModel到此端点@Component
@Controller
@SessionAttributes(value = { "user" })
public class PlanController {
@GetMapping("/newplan")
public String newPlan(Model model, OccViewModel occViewModel, HttpSession session) {
// create PlanViewModel DTO
Occ occ = new occVieModel.getOcc();
PlanViewModel planViewModel = new PlanViewModel;
planViewModel.setOcc(occ);
model.addAttribute(planViewModel);
//etc
}
我看到有@SessionAttributes,但我不明白我的第一个控制器如果我不知道从回购中获得什么Occ,我怎么会把它加载到会话中,因为看起来你需要在处理程序之前使用@ModelAttribute - 但URI给出了occno?
我也看了here,但它似乎只处理同一个类,并且不清楚如何将它应用于传入URI的id。
答案 0 :(得分:0)
我认为我正确地从数据库中检索对象,将其放入会话并通过GET发送到视图。然后视图将数据POST回处理程序,并且从视图返回的对象在会话中对象对象(在传递给Hibernate之前)。
OccViewModel有一个POST和GET控制器。 @SessionAttributes意味着在Get和post之间,对象在会话中保存,我不需要在隐藏标签中传递对象id。
@Component
@Controller
@SessionAttributes(value = { "user", "occViewModel" })
public class FormController {
@PostMapping("newOcc")
public String occSubmit(@Valid @ModelAttribute("occViewModel") OccViewModel occViewModel, BindingResult result, Model model
HttpServletRequest request, SessionStatus status) {
// NEW OCC
if( occViewModel.getOcc().getId() == null ) {
occService.saveNewOcc(occViewModel.getOcc(), occViewModel.getPersons());
}
//UPDATE OCC
if( occViewModel.getOcc().getId() != null ) {
occService.updateOcc(occViewModel.getOcc(), occViewModel.getPersons());
}
}
status.setComplete();
return "redirect:/dashboard";
}
@GetMapping("/occ/{occno}")
public String findOcc(@PathVariable String occno, OccViewModel occViewModel, Model model) {
// POPULATE OCC VIEW MODEL
Occ occ = occRepository.findByOccno(occno);
occViewModel.setOcc(occ);
model.addAttribute("occViewModel", occViewModel);
return "occ";
}
我相信OccViewModel必须作为参数传递给POST和GET处理程序。
然后将此对象传递给另一个控制器中的另一个处理程序,这是为了保持项目整洁:
@Component
@Controller
@SessionAttributes(value = { "user", "occPlanWork" })
public class PlanController {
@GetMapping("/occ/{occno}/plan")
public String findPlan(@PathVariable String occno, OccPlanWork occPlanWork, Model model) {
// GET OCC FROM OCCNO
Occ occ = new Occ();
occ = occRepository.findByOccno(occno);
// SET EPT DATA
occPlanWork.setOccno(occ.getOccno());
occPlanWork.setStart_date(occ.getStart_date());
occPlanWork.setOccId(occ.getId());
// CREATE NEW PLAN IF BLANK
if (occ.getPlan()== null) {
Plan plan = new Plan();
occPlanWork.setPlan(plan);
}
if (occ.getPlan()!=null) {
Plan plan = new Plan();
plan = occ.getPlan();
occPlanWork.setPlan(plan);
}
// SET THE EXISTING WORKS (AND CONVERT SET<WORK> TO LIST<LIST> FOR TH COMPATABILITY)
if (occPlanWork.getPlan().getId()!=null) {
List<Work> works = new ArrayList<>(occPlanWork.getPlan().getWorks());
Collections.sort(works);
occPlanWork.setWorks(works);
} // CREATE NEW WORK LIST IF PLAN IS NEW
if (occPlanWork.getPlan().getId()==null) {
List works = new ArrayList();
occPlanWork.setWorks(works);
}
// RETURN EPT
model.addAttribute("occPlanWork", occPlanWork);
return "newplan";
}
这是通过将URI中的出现次数传递给另一个控制器来实现的。同样,支持视图的对象(occPlanWork)位于控制器级别的会话属性中。