繁体   English   中英

不同类中的控制器之间的Spring Boot对象

[英]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吗?

我也在这里看过但看来只处理同一个类,还不清楚如何将其应用于在URI上传递的ID。

我想我可以正确地从数据库中检索对象,将其置于会话中并通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM