intra-mart Accel Platform ポートレット プログラミングガイド 第12版 2021-04-01

8. ポートレットの開発(Spring 編)

注意

Spring ポートレットは 2019 Summer(Waltz) 以降では利用できなくなりました。
ご利用のバージョンが 2019 Summer(Waltz) 以降の方は、「ポートレットの開発(非同期ポートレット編)」をご利用ください。

8.1. 概要

Spring ポートレットは、画面表示処理を Spring Framework を利用して作成します。
通常の Spring Framework ポートレット開発と同様に作成することが可能です。
ポートレットのライフサイクルを実現するために、@RenderMapping, @ActionMapping, @EventMapping アノテーションを利用します。
Spring Portlet MVC Framework の詳細については Portlet MVC Framework を参照してください。
  1. 画面開発 (render サイクル)

    ポートレットに表示する画面を作成します。モードやウィンドウステータスを判定して切り替えることも可能です。
    表示モード用の画面は必須です。
  2. アクション処理 (processAction サイクル)

    ポートレットからサブミットされたデータの処理を作成します。 Controller クラスのメソッドに @ActionMapping アノテーションを設定することによって利用できます。
    また、Event を設定することによって、別のポートレットと連携することも可能です。
  3. イベント処理 (processEvent サイクル)

    他のポートレットから発生したイベントの受信処理を作成します。 Controller クラスのメソッドに @EventMapping アノテーションを設定することによって利用できます。
    アクション処理 で Event を設定された場合のみ実行されます。
ポートレットのライフサイクルごとに、以下のようにメソッドに設定するアノテーションが異なります。
render 必須 @RenderMapping
processAction 任意 @ActionMapping
processEvent 任意 @EventMapping
次項より、ポートレットで利用可能な API と、各ライフサイクルでの実装方法について簡単に説明していきます。

8.2. Spring Portlet MVC Frameworkのポートレット開発との違い

主な違いは以下の通りです。
  • portlet.xml
    Spring Portlet MVC Frameworkでは個々のポートレットごとにportlet.xmlに<portlet>を追加していましたが、 intra-mart Accel Platform では、個々には登録しません。
    %CONTEXT_PATH%/WEB-INF/plugin/jp.co.intra_mart.portal.portlets.spring_8.0.0/plugin.xmlの<portlet-name>SpringPortlet</portlet-name>の設定を元にポートレットを動作させます。
    portlet-name は、「Springポートレット識別子」に設定した値が設定されます。
  • portletのcontextのxmlファイルの命名規則と配置場所
    classpath:META-INF/spring/[Springポートレット識別子]-portlet.xml です。
    詳細は、「portlet context のxmlファイル 」を参照してください。
  • JSP
    HEADやBODYタグなどが使えないなど、注意事項があります。
    詳細は 「画面を作成する上での注意事項」を参照してください。

8.3. ポートレットAPI

単純な画面表示のみのポートレットでは、ポートレットAPIを利用しなくても作成可能ですが、ポートレットの機能を最大限に利用するためには、ポートレット API を利用する必要があります。
特に Action 処理や Event 処理を行うためには、ポートレット API を利用しなくては実行できません。
このドキュメントでは、基本的な関数のみに絞って説明します。
全ての API については「ポータル API リスト」および「Portlet API2.0 のドキュメント」を参照してください。
ポートレット API2.0 のドキュメントは以下より取得してください。

8.3.1. PortalManager

PortletAPI2.0 をそのまま利用可能ですが、これらの API を簡単に利用するためのアクセッサとして、PortalManager クラスが用意されています。
jp.co.intra_mart.foundation.portal.common.PortalManager
PortalManager のそれぞれの関数については、次項以降で実際に利用する際に説明します。

8.4. ポートレットモード

利用できるポートレットモードは、表示モード(VIEW)と編集モード(EDIT)です。

8.4.1. ポートレットモードの設定

