1

你好需要一点帮助。

我正在使用 Spring 和 portlet,我的问题是我有 2 个选项卡由两个带有 2 个 bean 的不同控制器处理。我需要的是在第二个控制器的渲染阶段显示来自第一个控制器的 bean 的数据。

我尝试执行以下操作:

这是第一个选项卡的控制器,我在其中收集必要的值并使用它们生成请求。

@Controller
@RequestMapping(ServletContextKeys.SC_VIEW_MODE)
//This is my bean session
@SessionAttributes(salarioBean)
public class AltaSalarioFSOPortletController extends BaseController {

private SalarioBean salarioBean;

//With this method generated the request to display the data in the other controller jsp
@RequestMapping(params = ACTION_CAMBIA_TAB)
public final String doRenderTab(@ModelAttribute(value = "SalarioBean") SalarioBean salario, Errors errors, RenderRequest renderrequest, PortletSession portletSession) {

    //retrieve the bean managed by Spring in session
    SalarioBean salarioSessionBean = (SalarioBean) portletSession.getAttribute(salarioBean);

    ImputacionBean imputacionBean = new ImputacionBean();
    ....Insert data on imputacionBean

    //generated the request to display data in jsp handled by another controller
    renderrequest.setAttribute(imputacionBean,imputacionBean);

    //redirected to jsp
    return jsp_tab2;
}

使用此控制器在 jsp 中显示数据,但是当单击另一个选项卡时尝试生成相同的数据时,我的问题就出现了。所以我尝试在另一个控制器中使用这个方法渲染:

@Controller
@RequestMapping(ServletContextKeys.SC_VIEW_MODE)
@SessionAttributes(imputacionBean)
public class AsociarCostesSalarioAlumnoPortletController extends BaseController {

private ImputacionBean imputacionBean;

@RequestMapping(params = ACTION_ASOC_COSTES_SALARIO)
public final String doRender(@ModelAttribute(value = "ImputacionBean") ImputacionBean imputacionSalarioAlumno,Errors errors, RenderRequest renderrequest,SessionStatus status) {

    justifSessionBean = (SalarioBean) renderrequest.getPortletSession().getAttribute(salarioBean);

    ImputacionBean imp=(ImputacionBean) justifSessionBean.getImputaciones().get(0);

renderrequest.getPortletSession().setAttribute(imputacionBean,imp);

    setJustificanteAsociarCostesSalarioAlumno(imp);

    setRequestParameters(renderrequest, imp);

    return jsp_tab2;
}

@Override
public final void setRequestParameters(RenderRequest renderrequest, Object object) {

    ImputacionBean imputacionSalarioAlumno = (ImputacionBean) object;

    renderrequest.setAttribute(imputacionBean, imputacionSalarioAlumno);

      renderrequest.getPortletSession().setAttribute(imputacionBean,imputacionSalarioAlumno);
}

public final void setJustificanteAsociarCostesSalarioAlumno(ImputacionBean imputacionSalario) {
    this.imputacionBean = imputacionSalario;
}

第一次处理 spring 的 bean 是对象空的。我的问题是:如何设置从第一个控制器处理 Spring 的会话 bean?所以在生成请求时,这个 bean 包含数据。

我需要更改处理 Spring 的 bean 以使用此数据生成新请求。

谢谢您的帮助。如果有什么你不明白的,我会尽力解释得更好。

4

1 回答 1

0

从您的陈述中,我不太明白您在寻找什么 - 第一次处理 spring 的 bean 是对象空的。- 我猜你会碰到一个空指针或异常说会话属性为空。

通常,当您将任何内容声明为会话属性时,例如@SessionAttributes("salarioBean"),然后在提交时或第一次呈现 portlet 时,框架假定会话属性已经创建并在会话中可用。

为了摆脱这个问题 - 第一次处理 spring 的 bean 是对象空的。- 您只需要确保该属性已经可用。为此,您可以添加一个使用注释@ModelAttribute创建模型属性的方法,例如,在您的情况下,它将是

@ModelAttribute("salarioBean")
public SalarioBean getSalarioBean(){
    return new SalarioBean();
}

发生的情况是,当一个方法使用 @ModelAttribute 注释时,它总是在每次调用 render/action 方法之前调用,并在 Model 对象中设置属性以使其可用。但是,当在@SessionAttribute 中也设置了相同的属性(例如“salarioBean”)时,它会在会话中一经创建就设置,并且在渲染/操作之前不会触发对 getSalarioBean() 的进一步调用方法被调用并且在会话中始终可用。

希望能帮助到你。

于 2012-11-21T20:39:08.773 回答