![](/img/trans.png)
[英]Passing 2 type of class object in spring boot controller
[英]Spring Boot object between controller in different class
我正在尝试将一个对象发送到一个类中的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";
}
我在此表单上有一个将用户发送到该端点的按钮-我想将相同的occViewModel用于控制器2上的该端点
@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吗?
我想我可以正确地从数据库中检索对象,将其置于会话中并通过GET发送到视图。 然后,视图随后将数据发布回处理程序,并且从视图返回的对象将在会话中针对该对象进行水合(在传递给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)在控制器级别的“会话属性”中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.