1

私は Spring Portlet MVC を初めて使用しますが、ここ数日、一生懸命勉強してきました。私の問題のコンテキストは次のとおりです

  1. 単一のコントローラーを備えた Spring Portlet MVC ポートレットがあります。
  2. ポートレットは、ユーザーがリソースにアクセスしたいときはいつでもHandlerInterceptor (メソッド「preHandleRender」) を呼び出すように構成されています。
  3. インターセプターは、ユーザーが認証されているかどうかを確認し、認証されていない場合は、ユーザーの Liferay 資格情報を取得して、他の多くの Web サービスでの認証を管理します (現時点では興味深いものではありません)。
  4. この後、インターセプターはユーザー データを PortletSession 内に格納します

では、PortletSession に保存されているユーザー データを、インターセプターによってコントローラー内から取得するにはどうすればよいでしょうか??

sessionInterceptor.preHandleRender

@Override
public boolean preHandleRender(RenderRequest request, RenderResponse response, Object handler) throws Exception {

    PortletSession session = request.getPortletSession(true);
              .
              .
              .
    session.setAttribute("userProfile", userProfileDomain,PortletSession.APPLICATION_SCOPE);
              .
              .
              .
    return true;
}

ViewController クラス

@Controller("viewController")
@RequestMapping(value = "view")
public class ViewController {

    //@Autowired
    private WebServiceTemplate webServiceTemplate = new WebServiceTemplate();

    @RenderMapping
    public String setModelAndView(RenderRequest request, ModelMap tgtModel) {
        logger.debug("<<  |  >> Starting.");

        PortletConfiguration conf = PortletConfiguration.getInstance();
              .
              .
    }
}

リクエストがあれば、コードに関する詳細情報を提供する準備ができています。

4

2 に答える 2

1

問題を解決し、エラーを特定することができました。

インターセプターでは、質問で示したように、PortletSession.APPLICATION_SCOPE にセッション属性「userProfile」を設定しました。

session.setAttribute("userProfile", userProfileDomain,PortletSession.APPLICATION_SCOPE);

コントローラーに関しては、複数のオプションがあることを理解しました。

  • リクエスト (私の場合は RenderRequest) をパラメーターとして渡し、リクエストからセッション (私の場合は PortletSession) を取得し、セッションから属性を取得します。
  • セッションをパラメーターとして直接渡し、そこから属性を取得します。

ただし、1本目でも2本目でも、コントローラーで以下の命令を使えば

session.getAttribute("userProfile");

属性が PortletSession.APPLICATION_SCOPE に設定されているため、何も取得できません。

正しい指示は次のとおりです。

session.getAttribute("userProfile",PortletSession.APPLICATION_SCOPE);
于 2013-01-28T08:35:52.067 に答える
0

パラメータとして指定すると、Spring MVC は PortletSession をワイヤリングします。

 @RenderMapping
 public String setModelAndView(RenderRequest request, PortletSession session, ModelMap tgtModel) {
    logger.debug("<<  |  >> Starting.");

    PortletConfiguration conf = PortletConfiguration.getInstance();
          .
          .
 }

サポートされているタイプについては、http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/portlet.html#portlet-ann-requestmapping-argumentsを参照してください。

于 2013-01-21T13:58:38.757 に答える