ポートレット定義を変更し、ポートレットを初期化することでポートレットモードの設定を変更できます。
  • ポートレット定義の変更
    ポートレットモードの設定は以下のファイルで管理されています。intra-mart Accel Platform を停止して設定後、再起動を行います。
    設定ファイル
    %CONTEXT_PATH%/WEB-INF/plugin/jp.co.intra_mart.portal.portlets.spring_8.0.0/plugin.xml
    設定箇所
    <?xml version="1.0" encoding="utf-8"?>
    <plugin>
       <extension point="jp.co.intra_mart.portal.portlets">
          <portlet
              id="jp.co.intra_mart.portal.portlets.spring"
              name="SpringPortlet"
              display-name="%display-name"
              description="%description"
              version="8.0.0"
              rank="1">
               <portlet-class>jp.co.intra_mart.foundation.portal.portlets.model.SpringPortlet</portlet-class>
               <expiration-cache>0</expiration-cache>
               <supports>
                   <mime-type>text/html</mime-type>
                   <portlet-mode>VIEW</portlet-mode>
                   <portlet-mode>EDIT</portlet-mode>
                   <!-- ここにモードを追加 -->
               </supports>
               ...
          </portlet>
       </extension>
    </plugin>
    

8.4.2. ポートレットモードの取得

API を利用して、以下のように現在のポートレットモードを取得できます。
ポートレットモードは、以下のような「javax.portlet.PortletMode」クラスの定数が取得されます。

(ex.) PortletMode.VIEW, PortletMode.EDIT

javax.portlet.RenderRequest renderRequest = PortalManager.getRenderRequest();
javax.portlet.PortletMode portletMode = renderRequest.getPortletMode();

8.5. ウィンドウステータス

8.5.1. ウィンドウステータスの取得

API を利用して、以下のように現在のポートレットモードを取得できます。
ウィンドウステータスは、以下のような「javax.portlet.WindowState」クラスの定数が取得されます。
また、最小化時にはポートレットが呼び出されませんので、「WindowState.MINIMIZED」が取得されることはありません。

(ex.) WindowState.NORMAL, WindowState.MAXIMIZED, WindowState.MINIMIZED

javax.portlet.RenderRequest renderRequest = PortalManager.getRenderRequest();
javax.portlet.WindowState windowState = renderRequest.getWindowState();

8.6. portlet context のxmlファイル

Spring Portletのcontextのxmlファイルのファイル名の命名規則と配置場所は以下の通りです。
  • ファイル名
    [Springポートレット識別子]-portlet.xml 形式で作成してください。
    (ex.) Springポートレット識別子に 「welcome」 と設定した場合、 welcome-portlet.xml です。
  • 配置場所
    モジュール・プロジェクトでは、src/main/resources に 「 META-INF/spring」 フォルダを作成し、xmlファイルを配置してください。
    (ex.) src/main/resources/META-INF/spring/welcome-portlet.xml
xmlに、Controller クラスをcomponent scanの対象になるように設定してください。
<context:component-scan base-package="Controller クラスのパッケージ" />

8.7. 画面開発 (renderサイクル)

render サイクルでは、通常の Web ページと同様に viewとしてJSPを使った画面表示が行われます。
Springモデルの画面は、おおむね通常の Spring Portlet MVC Framework の画面開発と変わりません。
ポートレット新規登録/編集画面 (「ポータル グループ管理者操作ガイド」参照)で設定するSpringポートレット識別子は、通常のポートレット開発のポートレット名に対応します(通常のポートレット開発の、portlet.xmlのportlet-nameの部分。)

8.7.1. Controller クラス

@Controller アノテーション、 @RequestMapping アノテーション を設定した Controllerクラスを作成し、 @RenderMapping アノテーションを設定したメソッドを作成します。
@RequestMapping にはポートレットモード(VIEW または EDIT)を指定します。
renderを処理するメソッドに @RenderMapping アノテーションを設定します。
パラメータでrenderを処理するメソッドを選択するには、 @RenderMapping(params = “action=list”) のように設定します。
RenderRequest、RenderResponseを取得するには、メソッドの引数にRenderRequest、RenderResponseを記述します。
@Controller
@RequestMapping("VIEW")
public class ViewController {

