Struts 2 のアップグレード

このページの内容

お困りですか?

アトラシアン コミュニティをご利用ください。

コミュニティに質問

Confluence 8.0 では WebWork 2.1.x から Apache Struts 2 にアップデートされる予定です。

これまでは、オープンソース ライブラリを維持しながら、長い間 WebWork 2.1.x を使用してきましたが、コードベースを近代化して技術的負債を減らし、OGNL 攻撃からの安全性を高めるためにも、Struts 2 への移行を決定いたしました。

このページには、移行計画、重大な変更、今後予定されている改善点が含まれています。Struts 2 へのアップデートの進捗にともない、このページで引き続き最新情報をシェアしていきます。

テスト方法

依存関係にある XWork/WebWork を削除することで、Struts 開発リリースに対してプラグインをテストできます。プラグインが confluence-plugins-platform-pom を使用している場合は、Struts 2 が管理対象の依存関係となるはずです。

WebWork と Struts の関係の背景

WebWork フレームワークは Apache Struts 1 からスピンオフしたもので、機能の強化と改良を目指しつつ、元の Struts フレームワークと同じ一般的なアーキテクチャを維持しています。2005 年 12 月に、WebWork 2.2 が Apache Struts 2 に採用されることが発表され、2007 年 2 月に最初のフル リリースが行われました。[1]

重大な変更点の概要

  • ActionSupport プラグインに直接拡張するクラスがある場合は、ConfluenceActionSupport 拡張して Confluence から互換性サポートを受けることを、不可能な場合は com.opensymphony.xwork2.ActionSupport に移行することをお勧めします。 

  • $webwork.htmlEncode は Velocity コンテキストでは使用できなくなりました。代わりに $htmlUtil.htmlEncode を使用してください。

  • AroundInterceptor は削除されました。アプリで AroundInterceptor を拡張している場合は、WebWork 2 からソース コードにクラスをインポート (Open Symphony ライセンスに従う) して独自のベース クラスとしてサーバーに変更するか、インターセプターをリライトすることができます。

  • 次の表に示すとおり、新しいパッケージ コーディネートと本質的に変更されたクラスの置き換えがあります。

Webwork2.xStruts2コメント
com.opensymphony.xwork.*com.opensymphony.xwork2.*
com.opensymphony.webwork.*org.apache.struts2.*
DispatcherUtilDispatcher
com.opensymphony.webwork.config.Configurationorg.apache.struts2.config.Settings
com.opensymphony.webwork.ServletActionContextorg.apache.struts2.ServletActionContext

互換性レイヤー クラス:

com.atlassian.confluence.compat.struts2 .servletactioncontext.ServletActionContextCompatManager

$req$requestベロシティ VM ファイルのみ。現時点で、後方互換性のため $req を入れています。これは 8.0 の終了までに削除される可能性があります。
$res$responseベロシティ VM ファイルのみ。現時点で、後方互換性のため $res を入れています。これは 8.0 の終了までに削除される可能性があります。

#bodytag( "Component" <parameters>)
#bodytag( "TextField" <parameters>)

#scomponent(<parameters>) #end

#stextfield(<parameters>)

#tag と #bodytag のディレクティブから、#s ベースの新しい形式のコンポーネント ディレクティブに移行しました。そのため、これらのディレクティブ タグはすべて Struts 形式に移行しました。詳細と例は 8 月 30 日の更新をご参照ください。

private String xHtml; 

//古い形式

public void setXHtml(String value) { .... } 

private String xHtml; 

//新しい形式では、プロパティ名の最初の文字が大文字になります

public void setxHtml(String value) { .... } 

たとえば、Struts アクションに、小文字で始まり、そのあとに大文字が続くプロパティのセッター メソッドがある場合は (例: pRoperty)、set<pRoperty> のような新しい形式に従っていることをご確認ください。

"do" 形式のアクション メソッドを試すという規則は、WebWork でサポートされています。

<action name="..." method="submit">   ... </action> 

WebWork の場合:

  • ステップ 1: アクションで submit メソッドを実行しようとすると失敗します
  • ステップ 2: アクションで doSubmit メソッドを実行しようとすると、ステップ 1 が失敗した場合は失敗します


