1

こんにちは、少し助けが必要です。

私はSpringとポートレットを使用しています.私の問題は、2つのBeanを持つ2つの異なるコントローラーによって2つのタブが処理されることです. 必要なのは、2 番目のコントローラーのレンダリング段階で、最初のコントローラーの 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でデータを表示しますが、他のタブをクリックしたときに同じデータを生成しようとすると問題が発生します。そこで、別のコントローラーでこのメソッド render を実行しようとしました:

@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;
}

スプリングを処理する Bean が初めてオブジェクトが空になったとき。私の質問は、最初のコントローラーから Spring を処理するセッション Bean を設定するにはどうすればよいですか? したがって、リクエストを生成するとき、この Bean にはデータが含まれます。

このデータを使用して新しいリクエストを生成するには、Spring を処理する Bean を変更する必要があります。

助けてくれてありがとう。わからないところがあれば、丁寧に説明してくれます。

4

1 に答える 1

0

私はあなたの声明から、あなたが探しているものをよく理解していませんでした.Springを処理するBeanが初めてオブジェクトが空です。- null ポインターにヒットするか、セッション属性が null であるという例外が発生すると思います。

通常、 @SessionAttributes("salarioBean")などのセッション属性として何かを宣言すると、送信時またはポートレットが初めてレンダリングされるときに、フレームワークは、セッション属性が既に作成されており、セッションで使用可能であると想定します。

この問題を解決するには、Spring を処理する Bean が最初に空のオブジェクトになります。- 確認する必要があるのは、属性が既に使用可能であることだけです。このために、注釈@ModelAttributeを使用してモデル属性を作成するメソッドを追加できます。たとえば、あなたの場合は

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

メソッドに @ModelAttribute のアノテーションが付けられている場合、メソッドは毎回 render/action メソッドが呼び出される前に常に呼び出され、Model オブジェクトで属性を設定して使用できるようにします。ただし、同じ属性 (「salarioBean」など) が @SessionAttribute にも設定されている場合は、作成されるとすぐにセッションに設定され、getSalarioBean() へのさらなる呼び出しはレンダリング/アクションの前にトリガーされません。メソッドが呼び出され、セッションで常に使用できます。

それが役に立てば幸い。

于 2012-11-21T20:39:08.773 に答える