Struts 2 のアップグレード
Confluence 8.0 では WebWork 2.1.x から Apache Struts 2 にアップデートされる予定です。
これまでは、オープンソース ライブラリを維持しながら、長い間 WebWork 2.1.x を使用してきましたが、コードベースを近代化して技術的負債を減らし、OGNL 攻撃からの安全性を高めるためにも、Struts 2 への移行を決定いたしました。
このページには、移行計画、重大な変更、今後予定されている改善点が含まれています。Struts 2 へのアップデートの進捗にともない、このページで引き続き最新情報をシェアしていきます。
- 重大な変更
- 2023 年 7 月 3 日のアップデート (compat-lib の新しいバージョン 1.6.0)
- 2023 年 1 月 19 日のアップデート (compat-lib の新しいバージョン 1.5.4)
- 2022 年 11 月 21 日のアップデート (compat-lib の新しいバージョン 1.5.3)
- 2022 年 11 月 9 日のアップデート (compat-lib の新しいバージョン 1.5.1)
- 2022 年 10 月 11 日のアップデート (8.0.0-m69)
- 2022 年 9 月 30 日のアップデート (詳細は compat-lib 1.5.0 を参照)
- 2022 年 9 月 21 日のアップデート (8.0.0-struts-m48)
- 2022 年 9 月 9 日のアップデート (8.0.0-struts-m39)
- 2022 年 8 月 30 日のアップデート (8.0.0-struts-m027)
- 2022 年 8 月 2 日のアップデート (8.0.0-struts-m020)
テスト方法
依存関係にある 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.x | Struts2 | コメント |
---|---|---|
com.opensymphony.xwork.* | com.opensymphony.xwork2.* | |
com.opensymphony.webwork.* | org.apache.struts2.* | |
DispatcherUtil | Dispatcher | |
com.opensymphony.webwork.config.Configuration | org.apache.struts2.config.Settings | |
com.opensymphony.webwork.ServletActionContext | org.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>) | #scomponent(<parameters>) #end #stextfield(<parameters>) | #tag と #bodytag のディレクティブから、#s ベースの新しい形式のコンポーネント ディレクティブに移行しました。そのため、これらのディレクティブ タグはすべて Struts 形式に移行しました。詳細と例は 8 月 30 日の更新をご参照ください。 |
//古い形式
|
//新しい形式では、プロパティ名の最初の文字が大文字になります
| たとえば、Struts アクションに、小文字で始まり、そのあとに大文字が続くプロパティのセッター メソッドがある場合は (例: pRoperty )、set<pRoperty> のような新しい形式に従っていることをご確認ください。 |
"do" 形式のアクション メソッドを試すという規則は、WebWork でサポートされています。
WebWork の場合:
| "do" 形式のアクション メソッドを試すという規則は、Struts 2 でサポートされていません。
Struts の場合:
| "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) がリリースされました。
ActionContextCompatManager.setParameters
メソッドの修正。Confluence 8.0 にインストールされたプラグインでは、下位互換性確保のために、HttpParameters
の代わりにMap<String String[]>
が返されます。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.ServletActionContext | org.apache.struts2.ServletActionContext | com.atlassian.confluence.compat.struts2 .servletactioncontext.ServletActionContextCompatManager |
com.opensymphony.xwork.ActionContext | com.opensymphony.xwork2.ActionContext | com.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" 形式のアクション メソッドを試すという規則はサポートされていません。
WebWork の場合:
Struts 2 の場合:
|
---|---|
default method | "doDefault" 経由での既定メソッドの呼び出しはサポートされていません。 |
詳細は「WebWork2 の主な変更点」をご参照ください。
- 次の表は、このマイルストーンで解決された問題をまとめたものです。
Confluence 互換性ライブラリ 1.5.0 が近日公開
Struts 2 のアップグレードでのプラグインの相互互換性を処理するための互換性ライブラリを現在開発しており、来週のリリースを予定しています。互換性ライブラリは、アトラシアンのプラグインで最も広く使用されているクラスのみを扱います。
以降のアップデート
Milestone 8.0.0-struts-m39
UPM ベース プラグインの再インストールで発生していた 404 は、有効/無効のライフサイクルをワイヤリングすることで修正されました。
- 次の表は、このマイルストーンで解決された問題をまとめたものです。
以降のアップデート
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'") | #stextfield("label='create.support.zip.logs.other.directory'""name='serverLogsDirectory'" "value=serverLogsDirectory" "theme='aui'"
|
今後、
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 機能がこのマイルストーンで機能することがわかりました。
- 次の表は、このマイルストーンで解決された問題をまとめたものです。
以降のアップデート
Milestone 8.0.0-struts-m021
- 当初の対象は Struts 2.5.x ですが、後日、最新の Struts バージョン 6.0 (旧式の Struts スタイルでは 2.6) がリリースされる可能性があります。
- 次のテーブルは、破損領域に関する既知の問題を追跡したものです。新規の情報が入り次第、引き続き公開するようにいたします。また、テーブルにリストされていないベロシティの Struts レンダリング統合にも破損領域がある可能性があります。