    // default render
    @RenderMapping
    public String view() {
        return "welcome/view.jsp";
    }

    // renderURL.setParameter("action", "list") に対応するrender
    @RenderMapping(params = "action=list")
    public String list() {
        return "welcome/list.jsp";
    }

    // renderURL.setParameter("action", "another") に対応するrender
    @RenderMapping(params = "action=another")
    public String view2(RenderRequest request, RenderResponse response) {
        // RenderRequest、RenderResponseを取得するには、メソッドの引数にRenderRequest、RenderResponseを記述します。
        return "welcome/view2.jsp";
    }
}

8.7.2. JSP ファイル

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<%@ page import="jp.co.intra_mart.foundation.portal.common.PortalManager" %>
<%@ page import="javax.portlet.PortletURL" %>

<%
PortletURL renderURL = PortalManager.createRenderURL();
%>
@RenderMapping に対応する。
<a href="<%=renderURL.toString() %>">default render</a>
<br/>

<%
PortletURL renderURL2 = PortalManager.createRenderURL();
renderURL2.setParameter("action", "list");
%>
@RenderMapping(params = "action=list") に対応する。
<a href="<%=renderURL2.toString() %>">render (action=list)</a>
<br/>

8.7.3. RenderRequest, RenderResponse

ポートレットで利用する requestオブジェクトおよびresponse オブジェクトは、通常のWebページのリクエストは異なり、ポートレット表示時の専用のオブジェクトである、RenderRequestオブジェクトおよびRenderResponseオブジェクトを利用します。
これらのオブジェクトを利用することで、ポートレットの情報を取得できます。
  • JSP でのページ引数の取得

    <%
      RenderRequest renderRequest = PortalManager.getRenderRequest();
      RenderResponse renderResponse = PortalManager.getRenderResponse();
    
      String value = renderRequest.getParameter("param1");
    %>
    

    RenderRequest から、現在のポートレットモード、ウィンドウステータスなどが取得できます。

8.7.3.1. RenderRequestのスコープ

RenderRequest は通常の Web アプリケーションのリクエストとスコープが異なります。
全てのポートレットで独立したリクエストを保持しており、ポータル画面を表示する際のリクエストパラメータを引き継ぎません。
ただし以下のパラメータは、ポートレットコンテナにより、自動的に設定されます。
portal_cd ポートレットが配置されているポータル画面のキー。
portalKind

ポートレットが配置されているポータル画面のポータル種別。以下の値が取得される。

user ユーザポータル
group グループポータル
ポートレットにリクエストパラメータを設定するためには、アクション処理またはイベント処理を実行する必要があります。
また、一度設定したリクエストパラメータは、セッションが持続する間、再度アクション処理またはイベント処理が実行されるまで有効です。

8.7.4. ActionURL, RenderURL

ポートレットからサブミット処理を行い、 処理終了後に再びポータル画面を表示する機能を作成する場合には、ポートレットコンテナと通信するため、以下の URL に対してサブミットする必要があります。
ActionURL Action 機能を呼び出す URL
RenderURL ポータル画面を再表示するための URL
これらは、PortalManager を利用して取得できます。
  • ActionURL, RenderURL の取得

    PortletURL actionURL = PortalManager.createActionURL();
    PortletURL renderURL = PortalManager.createRenderURL();
    