"do" 形式のアクション メソッドを試すという規則は、Struts 2 でサポートされていません。

<action name="..." method="submit">   ... </action>

Struts の場合:

  • アクションで submit メソッドを実行しようとすると失敗します

"do" 形式のアクション メソッドを試すという規則は、Struts 2 でサポートされていません。

"doDefault" 経由で既定メソッドを試すという規則は、Struts 2 でサポートされていません。

compat-lib の新しいバージョン

次の変更を含む compat-lib の新しいバージョン (1.6.0) がリリースされました。

  • getParameters メソッドが WebWork と Struts2 の間で一貫していなかったのを修正
  • #setContextMap を使用する際の ActionContext の自動初期化
  • 必要に応じてタイプの安全性を強制
  • Struts 6.3 のサポートを実装

このアップデート バージョンでは、次の追加パッケージをインポートする必要があります。 

com.opensymphony.xwork2.conversion.impl;resolution:=optional,

以降のアップデート 

compat-lib の新しいバージョン

次の修正を含む compat-lib の新しいバージョン (1.5.4) がリリースされました。

ActionContextCompatManager では、最初のメソッド呼び出し時に ActionContext インスタンスをキャッシュしていたため、新しいリクエスト /スレッドに対してこのキャッシュされたインスタンスが返されていました。この問題が修正されました。

CONFSERVER-81828 - Getting issue details... STATUS

以降のアップデート 

compat-lib の新しいバージョン

次の変更を含む compat-lib の新しいバージョン (1.5.3) がリリースされました。

ServletActionContext#getRequest から null が返されるか、NPE がスローされる場合に、ServletActionContextCompatManager#getRequest から null が返されるようになりました。以前の動作を希望する開発者は、代わりに StaticHttpContext#getRequest を使用してください。

以降のアップデート 

compat-lib の新しいバージョン

次の変更を含む compat-lib の新しいバージョン (1.5.1) がリリースされました。

  1. ActionContextCompatManager.setParameters メソッドの修正。Confluence 8.0 にインストールされたプラグインでは、下位互換性確保のために、HttpParameters の代わりに Map<String String[]> が返されます。
  2. ServletActionContextCompatManager. 内の新しいメソッド getServletContext

このアップデート バージョンでは、以前に公開されたドキュメントと比較して、次に示す追加のパッケージ インポートが必要です。

org.apache.struts2.dispatcher;resolution:=optional,

以降のアップデート 

8.0.0-m69

Confluence 8.0.0-m69 以上の EAP は Struts 2.5.x に基づいています。つまり、Struts 2 機能のすべての作業は、master にマージされます。

この機能に関する既知の課題は次のとおりです。

  • When the text-encoding setting is changed from Confluence General Configuration (/admin/viewgeneralconfig.action), Struts does not reflect this change immediately. It will only change following a server restart, or plugin install/uninstall. See  CONFSERVER-80123 - Getting issue details... STATUS for more information.
  • Plugins with XWork modules may malfunction or fail to enable or uninstall in certain scenarios. See  CONFSERVER-80124 - Getting issue details... STATUS for more information.

以降のアップデート 

詳細は互換ライブラリ 1.5.0 を参照

前回の更新でお伝えしたとおり、アトラシアンは Confluence 7.x と 8.x で XWork/WebWork と Struts のプラグインの相互互換性を扱う互換ライブラリを開発していました。このたび、confluence-compat-lib の 1.5.0 バージョンをリリースしました。

最も多く使用されている 2 つのクラスを特定し、そのクラスに次の互換性レイヤーを提供しています。

この表の 3 列目に互換性レイヤーが記載されています。表をスクロールすると、互換性レイヤーのクラスが表示されます。

XWork/WebWork クラスStruts 2 クラス互換性レイヤー クラス
com.opensymphony.webwork.ServletActionContextorg.apache.struts2.ServletActionContextcom.atlassian.confluence.compat.struts2 .servletactioncontext.ServletActionContextCompatManager
com.opensymphony.xwork.ActionContextcom.opensymphony.xwork2.ActionContextcom.atlassian.confluence.compat.struts2.actioncontext.ActionContextCompatManager

プラグイン互換性の単一バージョンを保つには

