不同类

时间:2017-09-10 19:05:50

标签: java spring spring-mvc spring-boot

我正在尝试将一个对象发送到一个类中的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。

1 个答案:

答案 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)位于控制器级别的会话属性中。