以下に、ポートレットでサブミットされた後に、アクション処理を呼び出すサンプルを示します。
  • JSP

    <%
      PortletURL actionURL = PortalManager.createActionURL();
    %>
    <!-- 何らかの登録処理を行うサービスを呼び出す -->
    <form action="<%= actionURL.toString() %>" method="POST">
    <!-- 登録処理で使用する値 -->
      <input type="text" name="param1" value="">
      <input type="submit" value="実行">
    </form>
    
    • アクション処理を呼び出すためには、ActionURL にサブミットする以外にありません。
    • ActionURL はポータル情報を含むため、データ量が多くなります。メソッドは POST を指定するようにしてください。
    パラメータを指定してAction処理を呼び出す場合
    <%
      PortletURL actionURL = PortalManager.createActionURL();
      actionURL.setParameter("action", "register");
    %>
    <!-- 何らかの登録処理を行うサービスを呼び出す -->
    <form action="<%= actionURL.toString() %>" method="POST">
    <!-- 登録処理で使用する値 -->
      <input type="text" name="param1" value="">
      <input type="submit" value="実行">
    </form>
    
    • setParameterを使ってパラメータを設定し、アクション処理を呼び出します。
      この場合、 「action=register」です。

8.8. アクション処理 (processActionサイクル)

アクション処理は、 Controllerクラスのメソッドに @ActionMapping アノテーションを設定します。
アクション処理を呼び出すためには、JSPなどで作成した画面から、ActionURLのURL へサブミットすることでアクション処理が実行されます。
アクション処理では、RenderParameter の設定、PortletPreference の設定、イベントの設定などの更新処理を行います。

8.8.1. Controller クラス

@Controller アノテーション、 @RequestMapping アノテーション を設定した Controllerクラスを作成し、 @ActionMapping アノテーションを設定したメソッドを作成します。
@RequestMapping にはポートレットモード(VIEW または EDIT)を指定します。
import jp.co.intra_mart.foundation.portal.common.handler.ImEvent;

@Controller
@RequestMapping("VIEW")
public class ViewController {

    // default render
    @RenderMapping
    public String view() {
        return "welcome/view.jsp";
    }

    // renderURL.setParameter("action", "list") に対応するrender
    @RenderMapping(params = "action=list")
    public String list() {
        return "welcome/list.jsp";
    }

    // default action
    @ActionMapping
    public void register(@RequestParam("name") String name, ActionResponse response) {
        // 登録処理 ...

        // @RenderMapping(params="action=list") のrenderへ遷移させる。
        response.setRenderParameter("action", "list");
    }

    // actionURL.setParameter("action", "publish") に対応するaction
    // eventを発行するaction
    @ActionMapping(params = "action=publish")
    public void publish(ActionRequest request, ActionResponse response) {
        // イベント発行
        ImEvent event = new ImEvent();
        event.setEvent("hello");
        response.setEvent(ImEvent.IM_QNAME, event);
    }
}

8.8.2. JSP ファイル

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<%@ page import="jp.co.intra_mart.foundation.portal.common.PortalManager" %>
<%@ page import="javax.portlet.PortletURL" %>

<%
PortletURL renderURL = PortalManager.createRenderURL();
%>
@RenderMapping に対応する。
<a href="<%=renderURL.toString() %>">default render</a>
<br/>

<%
PortletURL renderURL2 = PortalManager.createRenderURL();
renderURL2.setParameter("action", "list");
%>
@RenderMapping(params = "action=list") に対応する。
<a href="<%=renderURL2.toString() %>">render (action=list)</a>
<br/>

<%
PortletURL actionURL = PortalManager.createActionURL();
%>
@ActionMapping に対応する。
<form method="post" action="<%=actionURL.toString() %>">
	<input type="text" name="name" value="">
	<button type="submit">登録</button>
</form>
<br/>

<%
PortletURL actionURL2 = PortalManager.createActionURL();
actionURL2.setParameter("action", "publish");
%>
@ActionMapping(params = "action=publish") に対応する。
<a href="<%=actionURL2.toString() %>">イベント発行</a>
<br/>

8.8.3. ActionRequest, ActionResponse

アクション処理のメソッドの引数は、アクション処理専用のオブジェクトである、ActionRequest オブジェクト、ActionResponse オブジェクトです。
これらのオブジェクトを利用することで、リクエスト引数の取得や、イベントの設定ができます。
詳細は、「Portlet API2.0 ドキュメント」を参照してください。

8.8.4. RenderParameterの設定