Confluence 7.x と 8.x に互換性のあるプラグインの単一バージョンのみを維持したい場合は、次の依存関係を追加する必要があります。

<dependency>
    <groupId>com.atlassian.confluence.compat</groupId>
    <artifactId>confluence-compat-lib</artifactId>
    <version>1.5.1</version>
</dependency>
  • ServletActionContext の場合、ServletActionContextCompatManager を使用します。
    • getRequest()getResponse()、または getContext() のみを使用する場合は Confluence 7.x と 8.x の両方が Confluence コアからすでに利用可能になっているため、com.atlassian.core.filters.ServletContextThreadLocal を使用することもできます。
  • ActionContext の場合、ActionContextCompatManager を使用します。 

以下のサンプル コードを使用して ServletActionContext を置き換え、Confluence の新旧バージョンの両方に対してプラグインが互換性を持つようにします。

例をご確認ください。
In spring-components.xml (or a Spring Configuration class)
<beans:bean id="servletActionContextCompat" class="com.atlassian.confluence.compat.struts2.servletactioncontext.ServletActionContextCompatManager"/>

// Wiring in a class 
public void setServletActionContextCompatManager(@Qualifier("servletActionContextCompat") ServletActionContextCompatManager servletActionContextCompatManager) {
    this.servletActionContextCompatManager = servletActionContextCompatManager;
}

// Usage in a class
public HttpServletRequest useActionContextForRequest() {
    return this.servletActionContextCompatManager.getRequest();
}

次のパッケージを自分の pom.xml にある amps-maven-plugin または confluence-maven-plugin の「Import-Package」セクションに追加します。

例をご確認ください。
<plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>amps-maven-plugin</artifactId>
    <configuration>
        <instructions>
            <Import-Package>
                com.opensymphony.xwork;resolution:=optional,
                com.opensymphony.webwork;resolution:=optional,
                org.apache.struts2;resolution:=optional,
                org.apache.struts2.dispatcher;resolution:=optional,
                com.opensymphony.xwork2;resolution:=optional
            </Import-Package>
        </instructions>
    </configuration>
</plugin>

置き換え用途の互換インターフェイスについて、現在の構造は次のとおりです。

/**
 * Provides version-agnostic implementations for ServletActionContext methods.
 */
interface ServletActionContextCompat {
    void setRequest(HttpServletRequest request);

    HttpServletRequest getRequest();

    void setResponse(HttpServletResponse response);

    HttpServletResponse getResponse();

    void setServletConfig(ServletConfig config);

    ServletConfig getServletConfig();
}
/**
 * Provides version-agnostic implementations for ActionContext methods.
 */
interface ActionContextCompat {
    void setApplication(Map application);

    Map getApplication();

    void setContextMap(Map contextMap);

    Map getContextMap();

    void setConversionErrors(Map conversionErrors);

    Map getConversionErrors();

    void setLocale(Locale locale);

    Locale getLocale();

    void setName(String name);

    String getName();

    void setParameters(Map parameters);

    Map getParameters();

    void setSession(Map session);

    Map getSession();

    Object get(Object key);

    void put(Object key, Object value);
}

以降のアップデート 

Milestone 8.0.0-struts-m48

  • たとえば、Struts アクションに、小文字で始まり、そのあとに大文字が続くプロパティのセッター メソッドがある場合は (例: pRoperty)、set<pRoperty> のような新しい形式に従っていることをご確認ください
例をご確認ください。
private String xHtml;

//Old format
public void setXHtml(String value) {
....
}

//New format does not have first letter of the property name in uppercase
public void setxHtml(String value) {
....
}
  • また、"do" メソッドにも動作の変更があります。
doActionMethod 

"do" 形式のアクション メソッドを試すという規則はサポートされていません。

<action name="..." method="submit"> 2  ... 3</action>

WebWork の場合:

  • ステップ 1: アクションで submit メソッドを実行しようとすると失敗します

  • ステップ 2: アクションで doSubmit メソッドを実行しようとすると、ステップ 1 が失敗した場合は失敗します

Struts 2 の場合:

  • アクションで submit メソッドを実行しようとすると失敗します

default method "doDefault" 経由での既定メソッドの呼び出しはサポートされていません。