画面表示時に取得可能なリクエストパラメータ(RenderParameter)は、アクション処理またはイベント処理の中で設定を行います。
アクション処理呼び出し時のリクエストパラメータは、ActionRequestに格納されていますが、 renderサイクルには引き継がれないため 、必要な場合は明示的に設定する必要があります。
また、アクション処理の呼び出し時には過去に設定された RenderParameter は全てクリアされています。

(ex.) processAction サイクルでの RenderParameter の設定

// ActionResponse response
// リクエストパラメータを設定する場合。
response.setRenderParameter("param1", "value1");
// リクエストパラメータを削除する場合。
response.setRenderParameter("param2", null);

(ex.) render サイクルでの RenderParameter の利用

String value = request.getParameter("param1");

8.8.5. PortletPreferencesの設定

PortletPreferences とは、ユーザごとのポートレット情報保存領域です。
intra-mart Accel Platform のポートレットコンテナでは、PortletPreferences に設定された情報は、データベースに保存されます。
ここで設定された情報は、画面表示時にいつでも参照が可能です。

(ex.) javax.portlet.PortletPreferences の利用

// PortletPreferences の取得。
PortletPreferences preferences = request.getPreferences();
// PortletPreferences に設定された情報の取得。
String value = preferences.getValue("key1", "Default Value");
// PortletPreferences に情報を設定する。
preferences.setValue("key1", "value1");
// PortletPreferences を確定する。
//  この処理を行わない場合、情報は保存されません。
preferences.store();

8.8.6. イベントの設定

イベントを設定することにより、アクション処理を受け付けたポートレット以外の複数のポートレットにイベントの発生を通知して処理を引き渡すことが可能です。
event idには jp.co.intra_mart.foundation.portal.common.handler.ImEvent.IM_QNAME を設定してください。

(ex.) processAction サイクルでのイベントの設定

@ActionMapping(params = "action=publish")
public String publish(ActionRequest request, ActionResponse response) {
    ImEvent event = new ImEvent();
    event.setEvent("hello");
    response.setEvent(ImEvent.IM_QNAME, event);
}

8.9. イベント処理 (processEventサイクル)

processEvent サイクルでは画面表示がありませんので、@EventMapping アノテーションを設定したメソッドのみ作成します。
イベント処理では、RenderParameter の設定、PortletPreferences の設定、イベントの設定などの更新処理を行います。

8.9.1. Controller クラス

@Controller アノテーション、 @RequestMapping アノテーション を設定した Controllerクラスを作成し、 @EventMapping アノテーションを設定したメソッドを作成します。
@RequestMapping にはポートレットモード(VIEW または EDIT)を指定します。
@EventMapping には、 @EventMapping(“ImEvent”) と ImEvent を指定してください。
import jp.co.intra_mart.foundation.portal.common.handler.ImEvent;

@Controller
@RequestMapping("VIEW")
public class AnotherController {

    // default render
    @RenderMapping
    public String view() {
        return "receive/view.jsp";
    }

    // event
    @EventMapping("ImEvent")
    public void event(EventRequest request, EventResponse response) {
        Event event = request.getEvent();
        ImEvent imEvent = (ImEvent) event.getValue();
        if (!"hello".equals(imEvent.getEvent())) {
            // "hello"のイベント以外では、処理を実行しない。
            return;
        }
        // 何らかの処理...
    }
}

8.9.2. ImEventオブジェクト

EventRequestから取得できる Eventオブジェクトは、intramartのポートレット間では、ImEventオブジェクトが設定されます。
ImEvent オブジェクトは以下の情報を格納しています。
プロパティ名
id String
アクション処理で設定されたイベント ID
省略された場合、文字列「ImEvent」が設定される。
value String
アクション処理で設定されたイベントの値
オブジェクトを設定した場合も文字列として取得される。
source String Event を設定したポートレットのポートレットコード

8.9.3. EventRequest, EventResponse

イベントのメソッドの引数は、イベント処理専用のオブジェクトである、EventRequest オブジェクト、EventResponse オブジェクトを使うことができます。
これらのオブジェクトを利用することで、リクエスト引数の取得や、イベントの設定ができます。
詳細は、「Portlet API2.0 ドキュメント」を参照してください。

8.9.4. RenderParameterの設定

画面表示時に取得可能なリクエストパラメータ(RenderParameter)は、アクション処理またはイベント処理の中で設定を行います。
イベント処理呼び出し時に設定済みであった RenderParameter は、EventRequest に格納されており、特に処理を行わない限り、 render サイクルに自動的に引き継がれます
引継ぎが不要な場合は明示的に削除する必要があります。

(ex.) processEvent サイクルでの RenderParameter の設定

// リクエストパラメータを設定する場合。
response.setRenderParameter("param1", "value1");
// リクエストパラメータを削除する場合。
response.setRenderParameter("param2", null);

(ex.) render サイクルでの RenderParameter の利用

request.getParameter(eventId);

8.9.5. PortletPreferencesの設定

PortletPreferences とは、ユーザごとのポートレット情報保存領域です。
intra-mart Accel Platform のポートレットコンテナでは、PortletPreferences に設定された情報は、データベースに保存されます。
ここで設定された情報は、画面表示時にいつでも参照が可能です。

(ex.) java.portlet.PortletPreferences の利用

// PortletPreferences の取得。
PortletPreferences preferences = request.getPreferences();
// PortletPreferences に設定された情報の取得。
String value = preferences.getValue("key1", "Default Value");
// PortletPreferences に情報を設定する。
preferences.setValue("key1", "value1");
// PortletPreferences を確定する。
//  この処理を行わない場合、情報は保存されません。
preferences.store();

8.9.6. イベントの設定

イベントを設定することにより、イベント処理を受け付けたポートレット以外の複数のポートレットにイベントの発生を通知して処理を引き渡すことが可能です。
ただし、イベント処理でさらにイベント処理を行うとパフォーマンスの低下をまねき、またイベントループの発生する可能性もありますので、十分注意して実装してください。

(ex.) processEvent サイクルでのイベントの設定

response.setEvent(eventId, eventValue);

8.10. Ajax (serveResourceサイクル)

Ajaxを使ってリソースを取得するために、serveResourceサイクルで動的なリソースを取得します。
ここでは、Ajaxを使ってリソースを取得する方法について説明します。
  • Controllerクラスに @ResourceMapping アノテーションを設定したメソッドを作成します。
  • portletのbean定義xmlに、Jacksonの設定を追加します。

8.10.1. Controller クラス

@Controller アノテーション、 @RequestMapping アノテーション を設定した Controllerクラスを作成し、 @ResourceMapping アノテーションを設定したメソッドを作成します。
@RequestMapping にはポートレットモード(VIEW または EDIT)を指定します。
Ajaxで呼び出される処理を実行するメソッドに @ResourceMapping アノテーションを設定します。
リソースID “sample” と対応付けるには、 @ResourceMapping(“sample”) のように設定します。
JSON文字列を返すために、 @ResourceMappingアノテーションを設定したメソッドの返り値のタイプに JsonResult を設定します。
@Controller
@RequestMapping("VIEW")
public class ViewController {

    // default render
    @RenderMapping
    public String view() {
        return "welcome/view.jsp";
    }

    // resource id = fetch
    @ResourceMapping("fetch")
    public JsonResult fetch() {
        Map<String, String> result;

        // result にデータをセットする処理
        // ...

        // JsonResultにデータをセットして返す。
        return new JsonResult(result);
    }
}

8.10.2. JSP ファイル

JsonResultのresultプロパティに設定した情報は、クライアント側では、data.result に設定されています。
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<%@ page import="jp.co.intra_mart.foundation.portal.common.PortalManager" %>
<%@ page import="javax.portlet.ResourceURL" %>

<%
ResourceURL resourceURL = PortalManager.createResourceURL();
resourceURL.setResourceID("fetch");
%>