詳細は「WebWork2 の主な変更点」をご参照ください。

  • 次の表は、このマイルストーンで解決された問題をまとめたものです。 

    キー 要約 T 作成日 更新日 期限 担当者 報告者 P ステータス ソリューション
    Loading...
    Refresh

Confluence 互換性ライブラリ 1.5.0 が近日公開

Struts 2 のアップグレードでのプラグインの相互互換性を処理するための互換性ライブラリを現在開発しており、来週のリリースを予定しています。互換性ライブラリは、アトラシアンのプラグインで最も広く使用されているクラスのみを扱います。 

以降のアップデート 

Milestone 8.0.0-struts-m39

  • UPM ベース プラグインの再インストールで発生していた 404 は、有効/無効のライフサイクルをワイヤリングすることで修正されました。

  • 次の表は、このマイルストーンで解決された問題をまとめたものです。

キー 要約 T 作成日 更新日 期限 担当者 報告者 P ステータス ソリューション
Loading...
Refresh


以降のアップデート 

Milestone 8.0.0-struts-m027

  • #tag と #bodytag のディレクティブから、#s ベースの新しい形式のコンポーネント ディレクティブに移行しました。そのため、これらのディレクティブ タグはすべて Struts 形式に移行しました。#tag/#bodytag のサポートは近日中に終了する予定です。以下に、変更が必要となる 2 つの例を示します。

#tag/#bodytag

#s ベースの新しいタグ ディレクティブ

#bodytag( "Component" "label='create.support.zip.include.tomcat'""name='includeServerLogs'" "value=includeServerLogs" "theme='aui'" "template='onofflist.vm'")}} #param ("description" "$i18n.getText('create.support.zip.include.tomcat.desc')")#end

#scomponent("label='create.support.zip.include.tomcat'""name='includeServerLogs'" "value=includeServerLogs" "theme='aui'" "template='onofflist.vm'")}} #param ("description" "$i18n.getText('create.support.zip.include.tomcat.desc')")#end

#bodytag( "TextField" "label='create.support.zip.logs.other.directory'""name='serverLogsDirectory'" "value=serverLogsDirectory" "theme='aui'")
#param ("description" "$i18n.getText('create.support.zip.logs.other.directory.desc')")
#end

#stextfield("label='create.support.zip.logs.other.directory'""name='serverLogsDirectory'" "value=serverLogsDirectory" "theme='aui'"
"description=$i18n.getText('create.support.zip.logs.other.directory.desc')")


#end クローズ タグが必要なのは Component タイプ タグのみであることにご注意ください。

  • 今後、atlassian-plugin.xml アクション ワイヤリング、またはベロシティ ファイルでの OGNL の静的メソッド呼び出しは機能しなくなります。新しいメソッドによる、対応するアクションでラップし、ベロシティ ファイルに必要な文字列/オブジェクトのみを指定する必要があります。

    • 例:

<result name="success" type="redirectwithflash">${@com.atlassian.confluence.util.GeneralUtil@getPageUrl(page)}</result>

これは、次のように置き換えられます。

<result name="success" type="redirectwithflash">${pageUrl}</result>

新しい getPageURL はアクションそのものから反映されます。

  • 編集者と添付ファイルが機能するようになりました。アトラシアンのテストでは、98% 以上の Confluence 機能がこのマイルストーンで機能することがわかりました。

  • 次の表は、このマイルストーンで解決された問題をまとめたものです。

キー 要約 T 作成日 更新日 期限 担当者 報告者 P ステータス ソリューション
Loading...
Refresh

以降のアップデート 

Milestone 8.0.0-struts-m021

  • 当初の対象は Struts 2.5.x ですが、後日、最新の Struts バージョン 6.0 (旧式の Struts スタイルでは 2.6) がリリースされる可能性があります。
  • 次のテーブルは、破損領域に関する既知の問題を追跡したものです。新規の情報が入り次第、引き続き公開するようにいたします。また、テーブルにリストされていないベロシティの Struts レンダリング統合にも破損領域がある可能性があります。

キー 要約 T 作成日 更新日 期限 担当者 報告者 P ステータス ソリューション
Loading...
Refresh


最終更新日: 2023 年 10 月 10 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.