<imui:head>
<script type="text/javascript">
(function ($) {
  fetchData = function () {
    $.ajax({
      dataType : 'json',
      url : '<%=resourceURL.toString()%>', // resource id = "fetch"のURL
      type :'GET',
      success : function (data, textStatus, jqXHR) {
        var result = data.result; // data.resultとJsonResult().getResult()が対応しています。
        // 取得データを使った何らかの処理
      }
    });
  };
})(jQuery);
</script>
</imui:head>

<a href="javascript:void(0);" onclick="fetchData();">resource id = "fetch"</a>

8.10.3. portlet context の xmlファイル

AnnotationMethodHandlerAdapterのcustomModelAndViewResolverプロパティにJsonModelAndViewResolverを設定します。
これにより、コントローラークラスのメソッドの戻り値が JsonResult の場合、viewとして MappingJackson2JsonView を使い、responseにJSONを返します。
     <bean class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter">
         <property name="customModelAndViewResolver">
             <bean class="jp.co.intra_mart.framework.extension.spring.web.portlet.mvc.JsonModelAndViewResolver" />
         </property>
     </bean>

8.10.4. java.util.Date型プロパティのJSONでのフォーマットについて

Jacksonのデフォルトの設定では、java.util.Date型のプロパティをJSONで出力すると、エポックミリ秒(1970年1月1日からのミリ秒)で出力されます。
アカウントごとに定義した日付フォーマットを適用して、Date型のプロパティをフォーマットしてJSONに出力するには、以下のようにします。
  • モデルクラスのDate型プロパティにアノテーションを設定をする。
  • portlet context の xmlファイルにアノテーションを有効にする設定をする。
モデルクラスへの設定
JsonResultにセットするモデルクラスのDate型プロパティに AccountDateFormat、AccountDateTimeFormat、AccountTimeFormat アノテーションを付けます。
それぞれのアノテーションについては、 「 APIリスト jp.co.intra_mart.framework.extension.spring.format.annotation パッケージ 」 を参照してください。
アノテーションを付けない場合は、エポックミリ秒のままです。
import java.util.Date;

import jp.co.intra_mart.framework.extension.spring.format.annotation.AccountDateFormat;
import jp.co.intra_mart.framework.extension.spring.format.annotation.AccountDateFormat.TYPE;

public class DateForm {

    // アノテーションなし
    private Date date;

    // アノテーションあり
    @AccountDateFormat
    private Date dateDefault;

    // アノテーションあり
    @AccountDateFormat(type = TYPE.SIMPLE)
    private Date dateSimple;

    // setter and getter...
}
portlet context の xmlファイルへの設定
JsonModelAndViewResolverのmappingJacksonJsonViewプロパティに、MappingJackson2JsonViewを設定し、このMappingJackson2JsonViewのobjectMapperプロパティにAccountDateObjectMapperを設定します。
objectMapperにAccountDateObjectMapperを設定したMappingJackson2JsonViewを使うことにより、モデルをJsonに変換するときに、AccountDateFormat、AccountDateTimeFormat、AccountTimeFormat アノテーションの設定を有効にできます。
CVE-2018-11040 対応として、 MappingJackson2JsonView を利用する場合は、 jsonpParameterNames プロパティに空のSetを設定します。
    <bean class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="customModelAndViewResolver">
            <bean class="jp.co.intra_mart.framework.extension.spring.web.portlet.mvc.JsonModelAndViewResolver">
                <property name="mappingJacksonJsonView">
                    <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
                        <property name="jsonpParameterNames" value="#{T(java.util.Collections).EMPTY_SET}" />
                        <property name="objectMapper">
                            <bean class="jp.co.intra_mart.framework.extension.spring.http.converter.json.AccountDateObjectMapper" />
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
アカウントごとに定義した日付フォーマットについては、「一般ユーザ操作ガイド」 - 「日付と時刻の形式を設定する」または APIリスト「DateTimeFormatIds」を参照してください。