diff --git "a/.claude/skills/nabledge-1.4/docs/releases/releases/releases-nablarch-1.4.10-releasenote-JSON\350\252\255\343\201\277\345\217\226\343\202\212\345\244\261\346\225\227\343\202\261\343\203\274\343\202\271.md" "b/.claude/skills/nabledge-1.4/docs/releases/releases/releases-nablarch-1.4.10-releasenote-JSON\350\252\255\343\201\277\345\217\226\343\202\212\345\244\261\346\225\227\343\202\261\343\203\274\343\202\271.md" index c10c8adb6..48c918282 100644 --- "a/.claude/skills/nabledge-1.4/docs/releases/releases/releases-nablarch-1.4.10-releasenote-JSON\350\252\255\343\201\277\345\217\226\343\202\212\345\244\261\346\225\227\343\202\261\343\203\274\343\202\271.md" +++ "b/.claude/skills/nabledge-1.4/docs/releases/releases/releases-nablarch-1.4.10-releasenote-JSON\350\252\255\343\201\277\345\217\226\343\202\212\345\244\261\346\225\227\343\202\261\343\203\274\343\202\271.md" @@ -1,16 +1,29 @@ # JSON読み取り失敗ケース -①配列が入れ子かつ、内部の配列がオブジェクトの最後の項目でない場合、実行時例外が発生する。 -以下のような構造で実行時例外が発生する。 -②オブジェクトの最後の項目の値が":"1文字の場合、実行時例外が発生する。 -":"を値に持つ項目より後に項目がある場合は例外は発生しない。 +### ①配列が入れ子かつ、内部の配列がオブジェクトの最後の項目でない場合、実行時例外が発生する。 + +#### 以下のような構造で実行時例外が発生する。 + +### ②オブジェクトの最後の項目の値が":"1文字の場合、実行時例外が発生する。 + +#### ":"を値に持つ項目より後に項目がある場合は例外は発生しない。 + ←NG 例外が発生する。 ←OK 例外は発生せず記述した通りに読み取られる。 + ←NG 例外が発生する。 -③オブジェクトの最後の項目の値が"{"、"}"、"["、"]"のいずれか1文字の場合、該当項目が読み取られない。 -最後の項目でなければ記述した通りに読み取られる。 + +### ③オブジェクトの最後の項目の値が"{"、"}"、"["、"]"のいずれか1文字の場合、該当項目が読み取られない。 + +#### 最後の項目でなければ記述した通りに読み取られる。 + ←NG keyも"{"も読み取られない。 ←OK key1~key3まで記述した通りに読み取られる。 + 空のオブジェクトになる。 + ←NG key1の項目だけ読み取られる。 -④配列の値が"}"、"["のいずれか1文字の場合、該当する配列の要素が読み取られない。 + +### ④配列の値が"}"、"["のいずれか1文字の場合、該当する配列の要素が読み取られない。 + ←NG keyの値は空配列として読み取られる。 + ←NG keyの値は"value"だけを要素にもつ配列として読み取られる。 diff --git "a/.claude/skills/nabledge-1.4/docs/releases/releases/releases-nablarch-1.4.9-releasenote-\346\261\216\347\224\250\343\203\207\343\203\274\343\202\277\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\203\210XXE\350\204\206\345\274\261\346\200\247.md" "b/.claude/skills/nabledge-1.4/docs/releases/releases/releases-nablarch-1.4.9-releasenote-\346\261\216\347\224\250\343\203\207\343\203\274\343\202\277\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\203\210XXE\350\204\206\345\274\261\346\200\247.md" index 8ca571c38..1877871fa 100644 --- "a/.claude/skills/nabledge-1.4/docs/releases/releases/releases-nablarch-1.4.9-releasenote-\346\261\216\347\224\250\343\203\207\343\203\274\343\202\277\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\203\210XXE\350\204\206\345\274\261\346\200\247.md" +++ "b/.claude/skills/nabledge-1.4/docs/releases/releases/releases-nablarch-1.4.9-releasenote-\346\261\216\347\224\250\343\203\207\343\203\274\343\202\277\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\203\210XXE\350\204\206\345\274\261\346\200\247.md" @@ -1,81 +1,159 @@ # ■【不具合報告】Nablarch 汎用データフォーマット XXE脆弱性について -この度、Nablarch 汎用データフォーマット機能について、後述する脆弱性が発見されました。 -本報告書にて、脆弱性の内容、システム影響、および対応方法についてご報告致します。 -1. 汎用データフォーマット機能の概要 -システムで扱う多様なデータ形式に対応した汎用の入出力ライブラリ機能を提供します。 -・ 固定長 -・ 可変長(csvやtsvなど) -・ JSON -・ XML -Nablarchドキュメント 「汎用データフォーマット」 -Nablarch Application Framework 解説書:汎用データフォーマット機能 -2. 本脆弱性について -2.1. 脆弱性の概要 +### この度、Nablarch 汎用データフォーマット機能について、後述する脆弱性が発見されました。 + +### 本報告書にて、脆弱性の内容、システム影響、および対応方法についてご報告致します。 + +### 1. 汎用データフォーマット機能の概要 + +#### システムで扱う多様なデータ形式に対応した汎用の入出力ライブラリ機能を提供します。 + +#### ・ 固定長 + +#### ・ 可変長(csvやtsvなど) + +#### ・ JSON + +#### ・ XML + +#### Nablarchドキュメント 「汎用データフォーマット」 + +#### Nablarch Application Framework 解説書:汎用データフォーマット機能 + +### 2. 本脆弱性について + +#### 2.1. 脆弱性の概要 + 汎用データフォーマット機能にて、XML文書を読み込むときにXXE(XML External Entity)攻撃を受ける可能性があります。 + XXE攻撃はNablarch特有のものではなく一般的な攻撃方法となります。 + XML文書の構造を定義するためのDTD(Document Type Definition)の機能を利用して攻撃を行います。 + 詳細は以下のサイト等を参照ください。 + https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing -2.2. 本脆弱性が発生するNablarchのバージョン + +#### 2.2. 本脆弱性が発生するNablarchのバージョン + 5系と1.4系の全てのバージョンで発生します。 -2.3. 本脆弱性の対象となるシステム + +#### 2.3. 本脆弱性の対象となるシステム + 汎用データフォーマット機能を利用してXML文書を入力しているシステム + 典型的な使用ケースとして以下が挙げられます。 + ・ XML電文を受け取るHTTPメッセージングシステム + ・ XMLファイルを入力する処理(バッチ,画面等の処理形態に依存しない) -2.4. 本脆弱性によるシステム影響 + +#### 2.4. 本脆弱性によるシステム影響 + XML文書を入力する時にXXE攻撃を受ける可能性があります。 + 攻撃パターンは多岐に渡りますが、情報漏えいやシステム停止が発生する恐れがあります。 -2.5. 攻撃方法 + +#### 2.5. 攻撃方法 + 典型的には以下のような攻撃が挙げられます。 + ・ 本来外部から読み取れないはずのファイルをシステム経由で読み取る + ・ システムのスローダウンないしシステム停止を発生させる + ※上記は一例です。詳細はOWASP等のサイトを参照ください。 + https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing + 【ファイル読み取りの例】 + 以下の例では、要素にsecret.txtの内容が展開されます。 + + + ]> + + 【DoS攻撃の例】 + 以下の例では、処理が戻らないリソースに意図的にアクセスすることで、システムの処理を停止させます。 + + + ]>&xxe; -3. 不具合原因と対応方法(Nablarch) -NablarchはXML文書を扱うためにXMLライブラリ(JAXP)を使用しています。 -デフォルトではDTDが使用可能になっており、これを明示的に使用不可に設定していないことが不具合原因となります。 -よって、対処としては、XMLライブラリを使用する際にDTDを使用できない設定を行います。 -※この対処方法はOWASPが提示した対応方法のうち第一に推奨されるものです。 -https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXP_DocumentBuilderFactory.2C_SAXParserFactory_and_DOM4J -バージョンアップ後は、DTDを使用したXML文書が入力された場合は読み込み処理が停止し、例外が発生するようになります。 -これによりXXE攻撃が無効になります。 -DTDを使用したXML文書が入力された場合、入出力データ不正により処理が継続できないことを示す例外クラス -nablarch.core.dataformat.InvalidDataFormatException がスローされます。これは、不正なフォーマットのXML文書を入力した場合と同じ動作です。 -4. 対応方法(Nablarch利用プロジェクト) -4.1. 基本的な対応方法 -本脆弱性の対象となるシステムは、最新版へのバージョンアップを行ってください。 -バージョンアップにより、DTDが使用できなくなりXXE攻撃が無効になります。 -もし意図的にDTDを使用しているシステムがあれば、XML Schema等の代替技術に置き換える等の対処を行い、DTDの使用を止めるようにしてください。 -4.2. バージョンアップが困難な場合の回避方法 + +### 3. 不具合原因と対応方法(Nablarch) + +#### NablarchはXML文書を扱うためにXMLライブラリ(JAXP)を使用しています。 + +#### デフォルトではDTDが使用可能になっており、これを明示的に使用不可に設定していないことが不具合原因となります。 + +#### よって、対処としては、XMLライブラリを使用する際にDTDを使用できない設定を行います。 + +#### ※この対処方法はOWASPが提示した対応方法のうち第一に推奨されるものです。 + +#### https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXP_DocumentBuilderFactory.2C_SAXParserFactory_and_DOM4J + +#### バージョンアップ後は、DTDを使用したXML文書が入力された場合は読み込み処理が停止し、例外が発生するようになります。 + +#### これによりXXE攻撃が無効になります。 + +#### DTDを使用したXML文書が入力された場合、入出力データ不正により処理が継続できないことを示す例外クラス + +#### nablarch.core.dataformat.InvalidDataFormatException がスローされます。これは、不正なフォーマットのXML文書を入力した場合と同じ動作です。 + +### 4. 対応方法(Nablarch利用プロジェクト) + +#### 4.1. 基本的な対応方法 + +#### 本脆弱性の対象となるシステムは、最新版へのバージョンアップを行ってください。 + +#### バージョンアップにより、DTDが使用できなくなりXXE攻撃が無効になります。 + +#### もし意図的にDTDを使用しているシステムがあれば、XML Schema等の代替技術に置き換える等の対処を行い、DTDの使用を止めるようにしてください。 + +#### 4.2. バージョンアップが困難な場合の回避方法 + 推奨はしかねますが、「XXE攻撃を受ける可能性が全くない」と判断できる場合に限り、 + リスクを許容した上でバージョンアップを行わないという選択肢もあり得ます。 + 【XXE攻撃を受けないと判断する例】 + ・ システム内部で作成したXML文書しか扱わない + ・ システム間で事前に取り決めを行ったフォーマットだけしか扱わない + このように、XXE攻撃に繋がるようなDTDが一切使われない場合は、 + 脆弱性を攻撃される可能性がないと考えてリスクを許容するという判断もあり得えます。 + ※ただし、今後のシステム改修で扱うXML文書の種類が増える可能性があったり、内部の関係者による攻撃の可能性には対応できません。 + DTDが使用されないことが保証できない場合、回避方法はありません。 -4.3. 本件に関わるJDKのバグについて + +#### 4.3. 本件に関わるJDKのバグについて + 以下のバージョンのJDKにはAPIに不具合があり、DTDの無効化を行った場合にNullPointerExceptionが発生します。 + ・ JDK6 6u65 未満 + ・ JDK7 7u6 b15 未満 + 本バグを回避するには、JDKのバージョンをアップする必要があります。 + 不具合詳細は 以下を参照ください。 + JDK-7157610 : NullPointerException occurs when parsing XML doc + https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7157610 diff --git "a/.claude/skills/nabledge-1.4/knowledge/releases/releases/releases-nablarch-1.4.10-releasenote-JSON\350\252\255\343\201\277\345\217\226\343\202\212\345\244\261\346\225\227\343\202\261\343\203\274\343\202\271.json" "b/.claude/skills/nabledge-1.4/knowledge/releases/releases/releases-nablarch-1.4.10-releasenote-JSON\350\252\255\343\201\277\345\217\226\343\202\212\345\244\261\346\225\227\343\202\261\343\203\274\343\202\271.json" index 4987c807d..29292de71 100644 --- "a/.claude/skills/nabledge-1.4/knowledge/releases/releases/releases-nablarch-1.4.10-releasenote-JSON\350\252\255\343\201\277\345\217\226\343\202\212\345\244\261\346\225\227\343\202\261\343\203\274\343\202\271.json" +++ "b/.claude/skills/nabledge-1.4/knowledge/releases/releases/releases-nablarch-1.4.10-releasenote-JSON\350\252\255\343\201\277\345\217\226\343\202\212\345\244\261\346\225\227\343\202\261\343\203\274\343\202\271.json" @@ -4,5 +4,130 @@ "content": "①配列が入れ子かつ、内部の配列がオブジェクトの最後の項目でない場合、実行時例外が発生する。\n以下のような構造で実行時例外が発生する。\n②オブジェクトの最後の項目の値が\":\"1文字の場合、実行時例外が発生する。\n\":\"を値に持つ項目より後に項目がある場合は例外は発生しない。\n←NG 例外が発生する。 ←OK 例外は発生せず記述した通りに読み取られる。\n←NG 例外が発生する。\n③オブジェクトの最後の項目の値が\"{\"、\"}\"、\"[\"、\"]\"のいずれか1文字の場合、該当項目が読み取られない。\n最後の項目でなければ記述した通りに読み取られる。\n←NG keyも\"{\"も読み取られない。 ←OK key1~key3まで記述した通りに読み取られる。\n空のオブジェクトになる。\n←NG key1の項目だけ読み取られる。\n④配列の値が\"}\"、\"[\"のいずれか1文字の場合、該当する配列の要素が読み取られない。\n←NG keyの値は空配列として読み取られる。\n←NG keyの値は\"value\"だけを要素にもつ配列として読み取られる。", "no_knowledge_content": false, "sections": [], - "sheet_type": "P2" + "sheet_type": "P2", + "p2_headings": [ + { + "text": "①配列が入れ子かつ、内部の配列がオブジェクトの最後の項目でない場合、実行時例外が発生する。", + "level": 3 + }, + { + "text": "以下のような構造で実行時例外が発生する。", + "level": 4 + }, + { + "text": "②オブジェクトの最後の項目の値が\":\"1文字の場合、実行時例外が発生する。", + "level": 3 + }, + { + "text": "\":\"を値に持つ項目より後に項目がある場合は例外は発生しない。", + "level": 4 + }, + { + "text": "③オブジェクトの最後の項目の値が\"{\"、\"}\"、\"[\"、\"]\"のいずれか1文字の場合、該当項目が読み取られない。", + "level": 3 + }, + { + "text": "最後の項目でなければ記述した通りに読み取られる。", + "level": 4 + }, + { + "text": "④配列の値が\"}\"、\"[\"のいずれか1文字の場合、該当する配列の要素が読み取られない。", + "level": 3 + } + ], + "p2_raw_lines": [ + [ + [ + 1, + "①配列が入れ子かつ、内部の配列がオブジェクトの最後の項目でない場合、実行時例外が発生する。" + ] + ], + [ + [ + 2, + "以下のような構造で実行時例外が発生する。" + ] + ], + [ + [ + 1, + "②オブジェクトの最後の項目の値が\":\"1文字の場合、実行時例外が発生する。" + ] + ], + [ + [ + 2, + "\":\"を値に持つ項目より後に項目がある場合は例外は発生しない。" + ] + ], + [ + [ + 5, + "←NG 例外が発生する。" + ], + [ + 12, + "←OK 例外は発生せず記述した通りに読み取られる。" + ] + ], + [ + [ + 5, + "←NG 例外が発生する。" + ] + ], + [ + [ + 1, + "③オブジェクトの最後の項目の値が\"{\"、\"}\"、\"[\"、\"]\"のいずれか1文字の場合、該当項目が読み取られない。" + ] + ], + [ + [ + 2, + "最後の項目でなければ記述した通りに読み取られる。" + ] + ], + [ + [ + 5, + "←NG keyも\"{\"も読み取られない。" + ], + [ + 12, + "←OK key1~key3まで記述した通りに読み取られる。" + ] + ], + [ + [ + 5, + "空のオブジェクトになる。" + ] + ], + [ + [ + 5, + "←NG key1の項目だけ読み取られる。" + ] + ], + [ + [ + 1, + "④配列の値が\"}\"、\"[\"のいずれか1文字の場合、該当する配列の要素が読み取られない。" + ] + ], + [ + [ + 5, + "←NG keyの値は空配列として読み取られる。" + ] + ], + [ + [ + 5, + "←NG keyの値は\"value\"だけを要素にもつ配列として読み取られる。" + ] + ] + ], + "p2_base_col": 0 } \ No newline at end of file diff --git "a/.claude/skills/nabledge-1.4/knowledge/releases/releases/releases-nablarch-1.4.9-releasenote-\346\261\216\347\224\250\343\203\207\343\203\274\343\202\277\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\203\210XXE\350\204\206\345\274\261\346\200\247.json" "b/.claude/skills/nabledge-1.4/knowledge/releases/releases/releases-nablarch-1.4.9-releasenote-\346\261\216\347\224\250\343\203\207\343\203\274\343\202\277\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\203\210XXE\350\204\206\345\274\261\346\200\247.json" index 2885e2a19..c6170fc25 100644 --- "a/.claude/skills/nabledge-1.4/knowledge/releases/releases/releases-nablarch-1.4.9-releasenote-\346\261\216\347\224\250\343\203\207\343\203\274\343\202\277\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\203\210XXE\350\204\206\345\274\261\346\200\247.json" +++ "b/.claude/skills/nabledge-1.4/knowledge/releases/releases/releases-nablarch-1.4.9-releasenote-\346\261\216\347\224\250\343\203\207\343\203\274\343\202\277\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\203\210XXE\350\204\206\345\274\261\346\200\247.json" @@ -4,5 +4,616 @@ "content": "この度、Nablarch 汎用データフォーマット機能について、後述する脆弱性が発見されました。\n本報告書にて、脆弱性の内容、システム影響、および対応方法についてご報告致します。\n1. 汎用データフォーマット機能の概要\nシステムで扱う多様なデータ形式に対応した汎用の入出力ライブラリ機能を提供します。\n・ 固定長\n・ 可変長(csvやtsvなど)\n・ JSON\n・ XML\nNablarchドキュメント 「汎用データフォーマット」\nNablarch Application Framework 解説書:汎用データフォーマット機能\n2. 本脆弱性について\n2.1. 脆弱性の概要\n汎用データフォーマット機能にて、XML文書を読み込むときにXXE(XML External Entity)攻撃を受ける可能性があります。\nXXE攻撃はNablarch特有のものではなく一般的な攻撃方法となります。\nXML文書の構造を定義するためのDTD(Document Type Definition)の機能を利用して攻撃を行います。\n詳細は以下のサイト等を参照ください。\nhttps://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing\n2.2. 本脆弱性が発生するNablarchのバージョン\n5系と1.4系の全てのバージョンで発生します。\n2.3. 本脆弱性の対象となるシステム\n汎用データフォーマット機能を利用してXML文書を入力しているシステム\n典型的な使用ケースとして以下が挙げられます。\n・ XML電文を受け取るHTTPメッセージングシステム\n・ XMLファイルを入力する処理(バッチ,画面等の処理形態に依存しない)\n2.4. 本脆弱性によるシステム影響\nXML文書を入力する時にXXE攻撃を受ける可能性があります。\n攻撃パターンは多岐に渡りますが、情報漏えいやシステム停止が発生する恐れがあります。\n2.5. 攻撃方法\n典型的には以下のような攻撃が挙げられます。\n・ 本来外部から読み取れないはずのファイルをシステム経由で読み取る\n・ システムのスローダウンないしシステム停止を発生させる\n※上記は一例です。詳細はOWASP等のサイトを参照ください。\nhttps://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing\n【ファイル読み取りの例】\n以下の例では、要素にsecret.txtの内容が展開されます。\n\n\n]>\n\n【DoS攻撃の例】\n以下の例では、処理が戻らないリソースに意図的にアクセスすることで、システムの処理を停止させます。\n\n\n]>&xxe;\n3. 不具合原因と対応方法(Nablarch)\nNablarchはXML文書を扱うためにXMLライブラリ(JAXP)を使用しています。\nデフォルトではDTDが使用可能になっており、これを明示的に使用不可に設定していないことが不具合原因となります。\nよって、対処としては、XMLライブラリを使用する際にDTDを使用できない設定を行います。\n※この対処方法はOWASPが提示した対応方法のうち第一に推奨されるものです。\nhttps://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXP_DocumentBuilderFactory.2C_SAXParserFactory_and_DOM4J\nバージョンアップ後は、DTDを使用したXML文書が入力された場合は読み込み処理が停止し、例外が発生するようになります。\nこれによりXXE攻撃が無効になります。\nDTDを使用したXML文書が入力された場合、入出力データ不正により処理が継続できないことを示す例外クラス\nnablarch.core.dataformat.InvalidDataFormatException がスローされます。これは、不正なフォーマットのXML文書を入力した場合と同じ動作です。\n4. 対応方法(Nablarch利用プロジェクト)\n4.1. 基本的な対応方法\n本脆弱性の対象となるシステムは、最新版へのバージョンアップを行ってください。\nバージョンアップにより、DTDが使用できなくなりXXE攻撃が無効になります。\nもし意図的にDTDを使用しているシステムがあれば、XML Schema等の代替技術に置き換える等の対処を行い、DTDの使用を止めるようにしてください。\n4.2. バージョンアップが困難な場合の回避方法\n推奨はしかねますが、「XXE攻撃を受ける可能性が全くない」と判断できる場合に限り、\nリスクを許容した上でバージョンアップを行わないという選択肢もあり得ます。\n【XXE攻撃を受けないと判断する例】\n・ システム内部で作成したXML文書しか扱わない\n・ システム間で事前に取り決めを行ったフォーマットだけしか扱わない\nこのように、XXE攻撃に繋がるようなDTDが一切使われない場合は、\n脆弱性を攻撃される可能性がないと考えてリスクを許容するという判断もあり得えます。\n※ただし、今後のシステム改修で扱うXML文書の種類が増える可能性があったり、内部の関係者による攻撃の可能性には対応できません。\nDTDが使用されないことが保証できない場合、回避方法はありません。\n4.3. 本件に関わるJDKのバグについて\n以下のバージョンのJDKにはAPIに不具合があり、DTDの無効化を行った場合にNullPointerExceptionが発生します。\n・ JDK6 6u65 未満\n・ JDK7 7u6 b15 未満\n本バグを回避するには、JDKのバージョンをアップする必要があります。\n不具合詳細は 以下を参照ください。\nJDK-7157610 : NullPointerException occurs when parsing XML doc\nhttps://bugs.java.com/bugdatabase/view_bug.do?bug_id=7157610", "no_knowledge_content": false, "sections": [], - "sheet_type": "P2" + "sheet_type": "P2", + "p2_headings": [ + { + "text": "この度、Nablarch 汎用データフォーマット機能について、後述する脆弱性が発見されました。", + "level": 3 + }, + { + "text": "本報告書にて、脆弱性の内容、システム影響、および対応方法についてご報告致します。", + "level": 3 + }, + { + "text": "1. 汎用データフォーマット機能の概要", + "level": 3 + }, + { + "text": "システムで扱う多様なデータ形式に対応した汎用の入出力ライブラリ機能を提供します。", + "level": 4 + }, + { + "text": "・ 固定長", + "level": 4 + }, + { + "text": "・ 可変長(csvやtsvなど)", + "level": 4 + }, + { + "text": "・ JSON", + "level": 4 + }, + { + "text": "・ XML", + "level": 4 + }, + { + "text": "Nablarchドキュメント 「汎用データフォーマット」", + "level": 4 + }, + { + "text": "Nablarch Application Framework 解説書:汎用データフォーマット機能", + "level": 4 + }, + { + "text": "2. 本脆弱性について", + "level": 3 + }, + { + "text": "2.1. 脆弱性の概要", + "level": 4 + }, + { + "text": "2.2. 本脆弱性が発生するNablarchのバージョン", + "level": 4 + }, + { + "text": "2.3. 本脆弱性の対象となるシステム", + "level": 4 + }, + { + "text": "2.4. 本脆弱性によるシステム影響", + "level": 4 + }, + { + "text": "2.5. 攻撃方法", + "level": 4 + }, + { + "text": "3. 不具合原因と対応方法(Nablarch)", + "level": 3 + }, + { + "text": "NablarchはXML文書を扱うためにXMLライブラリ(JAXP)を使用しています。", + "level": 4 + }, + { + "text": "デフォルトではDTDが使用可能になっており、これを明示的に使用不可に設定していないことが不具合原因となります。", + "level": 4 + }, + { + "text": "よって、対処としては、XMLライブラリを使用する際にDTDを使用できない設定を行います。", + "level": 4 + }, + { + "text": "※この対処方法はOWASPが提示した対応方法のうち第一に推奨されるものです。", + "level": 4 + }, + { + "text": "https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXP_DocumentBuilderFactory.2C_SAXParserFactory_and_DOM4J", + "level": 4 + }, + { + "text": "バージョンアップ後は、DTDを使用したXML文書が入力された場合は読み込み処理が停止し、例外が発生するようになります。", + "level": 4 + }, + { + "text": "これによりXXE攻撃が無効になります。", + "level": 4 + }, + { + "text": "DTDを使用したXML文書が入力された場合、入出力データ不正により処理が継続できないことを示す例外クラス", + "level": 4 + }, + { + "text": "nablarch.core.dataformat.InvalidDataFormatException がスローされます。これは、不正なフォーマットのXML文書を入力した場合と同じ動作です。", + "level": 4 + }, + { + "text": "4. 対応方法(Nablarch利用プロジェクト)", + "level": 3 + }, + { + "text": "4.1. 基本的な対応方法", + "level": 4 + }, + { + "text": "本脆弱性の対象となるシステムは、最新版へのバージョンアップを行ってください。", + "level": 4 + }, + { + "text": "バージョンアップにより、DTDが使用できなくなりXXE攻撃が無効になります。", + "level": 4 + }, + { + "text": "もし意図的にDTDを使用しているシステムがあれば、XML Schema等の代替技術に置き換える等の対処を行い、DTDの使用を止めるようにしてください。", + "level": 4 + }, + { + "text": "4.2. バージョンアップが困難な場合の回避方法", + "level": 4 + }, + { + "text": "4.3. 本件に関わるJDKのバグについて", + "level": 4 + } + ], + "p2_raw_lines": [ + [ + [ + 1, + "この度、Nablarch 汎用データフォーマット機能について、後述する脆弱性が発見されました。" + ] + ], + [ + [ + 1, + "本報告書にて、脆弱性の内容、システム影響、および対応方法についてご報告致します。" + ] + ], + [ + [ + 1, + "1. 汎用データフォーマット機能の概要" + ] + ], + [ + [ + 2, + "システムで扱う多様なデータ形式に対応した汎用の入出力ライブラリ機能を提供します。" + ] + ], + [ + [ + 2, + "・ 固定長" + ] + ], + [ + [ + 2, + "・ 可変長(csvやtsvなど)" + ] + ], + [ + [ + 2, + "・ JSON" + ] + ], + [ + [ + 2, + "・ XML" + ] + ], + [ + [ + 2, + "Nablarchドキュメント 「汎用データフォーマット」" + ] + ], + [ + [ + 2, + "Nablarch Application Framework 解説書:汎用データフォーマット機能" + ] + ], + [ + [ + 1, + "2. 本脆弱性について" + ] + ], + [ + [ + 2, + "2.1. 脆弱性の概要" + ] + ], + [ + [ + 3, + "汎用データフォーマット機能にて、XML文書を読み込むときにXXE(XML External Entity)攻撃を受ける可能性があります。" + ] + ], + [ + [ + 3, + "XXE攻撃はNablarch特有のものではなく一般的な攻撃方法となります。" + ] + ], + [ + [ + 3, + "XML文書の構造を定義するためのDTD(Document Type Definition)の機能を利用して攻撃を行います。" + ] + ], + [ + [ + 3, + "詳細は以下のサイト等を参照ください。" + ] + ], + [ + [ + 3, + "https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing" + ] + ], + [ + [ + 2, + "2.2. 本脆弱性が発生するNablarchのバージョン" + ] + ], + [ + [ + 3, + "5系と1.4系の全てのバージョンで発生します。" + ] + ], + [ + [ + 2, + "2.3. 本脆弱性の対象となるシステム" + ] + ], + [ + [ + 3, + "汎用データフォーマット機能を利用してXML文書を入力しているシステム" + ] + ], + [ + [ + 3, + "典型的な使用ケースとして以下が挙げられます。" + ] + ], + [ + [ + 3, + "・ XML電文を受け取るHTTPメッセージングシステム" + ] + ], + [ + [ + 3, + "・ XMLファイルを入力する処理(バッチ,画面等の処理形態に依存しない)" + ] + ], + [ + [ + 2, + "2.4. 本脆弱性によるシステム影響" + ] + ], + [ + [ + 3, + "XML文書を入力する時にXXE攻撃を受ける可能性があります。" + ] + ], + [ + [ + 3, + "攻撃パターンは多岐に渡りますが、情報漏えいやシステム停止が発生する恐れがあります。" + ] + ], + [ + [ + 2, + "2.5. 攻撃方法" + ] + ], + [ + [ + 3, + "典型的には以下のような攻撃が挙げられます。" + ] + ], + [ + [ + 3, + "・ 本来外部から読み取れないはずのファイルをシステム経由で読み取る" + ] + ], + [ + [ + 3, + "・ システムのスローダウンないしシステム停止を発生させる" + ] + ], + [ + [ + 3, + "※上記は一例です。詳細はOWASP等のサイトを参照ください。" + ] + ], + [ + [ + 3, + "https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing" + ] + ], + [ + [ + 3, + "【ファイル読み取りの例】" + ] + ], + [ + [ + 3, + "以下の例では、要素にsecret.txtの内容が展開されます。" + ] + ], + [ + [ + 3, + "" + ] + ], + [ + [ + 3, + "" + ] + ], + [ + [ + 3, + "]>" + ] + ], + [ + [ + 3, + "" + ] + ], + [ + [ + 3, + "【DoS攻撃の例】" + ] + ], + [ + [ + 3, + "以下の例では、処理が戻らないリソースに意図的にアクセスすることで、システムの処理を停止させます。" + ] + ], + [ + [ + 3, + "" + ] + ], + [ + [ + 3, + "" + ] + ], + [ + [ + 3, + "]>&xxe;" + ] + ], + [ + [ + 1, + "3. 不具合原因と対応方法(Nablarch)" + ] + ], + [ + [ + 2, + "NablarchはXML文書を扱うためにXMLライブラリ(JAXP)を使用しています。" + ] + ], + [ + [ + 2, + "デフォルトではDTDが使用可能になっており、これを明示的に使用不可に設定していないことが不具合原因となります。" + ] + ], + [ + [ + 2, + "よって、対処としては、XMLライブラリを使用する際にDTDを使用できない設定を行います。" + ] + ], + [ + [ + 2, + "※この対処方法はOWASPが提示した対応方法のうち第一に推奨されるものです。" + ] + ], + [ + [ + 2, + "https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXP_DocumentBuilderFactory.2C_SAXParserFactory_and_DOM4J" + ] + ], + [ + [ + 2, + "バージョンアップ後は、DTDを使用したXML文書が入力された場合は読み込み処理が停止し、例外が発生するようになります。" + ] + ], + [ + [ + 2, + "これによりXXE攻撃が無効になります。" + ] + ], + [ + [ + 2, + "DTDを使用したXML文書が入力された場合、入出力データ不正により処理が継続できないことを示す例外クラス" + ] + ], + [ + [ + 2, + "nablarch.core.dataformat.InvalidDataFormatException がスローされます。これは、不正なフォーマットのXML文書を入力した場合と同じ動作です。" + ] + ], + [ + [ + 1, + "4. 対応方法(Nablarch利用プロジェクト)" + ] + ], + [ + [ + 2, + "4.1. 基本的な対応方法" + ] + ], + [ + [ + 2, + "本脆弱性の対象となるシステムは、最新版へのバージョンアップを行ってください。" + ] + ], + [ + [ + 2, + "バージョンアップにより、DTDが使用できなくなりXXE攻撃が無効になります。" + ] + ], + [ + [ + 2, + "もし意図的にDTDを使用しているシステムがあれば、XML Schema等の代替技術に置き換える等の対処を行い、DTDの使用を止めるようにしてください。" + ] + ], + [ + [ + 2, + "4.2. バージョンアップが困難な場合の回避方法" + ] + ], + [ + [ + 3, + "推奨はしかねますが、「XXE攻撃を受ける可能性が全くない」と判断できる場合に限り、" + ] + ], + [ + [ + 3, + "リスクを許容した上でバージョンアップを行わないという選択肢もあり得ます。" + ] + ], + [ + [ + 3, + "【XXE攻撃を受けないと判断する例】" + ] + ], + [ + [ + 3, + "・ システム内部で作成したXML文書しか扱わない" + ] + ], + [ + [ + 3, + "・ システム間で事前に取り決めを行ったフォーマットだけしか扱わない" + ] + ], + [ + [ + 3, + "このように、XXE攻撃に繋がるようなDTDが一切使われない場合は、" + ] + ], + [ + [ + 3, + "脆弱性を攻撃される可能性がないと考えてリスクを許容するという判断もあり得えます。" + ] + ], + [ + [ + 3, + "※ただし、今後のシステム改修で扱うXML文書の種類が増える可能性があったり、内部の関係者による攻撃の可能性には対応できません。" + ] + ], + [ + [ + 3, + "DTDが使用されないことが保証できない場合、回避方法はありません。" + ] + ], + [ + [ + 2, + "4.3. 本件に関わるJDKのバグについて" + ] + ], + [ + [ + 3, + "以下のバージョンのJDKにはAPIに不具合があり、DTDの無効化を行った場合にNullPointerExceptionが発生します。" + ] + ], + [ + [ + 3, + "・ JDK6 6u65 未満" + ] + ], + [ + [ + 3, + "・ JDK7 7u6 b15 未満" + ] + ], + [ + [ + 3, + "本バグを回避するには、JDKのバージョンをアップする必要があります。" + ] + ], + [ + [ + 3, + "不具合詳細は 以下を参照ください。" + ] + ], + [ + [ + 3, + "JDK-7157610 : NullPointerException occurs when parsing XML doc" + ] + ], + [ + [ + 3, + "https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7157610" + ] + ] + ], + "p2_base_col": 0 } \ No newline at end of file diff --git a/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-architecture.md b/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-architecture.md index d0e322f88..61321f24f 100644 --- a/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-architecture.md +++ b/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-architecture.md @@ -41,9 +41,12 @@ Nablarchアプリケーションフレームワークの主な構成要素を以 > (個別のハンドラの前後に処理を追加したい場合には [インターセプタ(interceptor)](../../about/about-nablarch/about-nablarch-architecture.md#nablarch-architecture-interceptor) を使用することを推奨する。) > 個別のハンドラで実装した場合 + > 個々のハンドラの責務が明確になるため、テストが容易であり保守性が高くなる。 > また、ハンドラ毎処理が独立しているため、共通処理の抜き差しが容易に出来る。 + > 親クラスに共通処理を実装した場合 + > 共通処理が増えた場合に親クラスが肥大化し複数の責務を持つことになる。 > これは、メンテナンス時のコストが増大するだけではなく、テストも複雑になり不具合の温床ともなる。 > 本来継承すべきクラスを正しく継承をしなかった場合でも、共通処理の内容によっては異常終了とならずに処理が実行出来るため、 diff --git a/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-big-picture.md b/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-big-picture.md index e6edff7d4..40cade627 100644 --- a/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-big-picture.md +++ b/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-big-picture.md @@ -10,27 +10,34 @@ Nablarchアプリケーションフレームワークは、ウェブやバッチ Nablarchアプリケーションフレームワークは、以下の特長がある。 様々な処理方式に対応できる + Nablarchアプリケーションフレームワークでは、 実行制御基盤および [ライブラリ](../../component/libraries/libraries-libraries.md#library) を組み合わせることにより、 様々な処理方式に対応できる。 実行制御基盤 + * [ウェブアプリケーション編](../../processing-pattern/web-application/web-application-web.md#web-application) * [ウェブサービス編](../../processing-pattern/restful-web-service/restful-web-service-web-service.md#web-service) * [バッチアプリケーション編](../../processing-pattern/nablarch-batch/nablarch-batch-batch.md#batch-application) * [メッセージング編](../../processing-pattern/db-messaging/db-messaging-messaging.md#messaging) + すべての実行制御基盤で共通のアーキテクチャを採用している + [共通アーキテクチャ](../../about/about-nablarch/about-nablarch-architecture.md#nablarch-architecture) では、 パイプライン型の処理モデルに従ってすべてのデータ処理を行う。 特に複数の処理方式を組み合わせて構築するシステムは、 [共通アーキテクチャ](../../about/about-nablarch/about-nablarch-architecture.md#nablarch-architecture) によって、以下のメリットを享受できる。 柔軟な機能追加・変更 + パイプライン型の処理モデルでは、パイプラインの構成要素であるハンドラの差し替えを容易に行うことができる。 これにより、機能追加・変更要求に対して、非常に柔軟な対応が可能となる。 また、ハンドラは処理方式間での共有が可能なので、 従来の開発のように処理方式ごとに同じ機能を重複して作成する必要がない。 + 開発方法の共通化 + 各実行制御基盤上で動作するアプリケーションは、ほぼ同様の方法で作成・テストできるので、 ある処理方式で開発してスキルを身につけた開発者は、 最小限の学習で他の処理方式でも開発できる。 diff --git a/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-platform.md b/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-platform.md index 04f82bf32..de777a6f9 100644 --- a/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-platform.md +++ b/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-platform.md @@ -42,30 +42,44 @@ Nablarchフレームワークは、Java標準仕様のみを使って作成し Nablarchフレームワークは、以下の環境においてテストを実施し、正常に動作することを確認している。 Java + * Java SE 6/7/8/11 [1]/17 [2]/21 [3] + データベース + * Oracle Database 12c/19c/21c/23ai * IBM Db2 10.5/11.5 * SQL Server 2017/2019/2022 * PostgreSQL 10.0/11.5/12.2/13.2/14.0/15.2/16.2 + アプリケーションサーバ + * Oracle Weblogic Server 14.1.1 * WebSphere Application Server 9.0.5.8 * WildFly 26.0.1.Final * Apache Tomcat 9.0.54 + Java EE + * Hibernate Validator 5.3.6.Final * JBeret 1.3.4.Final + MOM(メッセージ指向ミドルウェア) + * IBM MQ 9.3 + ブラウザ + PC + * Internet Explorer 11 * Microsoft Edge * Mozilla Firefox * Google Chrome * Safari + スマートフォン + * Safari(iOS) * Google Chrome(Android) @@ -74,22 +88,31 @@ PC 2016年2月時点の稼働実績を以下に示す。 OS + * RedHat Enterprise Linux 5/6 * WindowsServer 2008 * AIX 7 + Java + * Java SE 6/7/8 + データベース + * Oracle Database 11g/12c * DB2 10 * SQLServer 2008 * PostgreSQL 9 + アプリケーションサーバ + * Oracle Weblogic Server 11g/12c * WebSphere Application Server 7/8 * JBoss Application Server 7 * Apache Tomcat 6/7/8 + MOM(メッセージ指向ミドルウェア) + * IBM MQ 9.3 Java11で使用する場合、別途設定変更が必要となる。設定方法は [Java11で使用する場合のセットアップ方法](../../setup/blank-project/blank-project-setup-Java11.md) を参照。 diff --git a/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-versionup-policy.md b/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-versionup-policy.md index 9ef65c040..9a6e32c56 100644 --- a/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-versionup-policy.md +++ b/.claude/skills/nabledge-5/docs/about/about-nablarch/about-nablarch-versionup-policy.md @@ -53,15 +53,20 @@ Nablarchのバージョンアップは3種類あります。 ``` 例) + 5 : プロダクトバージョン5 初期リリース 5u1 : プロダクトバージョン5 アップデートリリース1 + プロダクトバージョン番号 + マイナーバージョンアップ時にインクリメントされます。 例)Nablarch 5u6 → Nablarch 6 開始番号は5です。 + アップデート番号 + リビジョンアップまたはバグフィックス時にインクリメントされます。 例)Nablarch 5u6 → Nablarch 5u7 diff --git "a/.claude/skills/nabledge-5/docs/check/security-check/security-check-1.\346\246\202\350\246\201.md" "b/.claude/skills/nabledge-5/docs/check/security-check/security-check-1.\346\246\202\350\246\201.md" index d4e2b91aa..9b6b1cc47 100644 --- "a/.claude/skills/nabledge-5/docs/check/security-check/security-check-1.\346\246\202\350\246\201.md" +++ "b/.claude/skills/nabledge-5/docs/check/security-check/security-check-1.\346\246\202\350\246\201.md" @@ -1,22 +1,41 @@ # 1.概要 -1.概要 -1.1. 本書の位置づけ +### 1.概要 + +#### 1.1. 本書の位置づけ + Nablarchを利用したシステム開発におけるセキュリティへの対応状況を示す。 + Webアプリケーションを作成するにあたって、開発者が考慮するべきセキュリティについてIPAが安全なウェブサイトの作り方を公開している。 + https://www.ipa.go.jp/security/vuln/websecurity.html + 上記でIPAの公開するセキュリティ実装チェックリストに対するNablarchの対応状況を 2.チェックリスト として提供する。 + チェックリストを参照することでNablarchを利用したプロジェクトが個別に確認するべき点が明らかとなる。 + また、PCI DSSへの対応状況についても記載する。 + PCI DSSで主にアプリケーションに求められるセキュリティについて記載した 要件6 について + 各要件がIPAのチェックリストのどの項目に対応しているかを表として示す。 + なお、アプリケーションに関する要件としては 要件8 などもPCI DSSで規定されている。 + 要件6 以外についてはプロジェクトで注意深く確認が必要となる。 + これらの対応表は単体で成果物として使用できるものではない。 + 対応表と各プロジェクトが順守するべきセキュリティガイドラインをインプットとして + システムが備えるべきセキュリティ要件について方式設計を実施する。 + 上記に加えPCI DSSへの対応が求められるシステムについてはPCI DSS対応表も参照する。 -1.2. 対応するバージョン + +#### 1.2. 対応するバージョン + 本書を作成するにあたり参照したIPAのセキュリティチェックリストおよびPCI DSSは以下のバージョンとなる。 + IPA 改訂第7版 + PCI DSS v3.2.1 diff --git "a/.claude/skills/nabledge-5/docs/check/security-check/security-check-3.PCIDSS\345\257\276\345\277\234\350\241\250.md" "b/.claude/skills/nabledge-5/docs/check/security-check/security-check-3.PCIDSS\345\257\276\345\277\234\350\241\250.md" index 502915387..31eac7543 100644 --- "a/.claude/skills/nabledge-5/docs/check/security-check/security-check-3.PCIDSS\345\257\276\345\277\234\350\241\250.md" +++ "b/.claude/skills/nabledge-5/docs/check/security-check/security-check-3.PCIDSS\345\257\276\345\277\234\350\241\250.md" @@ -1,17 +1,27 @@ # 3.PCIDSS対応表 -PCI DSSで定義された要件のうち 要件6.5. についてのみ以下にチェックリストとの対応を記載します。 -以下の対応表から該当するチェックリストのNablarch対応状況を確認しプロジェクトで対応要否を検討してください。 -対応が"-"のものは対応する項目がありません。プロジェクトで対応を検討してください。 -※他に 要件8 などもアプリケーション実装に関するものですが、Nablarchでは対応していないため各プロジェクトで個別に対応してください。 -PCI DSS 要件 2.チェックリストとの対応 -6.5.1 1.SQLインジェクション 7.HTTPヘッダ・インジェクション 8.メールヘッダ・インジェクション 上記はチェックリストに記載されたインジェクションに関連する項目となります。上記以外のインジェクション(LDAP や Xpathなど)については別途プロジェクトで個別に対応してください。 -6.5.2 10.バッファオーバーフロー -6.5.3 ー -6.5.4 ー -6.5.5 1-(iii) SQLインジェクション エラーメッセージをそのままブラウザに表示しない 上記項目に対応することで業務アプリケーションでハンドリングしていないエラーメッセージやスタックトレースがユーザに表示されることは防げます。業務アプリケーションの出力するエラーメッセージについてはプロジェクトで個別に対応してください。(認証失敗時に詳細なメッセージを出力しないなど) -6.5.6 ー -6.5.7 5.クロスサイト・スクリプティング -6.5.8 3.パス名パラメータの未チェック/ディレクトリ・トラバーサル 11.アクセス制御や認可制御の欠落 3については、チェックリストに記載の通り、Nablarchの機能を組み合わせた上で、ディレクトリトラバーサルを起こさないようプロジェクトで個別に対応してください。 -6.5.9 6.CSRF(クロスサイト・リクエスト・フォージェリ) -6.5.10 4.セッション管理の不備 11.アクセス制御や認可制御の欠落 +PCI DSSで定義された要件のうち 要件6.5. についてのみ以下にチェックリストとの対応を記載します。 +以下の対応表から該当するチェックリストのNablarch対応状況を確認しプロジェクトで対応要否を検討してください。 +対応が"-"のものは対応する項目がありません。プロジェクトで対応を検討してください。 +※他に 要件8 などもアプリケーション実装に関するものですが、Nablarchでは対応していないため各プロジェクトで個別に対応してください。 +PCI DSS 要件 2.チェックリストとの対応 +6.5.1 1.SQLインジェクション +7.HTTPヘッダ・インジェクション +8.メールヘッダ・インジェクション + +上記はチェックリストに記載されたインジェクションに関連する項目となります。上記以外のインジェクション(LDAP や Xpathなど)については別途プロジェクトで個別に対応してください。 +6.5.2 10.バッファオーバーフロー +6.5.3 ー +6.5.4 ー +6.5.5 1-(iii) SQLインジェクション エラーメッセージをそのままブラウザに表示しない + +上記項目に対応することで業務アプリケーションでハンドリングしていないエラーメッセージやスタックトレースがユーザに表示されることは防げます。業務アプリケーションの出力するエラーメッセージについてはプロジェクトで個別に対応してください。(認証失敗時に詳細なメッセージを出力しないなど) +6.5.6 ー +6.5.7 5.クロスサイト・スクリプティング +6.5.8 3.パス名パラメータの未チェック/ディレクトリ・トラバーサル +11.アクセス制御や認可制御の欠落 + +3については、チェックリストに記載の通り、Nablarchの機能を組み合わせた上で、ディレクトリトラバーサルを起こさないようプロジェクトで個別に対応してください。 +6.5.9 6.CSRF(クロスサイト・リクエスト・フォージェリ) +6.5.10 4.セッション管理の不備 +11.アクセス制御や認可制御の欠落 diff --git a/.claude/skills/nabledge-5/docs/component/adapters/adapters-doma-adaptor.md b/.claude/skills/nabledge-5/docs/component/adapters/adapters-doma-adaptor.md index 2273df22b..4ec0b70e9 100644 --- a/.claude/skills/nabledge-5/docs/component/adapters/adapters-doma-adaptor.md +++ b/.claude/skills/nabledge-5/docs/component/adapters/adapters-doma-adaptor.md @@ -49,6 +49,7 @@ H2を使用する場合の設定例を以下に示す。 ポイント + * 定義するダイアレクトは `org.seasar.doma.jdbc.dialect.Dialect` の実装クラスとすること * ダイアレクトのコンポーネント名は `domaDialect` とすること * データソースのコンポーネント名は `dataSource` とすること @@ -69,6 +70,7 @@ Domaを使用したデータベースアクセスを行うための手順を以 データベースアクセスを行うためのDao(Data Access Object)インタフェースを作成する。 ポイント + * Daoアノテーションのconfig属性には DomaConfig を指定する ```java @@ -83,6 +85,7 @@ public interface ProjectDao { 業務アクションのメソッドにデータベースアクセス処理を実装する。 ポイント + * 業務アクションメソッドをトランザクション管理対象とするため、 Transactional インターセプタを設定する * DomaDaoRepository#get を使用してDaoの実装クラスをルックアップする @@ -151,6 +154,7 @@ JSR352に準拠したバッチアプリケーションでもDomaを使用した > これを行わなかった場合、Domaのデフォルト値が適用されるため、バッチ更新を使用してもパフォーマンスが向上しない可能性がある。 > 実装例 + > 例えば、1000件ごとにバッチinsertを行う場合には、Daoのメソッドを以下のように実装する。 > ```java @@ -173,7 +177,9 @@ DomaTransactionNotSupportedConfig を指定する。 実装例を以下に示す。 Daoインタフェース + ポイント + * Daoアノテーションのconfig属性には、 DomaTransactionNotSupportedConfig を指定する。 * 検索結果は Stream で取得する。 @@ -186,8 +192,11 @@ public interface ProjectDao { Stream search(); } ``` + ItemReaderクラス + ポイント + * openメソッドで検索結果のストリームを取得する。 * リソースの解放漏れを防ぐため、closeメソッドで必ずストリームを閉じる。 @@ -231,6 +240,7 @@ ETL使用時に、プロジェクトで追加したステップの中でDomaを 設定例を以下に示す。 ジョブ定義ファイル + ```xml @@ -245,7 +255,9 @@ ETL使用時に、プロジェクトで追加したステップの中でDomaを ``` + コンポーネント設定ファイル + ```xml @@ -268,13 +280,16 @@ ETL使用時に、プロジェクトで追加したステップの中でDomaを 実装例を以下に示す。 コンポーネント設定ファイル + ```xml ``` + Configクラス + ```java @SingletonConfig public final class CustomConfig implements Config { @@ -290,14 +305,18 @@ public final class CustomConfig implements Config { // その他のフィールド、メソッドはDomaConfigを参考に実装すること } ``` + Daoインタフェース + ```java @Dao(config = CustomConfig.class) public interface ProjectDao { // 省略 } ``` + 業務アクションクラス + ```java public HttpResponse create(final HttpRequest request, final ExecutionContext context) { final Project project = SessionUtil.delete(context, "project"); @@ -319,6 +338,7 @@ public HttpResponse create(final HttpRequest request, final ExecutionContext con この問題を解決するため、Nablarchのデータベースアクセス処理が、Domaと同じトランザクション(データベース接続)を使用できる機能を提供している。 利用手順 + コンポーネント設定ファイルに以下の定義を追加する。 これにより、Nablarchのデータベースアクセスが、自動的にDomaのトランザクション配下で実行されるようにある。 @@ -356,6 +376,7 @@ JSR352に準拠したバッチアプリケーションで使用する場合は `org.seasar.doma.jdbc.UtilLoggingJdbcLogger` を使用する場合の設定例を以下に示す。 ポイント + * 定義するロガーは `org.seasar.doma.jdbc.JdbcLogger` の実装クラスとすること * ロガーのコンポーネント名は `domaJdbcLogger` とすること @@ -379,6 +400,7 @@ JSR352に準拠したバッチアプリケーションで使用する場合は 設定例を以下に示す。 ポイント + * コンポーネント名は `domaStatementProperties` とすること ```xml diff --git a/.claude/skills/nabledge-5/docs/component/adapters/adapters-jsr310-adaptor.md b/.claude/skills/nabledge-5/docs/component/adapters/adapters-jsr310-adaptor.md index b065f53f3..506dce3bc 100644 --- a/.claude/skills/nabledge-5/docs/component/adapters/adapters-jsr310-adaptor.md +++ b/.claude/skills/nabledge-5/docs/component/adapters/adapters-jsr310-adaptor.md @@ -30,6 +30,7 @@ JSR310(Date and Time API)で追加された日時関連を使用可能にする 変換可能な型や変換ルールなどの詳細は、 converter一覧 を参照。 設定 + [システムリポジトリ](../../component/libraries/libraries-repository.md#repository) のコンポーネント設定ファイルに以下を追加することで、本機能が有効になる。 ```xml @@ -40,10 +41,13 @@ JSR310(Date and Time API)で追加された日時関連を使用可能にする > 文字列から変換する際のフォーマットを変更したい場合は、以下の作業が必要となる。 > フォーマットなどの定義を持つクラスを作成する + > DateTimeConfiguration の実装クラスを追加し、 > 日付や日時のフォーマットを定義する。 > 基本実装の BasicDateTimeConfiguration を参考にすると良い + > 追加したクラスをコンポーネント設定ファイルに定義する + > コンポーネント名を `dateTimeConfiguration` として、コンポーネントを定義する。 > 例を以下に示す。 diff --git a/.claude/skills/nabledge-5/docs/component/adapters/adapters-micrometer-adaptor.md b/.claude/skills/nabledge-5/docs/component/adapters/adapters-micrometer-adaptor.md index ba6d7269a..d5efa34ff 100644 --- a/.claude/skills/nabledge-5/docs/component/adapters/adapters-micrometer-adaptor.md +++ b/.claude/skills/nabledge-5/docs/component/adapters/adapters-micrometer-adaptor.md @@ -464,6 +464,7 @@ DefaultMeterBinderListProvider が生成する [MeterBinder(外部サイト、 ### Datadog と連携する 依存関係を追加する + ```xml io.micrometer @@ -471,20 +472,26 @@ DefaultMeterBinderListProvider が生成する [MeterBinder(外部サイト、 1.13.0 ``` + レジストリファクトリを宣言する + ```xml ``` + APIキーを設定する + ```text nablarch.micrometer.datadog.apiKey=XXXXXXXXXXXXXXXX ``` APIキーは `nablarch.micrometer.datadog.apiKey` で設定できる。 + サイトURLを設定する + ```text nablarch.micrometer.datadog.uri=<サイトURL> ``` @@ -492,7 +499,9 @@ nablarch.micrometer.datadog.uri=<サイトURL> サイトURLは `nablarch.micrometer.datadog.uri` で設定できる。 その他の設定については [DatadogConfig(外部サイト、英語)](https://javadoc.io/doc/io.micrometer/micrometer-registry-datadog/1.13.0/io/micrometer/datadog/DatadogConfig.html) を参照。 + 連携を無効にする + ```text nablarch.micrometer.datadog.enabled=false nablarch.micrometer.datadog.apiKey=XXXXXXXXXXXXXXXX @@ -508,6 +517,7 @@ nablarch.micrometer.datadog.apiKey=XXXXXXXXXXXXXXXX ### CloudWatch と連携する 依存関係を追加する + ```xml io.micrometer @@ -515,14 +525,18 @@ nablarch.micrometer.datadog.apiKey=XXXXXXXXXXXXXXXX 1.13.0 ``` + レジストリファクトリを宣言する + ```xml ``` + リージョンやアクセスキーを設定する + ```bash $ export AWS_REGION=ap-northeast-1 @@ -536,7 +550,9 @@ $ export AWS_SECRET_ACCESS_KEY=YYYYYYYYYYYYYYYYYYYYY 上記は、LinuxでOS環境変数を使って設定する場合の例を記載している。 より詳細な情報は、 [AWSのドキュメント(外部サイト)](https://docs.aws.amazon.com/ja_jp/sdk-for-java/v1/developer-guide/setup-credentials.html) を参照。 + 名前空間を設定する + ```text nablarch.micrometer.cloudwatch.namespace=test ``` @@ -544,7 +560,9 @@ nablarch.micrometer.cloudwatch.namespace=test メトリクスのカスタム名前空間は `nablarch.micrometer.cloudwatch.namespace` で設定できる。 その他の設定については [CloudWatchConfig(外部サイト、英語)](https://javadoc.io/doc/io.micrometer/micrometer-registry-cloudwatch2/1.13.0/io/micrometer/cloudwatch2/CloudWatchConfig.html) を参照。 + より詳細な設定 + OS環境変数や設定ファイルでは指定できない、より詳細に設定したい場合は、 CloudWatchAsyncClientProvider を実装したカスタムプロバイダを作ることで対応できる。 ```java @@ -585,7 +603,9 @@ CloudWatchAsyncClientProvider は `CloudWatchAsyncClient` を提供する `provi > **Tip:** > デフォルトでは、 [CloudWatchAsyncClient.create() (外部サイト、英語)](https://javadoc.io/static/software.amazon.awssdk/cloudwatch/2.13.4/software/amazon/awssdk/services/cloudwatch/CloudWatchAsyncClient.html#create--) で作成されたインスタンスが使用される。 + 連携を無効にする + ```text nablarch.micrometer.cloudwatch.enabled=false nablarch.micrometer.cloudwatch.namespace=test @@ -603,6 +623,7 @@ nablarch.micrometer.cloudwatch.namespace=test ### Azure と連携する MicrometerでメトリクスをAzureに連携する方法 + Azureは、JavaアプリケーションからAzureにメトリクスを連携するための仕組みとして、Javaエージェントを用いた方法(**Java 3.0 エージェント**)を提供している。 * [Azure Monitor Application Insights を監視する Java のコード不要のアプリケーション(外部サイト)](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/opentelemetry-enable?tabs=java) @@ -621,7 +642,9 @@ Azureは、JavaアプリケーションからAzureにメトリクスを連携す > したがって、性能試験では本番同様に Java 3.0 エージェントを導入し、想定内の性能になることを確認すること。 Java 3.0 エージェントの設定方法は [Azureにおける分散トレーシング](../../setup/cloud-native/cloud-native-azure-distributed-tracing.md#azure-distributed-tracing) 参照。 + MicrometerアダプタでメトリクスをAzureに連携するための設定 + MicrometerアダプタでメトリクスをAzureに連携するためには、以下のとおり設定する必要がある。 * アプリケーションの起動オプションに、Java 3.0 エージェントを追加する @@ -645,7 +668,9 @@ MicrometerアダプタでメトリクスをAzureに連携するためには、 > **Tip:** > Java 3.0 エージェントを使うこの方法では、Azure用の `MeterRegistry` は使用しない。 > したがって、Azure用のモジュールを依存関係に追加しなくてもメトリクスを連携できる。 + 詳細設定について + メトリクスの連携は、Azureが提供するJava 3.0 エージェントによって行われる。 このため、メトリクスの連携に関する設定は全てJava 3.0 エージェントが提供する方法で行う必要がある。 @@ -653,7 +678,9 @@ Java 3.0 エージェントの設定の詳細については、 [構成オプシ > **Important:** > 本アダプタ用の設定ファイルである `micrometer.properties` は使用できないが、ファイルは配置しておく必要がある(内容は空で構わない)。 + 連携を無効にする + Java 3.0 エージェントを使用せずにアプリケーションを起動することで、メトリクスの連携を無効にできる。 ### StatsD で連携する @@ -665,6 +692,7 @@ Datadog は [DogStatsD(外部サイト)](https://docs.datadoghq.com/ja/developer なお、DogStatsD のインストール方法などについては [Datadogのサイト(外部サイト)](https://docs.datadoghq.com/ja/agent/) を参照。 依存関係を追加する + ```xml io.micrometer @@ -672,14 +700,18 @@ Datadog は [DogStatsD(外部サイト)](https://docs.datadoghq.com/ja/developer 1.13.0 ``` + レジストリファクトリを宣言する + ```xml ``` + 必要に応じて設定ファイルを記述する + StatsD デーモンと連携するための設定は、デフォルト値が DogStatsD をデフォルト構成でインストールした場合と一致するように調整されている。 したがって、 DogStatsD をデフォルトの構成でインストールしている場合は、特に設定を明示しなくても DogStatsD による連携が動作する。 @@ -690,7 +722,9 @@ StatsD デーモンと連携するための設定は、デフォルト値が Dog # ポートを変更 nablarch.micrometer.statsd.port=9999 ``` + 連携を無効にする + ```text nablarch.micrometer.statsd.enabled=false ``` @@ -714,6 +748,7 @@ nablarch.micrometer.statsd.enabled=false ここでは、localhost の 9090 ポートで起動している Prometheus に OTLP で連携する場合を例にして説明する。 依存関係を追加する + ```xml io.micrometer @@ -721,25 +756,33 @@ nablarch.micrometer.statsd.enabled=false 1.13.0 ``` + レジストリファクトリを宣言する + ```xml ``` + 設定ファイルを記述する + ```text # 送信先を変更 nablarch.micrometer.otlp.url=http://localhost:9090/api/v1/otlp/v1/metrics ``` + ヘッダ情報を設定する + ```text nablarch.micrometer.otlp.headers=key1=value1,key2=value2 ``` 認証で使用するAPIキー等のヘッダ情報が必要な場合、 `nablarch.micrometer.otlp.headers` で設定できる。 + 連携を無効にする + ```text nablarch.micrometer.otlp.enabled=false ``` @@ -754,6 +797,7 @@ nablarch.micrometer.otlp.enabled=false ### ウェブアプリケーションで収集するメトリクスの例 HTTPリクエストの処理時間 + HTTPリクエストごとの処理時間を計測することで、以下のようなことができるようになる。 * 各URLごとにどの程度アクセスがあるか確認する @@ -765,7 +809,9 @@ HTTPリクエストごとの処理時間を計測することで、以下のよ * [処理時間を計測するハンドラ](../../component/adapters/adapters-micrometer-adaptor.md#micrometer-timer-metrics-handler) * [パーセンタイルを収集する](../../component/adapters/adapters-micrometer-adaptor.md#micrometer-timer-metrics-handler-percentiles) + SQLの処理時間 + SQLの処理時間を計測することで、以下のようなことができるようになる。 * それぞれのSQLがどの程度の時間で処理されているか確認する @@ -774,7 +820,9 @@ SQLの処理時間を計測することで、以下のようなことができ SQLの処理時間を計測する方法については、以下のガイドを参照のこと。 * [SQLの処理時間を計測する](../../component/adapters/adapters-micrometer-adaptor.md#micrometer-sql-time) + ログレベルごとの出力回数 + ログレベルごとの出力回数を計測することで、以下のようなことができるようになる。 * 警告ログが異常な回数出力されていないか確認する(攻撃の検知) @@ -783,7 +831,9 @@ SQLの処理時間を計測する方法については、以下のガイドを ログレベルごとの出力回数については、以下のガイドを参照のこと。 * [ログレベルごとの出力回数を計測する](../../component/adapters/adapters-micrometer-adaptor.md#micrometer-log-count) + アプリケーションサーバやライブラリが提供するリソースの情報 + アプリケーションサーバやライブラリが提供するリソース(スレッドプールやDBのコネクションプールなど)の状態を メトリクスとして収集しておくことで、障害発生時に原因箇所を特定するための情報源として活用できるようになる。 @@ -795,11 +845,14 @@ MBeanの情報を収集する方法については、以下のガイドを参照 ### バッチアプリケーションで収集するメトリクスの例 バッチの処理時間 + 普段からバッチの処理時間を計測しておくことで、平常時の処理時間を知ることができる。 これにより、処理時間が平常時とは異なる値になったときに、異常を迅速に検知できるようになる。 バッチの処理時間は、 [DefaultMeterBinderListProviderで収集されるメトリクス](../../component/adapters/adapters-micrometer-adaptor.md#micrometer-default-metrics) で収集される `process.uptime` で計測できる。 + トランザクション単位の処理時間 + トランザクション単位の処理時間を計測することで、マルチスレッドのバッチが均等に処理を分散できているかなどを確認できるようになる。 また、バッチの処理時間と同様に、処理時間が平常時から逸脱したときにも異常を迅速に検知できる。 @@ -807,7 +860,9 @@ MBeanの情報を収集する方法については、以下のガイドを参照 バッチのトランザクション単位の処理時間の計測については、以下のガイドを参照のこと。 * [バッチのトランザクション単位の処理時間を計測する](../../component/adapters/adapters-micrometer-adaptor.md#micrometer-adaptor-batch-transaction-time) + バッチの処理件数 + バッチの処理件数を計測することで、以下のようなことができるようになる。 * バッチの進捗状況を確認する @@ -817,7 +872,9 @@ MBeanの情報を収集する方法については、以下のガイドを参照 バッチの処理件数の計測については、以下のガイドを参照のこと。 * [バッチの処理件数を計測する](../../component/adapters/adapters-micrometer-adaptor.md#micrometer-batch-processed-count) + SQLの処理時間 + SQLの処理時間を計測することで、以下のようなことができるようになる。 * それぞれのSQLがどの程度の時間で処理されているか確認する @@ -826,13 +883,17 @@ SQLの処理時間を計測することで、以下のようなことができ SQLの処理時間を計測する方法については、以下のガイドを参照のこと。 * [SQLの処理時間を計測する](../../component/adapters/adapters-micrometer-adaptor.md#micrometer-sql-time) + ログレベルごとの出力回数 + ログレベルごとの出力回数を計測することで、警告ログやエラーログの検知ができるようになる。 ログレベルごとの出力回数については、以下のガイドを参照のこと。 * [ログレベルごとの出力回数を計測する](../../component/adapters/adapters-micrometer-adaptor.md#micrometer-log-count) + ライブラリが提供するリソースの情報 + ライブラリが提供するリソース(DBのコネクションプールなど)の状態をメトリクスとして収集しておくことで、 障害発生時に原因箇所を特定するための情報源として活用できるようになる。 @@ -1418,8 +1479,10 @@ public class CustomMeterBinderListProvider extends DefaultMeterBinderListProvide `JmxGaugeMetrics` のコンストラクタには、次の2つのクラスを渡す必要がある。 * MetricsMetaData + * メトリクスの名前や説明、タグなどのメタ情報を指定する * MBeanAttributeCondition + * 収集するMbeanを特定するための、オブジェクト名と属性名を指定する `JmxGaugeMetrics` は、 `MBeanAttributeCondition` で指定された情報に基づいてMBeanの情報を取得する。 @@ -1522,8 +1585,10 @@ public class CustomMeterBinderListProvider extends DefaultMeterBinderListProvide Micrometerが監視サービスにメトリクスを連携する方法には、大きく次の2つの方法が存在する。 * 一定間隔でアプリケーションが監視サービスにメトリクスを送信する (Client pushes) + * Datadog, CloudWatch など * 一定間隔で監視サービスがアプリケーションにメトリクスを問い合わせに来る (Server polls) + * Prometheus など 前者(Client pushes)の場合、 `MeterRegistry` はコンポーネント生成後に一定間隔でメトリクスの送信を開始する。 diff --git a/.claude/skills/nabledge-5/docs/component/adapters/adapters-redisstore-lettuce-adaptor.md b/.claude/skills/nabledge-5/docs/component/adapters/adapters-redisstore-lettuce-adaptor.md index 56de69f62..845fb3cc3 100644 --- a/.claude/skills/nabledge-5/docs/component/adapters/adapters-redisstore-lettuce-adaptor.md +++ b/.claude/skills/nabledge-5/docs/component/adapters/adapters-redisstore-lettuce-adaptor.md @@ -152,11 +152,16 @@ nablarch.sessionManager.defaultStoreName=redis 本アダプタでは、接続先のRedisの構成ごとに専用のクライアントクラス(LettuceRedisClient を実装したクラス)を用意している。 LettuceSimpleRedisClient + 単一のRedisインスタンスに直接接続する場合に使用するクラス。 + LettuceMasterReplicaRedisClient + Master-Replica構成のRedisインスタンスに接続する場合に使用するクラス。 Sentinelを介して接続する場合も、このクラスを使用する。 + LettuceClusterRedisClient + Cluster構成のRedisインスタンスに接続する場合に使用するクラス。 アプリケーションで使用するRedisの構成に合わせて、これらの中から使用するクライアントクラスを設定する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/adapters/adapters-router-adaptor.md b/.claude/skills/nabledge-5/docs/component/adapters/adapters-router-adaptor.md index deb81c8fd..1a5c8cbc5 100644 --- a/.claude/skills/nabledge-5/docs/component/adapters/adapters-router-adaptor.md +++ b/.claude/skills/nabledge-5/docs/component/adapters/adapters-router-adaptor.md @@ -46,6 +46,7 @@ 設定例を以下に示す。 ポイント + * コンポーネント名は **packageMapping** とする。 * basePackage属性には、アクションクラスが格納されているパッケージを設定する。 (アクションクラスが複数のパッケージに格納されている場合は、共通となる親パッケージを設定する。) @@ -119,12 +120,15 @@ router.controllerDetector=nablarch.integration.router.NablarchControllerDetector ルート定義ファイルへの設定とマッピングの例を以下に示す。 ルート定義ファイル + ```xml ``` + 業務アクションとマッピングするURLの例 + | 業務アクション | URL | |---|---| | PersonAction#index | /action/person/index | diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-HttpErrorHandler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-HttpErrorHandler.md index 3794e3085..2158fd111 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-HttpErrorHandler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-HttpErrorHandler.md @@ -38,22 +38,28 @@ ## 制約 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに配置すること + 本ハンドラで生成した HttpResponse をHTTPレスポンスハンドラが処理するため、 本ハンドラは [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに配置する必要がある。 + [HTTPアクセスログハンドラ](../../component/handlers/handlers-http-access-log-handler.md#http-access-log-handler) より後ろに配置すること + 本ハンドラで生成したエラー用 HttpResponse を元にログ出力を行うため、 [HTTPアクセスログハンドラ](../../component/handlers/handlers-http-access-log-handler.md#http-access-log-handler) より後ろに配置する必要がある。 ## 例外の種類に応じた処理とレスポンスの生成 nablarch.fw.NoMoreHandlerException + INFO 404 リクエストを処理すべきハンドラが存在しなかったことを意味するため、証跡ログとして記録する。 また、処理すべき *action class* が存在しなかったことを意味するため、レスポンスは *404* としている。 + nablarch.fw.web.HttpErrorResponse + ログ出力なし HttpErrorResponse#getResponse() @@ -68,32 +74,41 @@ Viewでエラーメッセージを扱えるよう以下の処理を行う。 リクエストスコープに設定する際のキー名は、デフォルトでは `errors` となる。キー名は、コンポーネント設定ファイルで変更できる。 設定例 + ```xml ``` + nablarch.fw.Result.Error + 設定による Error#getStatusCode() nablarch.fw.Result.Errorのログ出力について を参照 + java.lang.StackOverflowError + FATAL 500 データや実装バグに起因する可能性があるため、障害として通知する。 また予期しないエラーであるため、レスポンスは **500** としている。 + java.lang.ThreadDeath と java.lang.VirtualMachineError ( java.lang.StackOverflowError 以外) + - - 本ハンドラでは何もせず上位のハンドラに処理を任せる。(エラーを再送出する) + 上記以外の例外及びエラー + FATAL 500 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-InjectForm.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-InjectForm.md index 14e47d89b..da8bb99a9 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-InjectForm.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-InjectForm.md @@ -44,6 +44,7 @@ InjectForm アノテーションを、業務アクションのリクエストを 以下に実装例を示す。 入力画面のhtml例 + ```html @@ -52,7 +53,9 @@ InjectForm アノテーションを、業務アクションのリクエストを ``` + 業務アクションの例 + この例では、画面から送信された `form` から始まるリクエストパラメータに対してバリデーションが実行される。 バリデーションでエラーが発生しなかった場合は、リクエストスコープに InjectForm#form で指定したクラスのオブジェクトが格納される。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-ServiceAvailabilityCheckHandler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-ServiceAvailabilityCheckHandler.md index 13b79e9e6..704d736b5 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-ServiceAvailabilityCheckHandler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-ServiceAvailabilityCheckHandler.md @@ -37,9 +37,12 @@ ServiceAvailability を実装したクラスを本ハンドラに設定する必 ## 制約 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに配置すること + 本ハンドラではスレッドコンテキスト上に設定されたリクエストIDをもとにサービス提供可否チェックを行うため、 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに本ハンドラを配置する必要がある。 + [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) より後ろに配置すること + 内部フォーワードが行われた際に、フォーワード先のリクエストID( [内部リクエストID](../../component/handlers/handlers-forwarding-handler.md#internal-request-id) )をもとに サービス提供可否チェックを行いたい場合は、 [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) より後ろに本ハンドラを配置する必要がある。 合わせて、 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) の `attributes` に InternalRequestIdAttribute を追加すること。 @@ -50,8 +53,11 @@ ThreadContext からリクエストIDを取得し、サービス提供可否を チェックの詳細は、 [サービス提供可否チェック](../../component/libraries/libraries-service-availability.md#service-availability) を参照。 OK(サービス提供可)の場合 + 後続ハンドラを呼び出す。 + NG(サービス提供不可)の場合 + ServiceUnavailable (503) を送出する。 チェック対象のリクエストIDをフォーワード先のリクエストIDに変更したい場合は、 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-SessionStoreHandler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-SessionStoreHandler.md index 6450d7ca5..0cd5b1ff1 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-SessionStoreHandler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-SessionStoreHandler.md @@ -54,12 +54,17 @@ ## 制約 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに配置すること + サーブレットフォワード時、フォワード先でセッションストアの値にアクセスできるようにするため、 本ハンドラは [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに配置する必要がある。 + [マルチパートリクエストハンドラ](../../component/handlers/handlers-multipart-handler.md#multipart-handler) より後ろに配置すること + HIDDENストア使用時にリクエストパラメータにアクセスできるようにするため、 本ハンドラは [マルチパートリクエストハンドラ](../../component/handlers/handlers-multipart-handler.md#multipart-handler) より後ろに配置する必要がある。 + [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) より前に配置すること + [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) を本ハンドラよりも前に設定した場合、セッションストアの読み込み、保存が複数回実行されるが、 HIDDENストアはリクエストパラメータからセッション変数を読み込み、リクエストスコープにセッション変数を保存するため、 内部フォーワード時にHIDDENストアを使用した場合、最新のセッション変数を取得できない問題がある。 @@ -99,8 +104,11 @@ SessionManager に設定するプロパティの詳細は [セッションスト セッションストアからセッション変数を読み込む際、セッションストアが改竄されていないかをチェックする。 HIDDENストアの改竄を検知した場合 + ステータスコード400の HttpErrorResponse を送出する。 + それ以外のストアの改竄を検知した場合 + セッションストアの復号処理時に発生した例外をそのまま送出する。 ## 改竄エラー時の遷移先を設定する @@ -111,6 +119,7 @@ HIDDENストアの改竄を検知した場合 web.xml に対する設定が必要となる。 理由 + [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) は、 [HTTPエラー制御ハンドラ](../../component/handlers/handlers-HttpErrorHandler.md#http-error-handler) よりも手前に設定する必要がある。 これは、 [HTTPエラー制御ハンドラ](../../component/handlers/handlers-HttpErrorHandler.md#http-error-handler) の [デフォルトページの設定](../../component/handlers/handlers-HttpErrorHandler.md#httperrorhandler-defaultpage) に対して指定した 内部フォワードのパスを正しく扱うために必要な設定順となる。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-body-convert-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-body-convert-handler.md index 64e22bdbb..61dbdf0b3 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-body-convert-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-body-convert-handler.md @@ -41,6 +41,7 @@ Consumes 及び Produces アノテーションで指定する。 ## 制約 本ハンドラは [ルーティングアダプタ](../../component/adapters/adapters-router-adaptor.md#router-adaptor) よりも後ろに設定すること + このハンドラは、リソース(アクション)クラスのメソッドに設定された、アノテーションの情報を元に リクエスト及びレスポンスの変換処理を行う。 このため、ディスパッチ先を特定する [ルーティングアダプタ](../../component/adapters/adapters-router-adaptor.md#router-adaptor) よりも後ろに設定する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-cors-preflight-request-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-cors-preflight-request-handler.md index fc186fd01..be1b3eda2 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-cors-preflight-request-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-cors-preflight-request-handler.md @@ -37,6 +37,7 @@ ResponseFinisherを実装した CorsResponseFinisher で処理する。 ## 制約 [JAX-RSレスポンスハンドラ](../../component/handlers/handlers-jaxrs-response-handler.md#jaxrs-response-handler) より後ろに配置すること + 本ハンドラで生成した HttpResponse を [JAX-RSレスポンスハンドラ](../../component/handlers/handlers-jaxrs-response-handler.md#jaxrs-response-handler) が処理するため、 本ハンドラは [JAX-RSレスポンスハンドラ](../../component/handlers/handlers-jaxrs-response-handler.md#jaxrs-response-handler) より後ろに配置する必要がある。 @@ -94,6 +95,7 @@ CORSの処理は Cors インタフェースが行う。 BasicCors はデフォルトで以下の処理を行う。 プリフライトリクエスト(CorsPreflightRequestHandlerが呼び出す処理) + * リクエストが以下の条件を全て満たす場合にプリフライトリクエストと判定する。 * HTTPメソッド:OPTIONS @@ -102,6 +104,7 @@ BasicCors はデフォルトで以下の処理を行う。 * リクエストがプリフライトリクエストの場合は以下のレスポンスを返す。 実際のリクエスト(CorsResponseFinisherが呼び出す処理) + * 以下のレスポンスヘッダを設定する。 * Access-Control-Allow-Originヘッダ:リクエストのOriginヘッダ diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-csrf-token-verification-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-csrf-token-verification-handler.md index 5728c1ee7..f47cb808a 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-csrf-token-verification-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-csrf-token-verification-handler.md @@ -54,9 +54,12 @@ CsrfTokenUtil )を提供しているので、 ## 制約 [セッション変数保存ハンドラ](../../component/handlers/handlers-SessionStoreHandler.md#session-store-handler) より後ろに配置すること + CSRFトークンをセッションストアに格納するため、 本ハンドラは [セッション変数保存ハンドラ](../../component/handlers/handlers-SessionStoreHandler.md#session-store-handler) より後ろに配置する必要がある。 + [JSPカスタムタグ](../../component/libraries/libraries-tag.md#tag) を使用する場合は [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) より後ろに配置すること + [JSPカスタムタグ](../../component/libraries/libraries-tag.md#tag) を使用する場合は [クライアントに保持するデータを暗号化する(hidden暗号化)](../../component/libraries/libraries-tag.md#tag-hidden-encryption) を使用して画面にCSRFトークンを出力しているため、 本ハンドラは [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) より後ろに配置する必要がある。 @@ -91,21 +94,30 @@ CSRFトークンをセッションストアに格納するため、 デフォルトでは以下の処理を行う。 セッションストアからCSRFトークンを取得する + * CSRFトークンをセッションストアに格納する際に使用する名前は `nablarch_csrf-token` となる。 + 取得できなかった場合はCSRFトークンを生成してセッションストアへ保存する + * CSRFトークンの生成は CsrfTokenGenerator が行う。 デフォルトではバージョン4のUUIDを使用してCSRFトークンを生成する UUIDv4CsrfTokenGenerator を使用する。 * CSRFトークンの格納先となるセッションストアはデフォルトのセッションストアとなる。(セッションストアの名前を指定しないでCSRFトークンを格納する) + HTTPリクエストが検証対象か否かを判定する + * 検証対象か否かの判定は VerificationTargetMatcher が行う。 デフォルトではHTTPメソッドからHTTPリクエストが検証対象か否かを判定する HttpMethodVerificationTargetMatcher を使用する。 * HttpMethodVerificationTargetMatcher は、HTTPメソッドの `GET` `HEAD` `TRACE` `OPTIONS` をCSRFトークンの検証対象 **外** と判定する(つまりPOSTやPUT等は検査対象となる)。 + 検証対象の場合はHTTPリクエストからCSRFトークンを取得して検証する + * CSRFトークンをHTTPリクエストに格納する際に使用する名前は以下となる。 HTTPリクエストヘッダ `X-CSRF-TOKEN` HTTPリクエストパラメータ `csrf-token` + 検証に成功した場合は次のハンドラへ処理を移し、検証に失敗した場合はBadRequest(400)のレスポンスを返す + * 検証失敗時の処理は VerificationFailureHandler が行う。 デフォルトではBadRequest(400)のレスポンスを生成する BadRequestVerificationFailureHandler を使用する。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-database-connection-management-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-database-connection-management-handler.md index 4a817ac7a..c80b89730 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-database-connection-management-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-database-connection-management-handler.md @@ -103,13 +103,16 @@ connectionName への設定を省略した場合、その接続はデフォル なお、データベースアクセス部品の詳細な使用方法は、 [データベースアクセス(JDBCラッパー)](../../component/libraries/libraries-database.md#database) を参照。 デフォルトのデータベース接続を使用する + DbConnection#getConnection 呼び出し時に引数を指定する必要が無い。 引数を指定しないと、自動的にデフォルトのデータベース接続が戻される。 ```java AppDbConnection connection = DbConnectionContext.getConnection(); ``` + userAccessLogデータベース接続を使用する + DbConnection#getConnection(String) を使用し、引数にデータベース接続名を指定する。 データベース接続名は connectionName プロパティに設定した値と一致させる必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-duplicate-process-check-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-duplicate-process-check-handler.md index c9dcbbb09..5fe023d4e 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-duplicate-process-check-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-duplicate-process-check-handler.md @@ -43,6 +43,7 @@ ## 制約 本ハンドラは、スレッドコンテキスト変数管理ハンドラよりも後ろに設定すること + 本ハンドラではスレッドコンテキスト上に設定されたリクエストIDを元にプロセス多重起動のチェックを行う。 このため、 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに本ハンドラを設定する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-forwarding-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-forwarding-handler.md index 744b5aab0..5bb29164f 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-forwarding-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-forwarding-handler.md @@ -38,6 +38,7 @@ ## 制約 [セッション変数保存ハンドラ](../../component/handlers/handlers-SessionStoreHandler.md#session-store-handler) より後ろに配置すること + [セッション変数保存ハンドラ](../../component/handlers/handlers-SessionStoreHandler.md#session-store-handler) より後ろに配置すべき理由は、 [改竄エラー時の遷移先を設定する](../../component/handlers/handlers-SessionStoreHandler.md#session-store-handler-error-forward-path) を参照 @@ -70,8 +71,11 @@ public HttpResponse sample(HttpRequest request, ExecutionContext context) { 内部フォーワードで指定するフォーワード先のパスには、相対パスと絶対パスの指定が出来る。 相対パス + 現在のリクエストURIを起点としたパスになる。 + 絶対パス + サーブレットコンテキスト名を起点としたパスになる。 絶対パスの場合には、指定するパスを `/` から開始する。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-global-error-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-global-error-handler.md index 3bca2aed1..a35a2dad8 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-global-error-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-global-error-handler.md @@ -30,6 +30,7 @@ ## 制約 できるだけハンドラキューの先頭に配置すること + このハンドラは未捕捉例外を処理するため、特に理由がない限り、できるだけハンドラキューの先頭に配置すること。 もし、このハンドラより手前のハンドラで例外が発生した場合は、ウェブアプリケーションサーバやJVMにより例外処理が行われる。 @@ -41,12 +42,15 @@ このハンドラでは捕捉した例外及びエラーの内容に応じて、以下の処理を行い結果を生成する。 例外に応じた処理内容 + | 例外クラス | 処理内容 | |---|---| | ServiceError (サブクラス含む) | ServiceError#writeLog を呼び出し、ログを出力する。 ログレベルは、 ServiceError の実装クラスにより異なる。 ログ出力後、ハンドラの処理結果として、 ServiceError を返却する。 | | Result.Error (サブクラス含む) | FATALレベルのログを出力する。 ログ出力後、ハンドラの処理結果として、 Result.Error を返却する。 | | 上記以外の例外クラス | FATALレベルのログを出力する。 ログ出力後、捕捉した例外を原因に持つ InternalError を生成し、ハンドラの処理結果として返却する。 | + エラーに応じた処理内容 + | エラークラス | 処理内容 | |---|---| | ThreadDeath (サブクラス含む) | INFOレベルのログ出力を行う。 ログ出力後、捕捉したエラーをリスローする。 | diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-health-check-endpoint-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-health-check-endpoint-handler.md index 98d105f5f..8d903728d 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-health-check-endpoint-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-health-check-endpoint-handler.md @@ -48,6 +48,7 @@ ## 制約 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) または [JAX-RSレスポンスハンドラ](../../component/handlers/handlers-jaxrs-response-handler.md#jaxrs-response-handler) より後ろに配置すること + 本ハンドラで生成した HttpResponse を [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) または [JAX-RSレスポンスハンドラ](../../component/handlers/handlers-jaxrs-response-handler.md#jaxrs-response-handler) が処理するため、 本ハンドラは [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) または [JAX-RSレスポンスハンドラ](../../component/handlers/handlers-jaxrs-response-handler.md#jaxrs-response-handler) より後ろに配置する必要がある。 @@ -190,9 +191,12 @@ public class CustomHealthChecker extends HealthChecker { デフォルトのレスポンスは以下となる。 ステータスコード + * ヘルスチェックの成功:200 * ヘルスチェックの失敗:503 + レスポンスボディ + * Content-Type:application/json * フォーマット @@ -216,7 +220,9 @@ public class CustomHealthChecker extends HealthChecker { * 実際は改行がなく1行となるが上記は見やすさのために整形している。 * ヘルスチェック全体の結果はtargetsのヘルスチェック結果が1つでも失敗の場合に失敗となる。 * targetsは指定された HealthChecker の数だけ含まれる。 + ヘルスチェック結果のラベル + * ヘルスチェックの成功:UP * ヘルスチェックの失敗:DOWN diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-access-log-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-access-log-handler.md index 5728579db..6a1c03b5c 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-access-log-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-access-log-handler.md @@ -34,11 +34,16 @@ ## 制約 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに配置すること + このハンドラから呼ばれるログ出力の処理内では、通常 ThreadContext に保持する内容が必要となる。 このため、 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに配置する必要がある。 + [HTTPエラー制御ハンドラ](../../component/handlers/handlers-HttpErrorHandler.md#http-error-handler) より前に配置すること + また、完了時のログ出力にはエラーコードが必要となるため、 [HTTPエラー制御ハンドラ](../../component/handlers/handlers-HttpErrorHandler.md#http-error-handler) より前に配置する必要がある。 + セッションストアIDを出力する場合は [セッション変数保存ハンドラ](../../component/handlers/handlers-SessionStoreHandler.md#session-store-handler) より後ろに配置すること + 詳細は [セッションストアIDについて](../../component/libraries/libraries-http-access-log.md#http-access-log-session-store-id) を参照。 ## アクセスログ出力内容の切り替え diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-character-encoding-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-character-encoding-handler.md index 072d7c40c..3aeef0734 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-character-encoding-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-character-encoding-handler.md @@ -36,6 +36,7 @@ ## 制約 本ハンドラは、どのハンドラよりも前に設定すること。 + このハンドラより前にハンドラを設定した場合、以下の問題が発生する可能性がある。 * レスポンスに対する規定の文字エンコーディングが設定されない @@ -82,6 +83,7 @@ WEB APIのように全てのレスポンスに対して規定の文字エンコ 以下に例を示す。 ポイント + * リクエストのエンコーディングを変更する場合は、 resolveRequestEncoding をオーバライドする。 * レスポンスのエンコーディングを変更する場合は、 resolveResponseEncoding をオーバライドする。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-error-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-error-handler.md index a20f36765..5e3a47fbf 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-error-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-error-handler.md @@ -40,37 +40,47 @@ ## 制約 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに配置すること + 本ハンドラで生成した HttpResponse を [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) が処理する。 このため、本ハンドラを [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに設定する必要がある。 ## 例外の種類に応じたログ出力とレスポンス生成 nablarch.fw.NoMoreHandlerException + INFO 404 リクエストを処理すべきハンドラが存在しなかったことを意味するため、証跡ログとして記録する。 また、処理すべき *action class* が存在しなかったことを意味するため、HTTPステータスコードが *404* のレスポンスを生成する。 + nablarch.fw.web.HttpErrorResponse + ログ出力なし HttpErrorResponse#getResponse() 後続のハンドラで業務例外(バリデーションなどを行った結果の例外)が発生したことを意味するので、ログ出力は行わない。 + nablarch.fw.Result.Error + 設定による Error#getStatusCode() [nablarch.fw.Result.Errorのログ出力について](../../component/handlers/handlers-http-messaging-error-handler.md#http-messaging-error-handler-write-failure-log-pattern) を参照 + nablarch.core.message.ApplicationException と nablarch.fw.messaging.MessagingException + - 400 クライアントからのリクエストが不正であることを示す例外のため、HTTPステータスコードが *400* のレスポンスを生成する。 + 上記以外の例外及びエラー + FATAL 500 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-request-parsing-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-request-parsing-handler.md index 2b7da8c7b..416411a6f 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-request-parsing-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-request-parsing-handler.md @@ -39,9 +39,12 @@ RequestMessage ## 制約 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに配置すること + 変換処理に失敗した場合は、ステータスコードを指定したレスポンスをクライアントに返すため、 本ハンドラは [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに配置する必要がある。 + [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに配置すること + スレッドコンテキスト上に設定されたリクエストIDをもとに、 要求電文と応答電文の変換に使う DataRecordFormatter を取得するため、 @@ -60,12 +63,16 @@ DataRecordFormatter を取得するため、 | リクエストボディ | フレームワーク制御ヘッダとデータレコード | 詳細は、 [リクエストボディの変換](../../component/handlers/handlers-http-messaging-request-parsing-handler.md#http-messaging-request-parsing-handler-convert-body) を参照。 | リクエストボディの変換 + リクエストボディの変換は、 [汎用データフォーマット](../../component/libraries/libraries-data-format.md#data-format) により行う。 以下のルールでフォーマット定義ファイルを準備しておく必要がある。 受信時のフォーマット定義ファイルの論理名 + <リクエストID> + "_RECEIVE" + 送信時のフォーマット定義ファイルの論理名 + <リクエストID> + "_SEND" デフォルトでは読み込んだデータを構造化データとして取り扱うが、 @@ -77,6 +84,7 @@ StructuredFwHeaderDefinition 設定例を以下に示す。 ポイント + * キー情報は、 StructuredFwHeaderDefinition#fwHeaderKeys プロパティに指定する。 @@ -108,25 +116,32 @@ StructuredFwHeaderDefinition ``` + 変換時の例外処理 + 変換時に捕捉する例外と処理内容を以下に示す。 以下に示していない例外については捕捉しない。 nablarch.fw.results.RequestEntityTooLarge + INFO 413 リクエストボディのサイズ上限を超過したため、証跡ログとして記録する。 そして、サイズ超過を表すため、HTTPステータスコードが *413* のレスポンスを生成する。 + nablarch.fw.messaging.MessagingException + INFO 400 リクエストボディが不正なため、証跡ログとして記録する。 そして、クライアントエラーを表すため、HTTPステータスコードが *400* のレスポンスを生成する。 + nablarch.core.dataformat.InvalidDataFormatException + INFO 400 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-response-building-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-response-building-handler.md index 31d63bd03..78778d69e 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-response-building-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-messaging-response-building-handler.md @@ -35,6 +35,7 @@ ## 制約 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) よりも後ろに設定すること + このハンドラで生成した HTTPレスポンスオブジェクト を [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) がクライアントに返却するため。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-request-java-package-mapping.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-request-java-package-mapping.md index a6fe0daf6..d45a18284 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-request-java-package-mapping.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-request-java-package-mapping.md @@ -13,6 +13,7 @@ 本クラスを使用したディスパッチでは、URL形式は下記の通りであることを想定している。 URL形式 + /// 上記形式の<>で囲まれた部分はそれぞれ下記を意味する。 @@ -57,6 +58,7 @@ URL形式 ## 制約 ハンドラキューの最後に置くこと + 本ハンドラは、後続のハンドラを呼び出さない。 このため、本ハンドラの配置はハンドラキューの最後に置くこと。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-response-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-response-handler.md index 362e61c18..76e253a70 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-response-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-response-handler.md @@ -16,13 +16,20 @@ 応答の方法には、下記4通りが存在する。 サーブレットフォワード + サーブレットにフォワードを行い、レスポンスを描画する。主にJSPを使ったレスポンス時に使用する。 + カスタムレスポンスライター + カスタムレスポンスライター(後述)を使用して、任意のレスポンス出力処理を行う。 主にテンプレートエンジン等の外部ライブラリを使ったレスポンス時に使用する。 + リダイレクト + クライアントにリダイレクトを行う応答を返す。 + 直接レスポンス + ServletResponse の getOutputStream メソッドを使用して直接 レスポンスを行う。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-rewrite-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-rewrite-handler.md index e0c36fb9a..31c449bc0 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-rewrite-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-http-rewrite-handler.md @@ -38,9 +38,12 @@ ## 制約 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに配置すること + 本ハンドラで書き換えたコンテンツパスは、レスポンスハンドラにより使用される。 このため、本ハンドラは [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) の後ろに配置する必要がある。 + [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より前に配置すること + 本ハンドラでは、スレッドコンテキストに入れられるリクエストパスを書き換える。 このため、本ハンドラは [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より前に配置する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-jaxrs-access-log-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-jaxrs-access-log-handler.md index 2a2cbf495..557bac2cf 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-jaxrs-access-log-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-jaxrs-access-log-handler.md @@ -34,11 +34,16 @@ ## 制約 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに配置すること + このハンドラから呼ばれるログ出力の処理内では、通常 ThreadContext に保持する内容が必要となる。 このため、 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに配置する必要がある。 + [HTTPエラー制御ハンドラ](../../component/handlers/handlers-HttpErrorHandler.md#http-error-handler) より前に配置すること + また、完了時のログ出力にはエラーコードが必要となるため、 [HTTPエラー制御ハンドラ](../../component/handlers/handlers-HttpErrorHandler.md#http-error-handler) より前に配置する必要がある。 + セッションストアIDを出力する場合は [セッション変数保存ハンドラ](../../component/handlers/handlers-SessionStoreHandler.md#session-store-handler) より後ろに配置すること + 詳細は [セッションストアIDについて](../../component/libraries/libraries-jaxrs-access-log.md#jaxrs-access-log-session-store-id) を参照。 ## アクセスログ出力内容の切り替え diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-jaxrs-bean-validation-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-jaxrs-bean-validation-handler.md index d6bd61e7e..26940b2e9 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-jaxrs-bean-validation-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-jaxrs-bean-validation-handler.md @@ -42,6 +42,7 @@ ApplicationException を送出して処理を終了する。 ## 制約 [リクエストボディ変換ハンドラ](../../component/handlers/handlers-body-convert-handler.md#body-convert-handler) よりも後ろに設定すること + このハンドラは、 [リクエストボディ変換ハンドラ](../../component/handlers/handlers-body-convert-handler.md#body-convert-handler) がリクエストボディから変換したForm(Bean)に対してバリデーションを行うため。 ## リソース(アクション)で受け取るForm(Bean)に対してバリデーションを実行する diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-keitai-access-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-keitai-access-handler.md index edc1beba6..a02dba98c 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-keitai-access-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-keitai-access-handler.md @@ -34,9 +34,12 @@ ## 制約 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後ろに配置すること + 本ハンドラは、通常クライントからのJSP上にJavaScriptを出力しないよう変数を設定するため、 JSPへのフォワード処理を行う [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後に配置する必要がある。 + [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より前に配置すること + 通常JSPが出力するJavaScriptで決定されるURIを決定する処理が含まれるため、 URIを使用する [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より前に配置する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-loop-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-loop-handler.md index 53726fc9f..31b2cb0ca 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-loop-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-loop-handler.md @@ -47,6 +47,7 @@ ## 制約 [データベース接続管理ハンドラ](../../component/handlers/handlers-database-connection-management-handler.md#database-connection-management-handler) より後ろに設定すること + データベースに対するトランザクションを制御する場合には、トランザクション管理対象のデータベース接続がスレッド上に存在している必要がある。 ## トランザクション制御対象を設定する @@ -115,6 +116,7 @@ 以下に例を示す。 コールバック処理を行うハンドラの作成 + 以下実装例のように、 TransactionEventCallback を実装したハンドラを作成する。 transactionNormalEnd にトランザクションコミット時のコールバック処理を実装し、 @@ -141,7 +143,9 @@ public static class SampleHandler } } ``` + ハンドラキューを構築する + 以下のように、このハンドラの後続ハンドラにコールバック処理を実装したハンドラを設定する。 ```xml diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-main.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-main.md index 7fc0bd388..97422447c 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-main.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-main.md @@ -49,9 +49,12 @@ javaコマンドで Mainクラス を指定してアプリケーションを起 以下のオプションのうちいずれかが欠けていた場合は、即座に異常終了する。(終了コード = 127) -diConfig + システムリポジトリの設定ファイルのパスを指定する。 このオプションで指定されたパスを使ってシステムリポジトリを初期化する。 + -requestPath + 実行するアクションとリクエストIDを指定する。 以下の書式で定義される文字列を設定する。 @@ -63,7 +66,9 @@ javaコマンドで Mainクラス を指定してアプリケーションを起 このオプションで指定されたリクエストパスを Request#getRequestPath が返すようになる。 + -userId + ユーザIDを設定する。 この値はセッションコンテキスト変数に `user.id` という名前で格納される。 @@ -112,5 +117,5 @@ public Result handle(String inputData, ExecutionContext ctx) { | 例外クラス | 処理内容 | |---|---| -| Result.Error (サブクラス含む) | FATALレベルのログ出力を行う。 ログ出力後、ハンドラの処理結果として、以下の値を返す。 ステータスコードが0~127の場合 ステータスコードをそのまま返す。 ステータスコードが0~127以外の場合 127を返す。 | +| Result.Error (サブクラス含む) | FATALレベルのログ出力を行う。 ログ出力後、ハンドラの処理結果として、以下の値を返す。 ステータスコードが0~127の場合 ステータスコードをそのまま返す。 ステータスコードが0~127以外の場合 127を返す。 | | 上記以外の例外クラス | FATALレベルのログ出力を行う。 ログ出力後、ハンドラの処理結果として、127を返す。 | diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-message-reply-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-message-reply-handler.md index f071729a2..99821c416 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-message-reply-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-message-reply-handler.md @@ -34,15 +34,21 @@ ## 制約 [メッセージングコンテキスト管理ハンドラ](../../component/handlers/handlers-messaging-context-handler.md#messaging-context-handler) よりも後ろに設定すること + 本ハンドラは、応答電文を送信(メッセージキューへのプット)する。 このため、MQへの接続を確立する [メッセージングコンテキスト管理ハンドラ](../../component/handlers/handlers-messaging-context-handler.md#messaging-context-handler) より後ろに本ハンドラを設定する必要がある。 + [トランザクション制御ハンドラ](../../component/handlers/handlers-transaction-management-handler.md#transaction-management-handler) との位置関係について + [トランザクション制御ハンドラ](../../component/handlers/handlers-transaction-management-handler.md#transaction-management-handler) との位置関係は、2相コミットを使用するか否かで変わる。 2相コミットを使用する場合 + データベースのトランザクションとメッセージキュー(JMS)のトランザクションを、トランザクションマネージャで纏めてコミットする。 このため、トランザクション制御前に応答電文を送信する必要があり、 [トランザクション制御ハンドラ](../../component/handlers/handlers-transaction-management-handler.md#transaction-management-handler) より後ろに本ハンドラを設定する必要がある。 + 2相コミットを使用しない場合 + 本ハンドラが応答を送信する前に業務処理の結果を確定させる必要がある。 このため、 [トランザクション制御ハンドラ](../../component/handlers/handlers-transaction-management-handler.md#transaction-management-handler) は、本ハンドラより後ろに設定する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-message-resend-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-message-resend-handler.md index aa67b9490..50d91e48e 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-message-resend-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-message-resend-handler.md @@ -48,9 +48,12 @@ ## 制約 [電文応答制御ハンドラ](../../component/handlers/handlers-message-reply-handler.md#message-reply-handler) よりも後ろに設定すること + 本ハンドラで作成した応答電文を送信する必要がある。 このため、電文を送信するための [電文応答制御ハンドラ](../../component/handlers/handlers-message-reply-handler.md#message-reply-handler) よりも後ろに本ハンドラを設定する必要がある。 + [トランザクション制御ハンドラ](../../component/handlers/handlers-transaction-management-handler.md#transaction-management-handler) よりも後ろに設定すること + 本ハンドラでは、応答電文をデータベースに保存する。 このため、データベースへのトランザクション制御を実現する [トランザクション制御ハンドラ](../../component/handlers/handlers-transaction-management-handler.md#transaction-management-handler) よりも後ろに本ハンドラを設定する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-multipart-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-multipart-handler.md index 00e441b54..e3fac7755 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-multipart-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-multipart-handler.md @@ -64,6 +64,7 @@ HTTPリクエストがマルチパート形式の場合に、ボディ部を解 以下に一時ファイルの保存先ディレクトリの設定例を示す。 ポイント + * 保存先ディレクトリの論理名は、 `uploadFileTmpDir` とすること。 ```xml @@ -171,6 +172,7 @@ web.xml へのエラーページ設定を省略した場合は、ウェブアプ 以下に実装例を示す。 ポイント + * HttpRequest#getPart を呼び出してアップロードされたファイルを取得する。 * HttpRequest#getPart の引数には、パラメータ名を指定する。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-nablarch-tag-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-nablarch-tag-handler.md index b2ef3e180..5624a3dd4 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-nablarch-tag-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-nablarch-tag-handler.md @@ -46,8 +46,11 @@ Nablarchの [JSPカスタムタグ](../../component/libraries/libraries-tag.md#t ## 制約 [マルチパートリクエストハンドラ](../../component/handlers/handlers-multipart-handler.md#multipart-handler) より後ろに設定すること + 本ハンドラは、 [JSPカスタムタグ](../../component/libraries/libraries-tag.md#tag) に必要なリクエスト処理でリクエストパラメータにアクセスするため。 + [hidden暗号化](../../component/libraries/libraries-tag.md#tag-hidden-encryption) 使用時は、[スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに設定すること + hidden暗号化対象のリクエストか否かを判定するために、スレッドコンテキストからリクエストIDを取得するため。 ## 復号に失敗(改竄エラー、セッション無効化エラー)した場合のエラーページを設定する diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-normalize-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-normalize-handler.md index 418245cbf..06179fcd3 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-normalize-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-normalize-handler.md @@ -34,6 +34,7 @@ ## 制約 [マルチパートリクエストハンドラ](../../component/handlers/handlers-multipart-handler.md#multipart-handler) より後ろに配置すること + このハンドラはリクエストパラータにアクセスする。 このため、 [マルチパートリクエストハンドラ](../../component/handlers/handlers-multipart-handler.md#multipart-handler) よりも後ろに設定する必要がある。 @@ -52,6 +53,7 @@ 以下に例を示す。 ノーマライザの実装例 + ```java public class SampleNormalizer implements Normalizer { @@ -72,7 +74,9 @@ public class SampleNormalizer implements Normalizer { } } ``` + コンポーネント設定ファイルに定義する + 以下の設定例のように、適用したいノーマライザを設定する。 複数のノーマライザを設定した場合、より上に設定したものから順次ノーマライズ処理が実行される。 このため、ノーマライズ処理に順序性がある場合には、設定順に注意すること。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-on-double-submission.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-on-double-submission.md index 4b2eb310b..e85141189 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-on-double-submission.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-on-double-submission.md @@ -53,6 +53,7 @@ BasicDoubleSubmissionHandler では、アノテーションの属性が指定されなかった場合に、自身のプロパティに設定されたリソースパス、メッセージID、ステータスコードを使用する。 設定例 + ```xml diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-on-error.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-on-error.md index 039ab51d6..e73005a7d 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-on-error.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-on-error.md @@ -44,6 +44,7 @@ OnError アノテーションを、 以下の例では、業務アクションのメソッド内で業務エラー( ApplicationException )が発生した場合の遷移先を指定している。 ポイント + * type属性には、RuntimeException 及びそのサブクラスを指定できる。 * type属性に指定した例外のサブクラスも処理の対象となる。 @@ -66,6 +67,7 @@ public HttpResponse handle(HttpRequest request, ExecutionContext context) { バリデーションエラー発生時に初期表示用のメソッドにフォワードする場合の実装例を以下に示す。 ポイント + * path属性に、内部フォワード用のパスを設定する。 ```java diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-permission-check-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-permission-check-handler.md index 17f080fd5..b181acf5f 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-permission-check-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-permission-check-handler.md @@ -39,13 +39,18 @@ PermissionFactory を実装したクラスを本ハンドラに設定する必 ## 制約 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに配置すること + 本ハンドラではスレッドコンテキスト上に設定されたリクエストIDとユーザIDをもとに認可チェックを行うため、 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに本ハンドラを配置する必要がある。 + [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) より後ろに配置すること + 内部フォーワードが行われた際に、フォーワード先のリクエストID( [内部リクエストID](../../component/handlers/handlers-forwarding-handler.md#internal-request-id) )をもとに 認可チェックを行いたい場合は、 [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) より後ろに本ハンドラを配置する必要がある。 合わせて、 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) の `attributes` に InternalRequestIdAttribute を追加すること。 + [HTTPエラー制御ハンドラ](../../component/handlers/handlers-HttpErrorHandler.md#http-error-handler) より後ろに配置すること + 認可チェックエラーの場合に表示するエラーページを指定するため、 [HTTPエラー制御ハンドラ](../../component/handlers/handlers-HttpErrorHandler.md#http-error-handler) より後ろに本ハンドラを配置する必要がある。 @@ -55,11 +60,14 @@ PermissionFactory を実装したクラスを本ハンドラに設定する必 チェックの詳細は、 [ハンドラによる認可チェック](../../component/libraries/libraries-authorization-permission-check.md#permission-check) を参照。 権限がある場合 + [業務ロジック](../../component/libraries/libraries-authorization-permission-check.md#permission-check-server-side-check) や [画面表示の制御](../../component/libraries/libraries-authorization-permission-check.md#permission-check-view-control) で参照できるように、 認可チェックに使用した Permission をスレッドローカルに設定する。 そして、後続ハンドラを呼び出す。 + 権限がない場合 + Forbidden(403) を送出する。 チェック対象のリクエストIDをフォーワード先のリクエストIDに変更したい場合は、 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-post-resubmit-prevent-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-post-resubmit-prevent-handler.md index b1980afbd..b57bfb068 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-post-resubmit-prevent-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-post-resubmit-prevent-handler.md @@ -51,6 +51,7 @@ POSTで受け付けたリクエストに対して、リダイレクトを使用 ## 制約 [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) より前に配置すること + 本ハンドラは、リクエストの内容をセッションに保持して処理をリダイレクトする。 カスタムタグ制御ハンドラで暗号化パラメータを戻す前にリダイレクトを行う必要があるため、本ハンドラは [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) より前に配置する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-process-resident-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-process-resident-handler.md index 9efbadb99..9415d9de4 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-process-resident-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-process-resident-handler.md @@ -38,6 +38,7 @@ ## 制約 本ハンドラは、リトライハンドラよりも後ろに設定すること + 本ハンドラで実行時例外を捕捉した場合、リトライ可能例外( RetryableException )でラップしてから再送出し、 プロセスの継続制御を [リトライハンドラ](../../component/handlers/handlers-retry-handler.md#retry-handler) に委譲する。 このため、このハンドラはリトライハンドラより後に設定する必要がある。 @@ -94,19 +95,28 @@ 以下に例外毎の処理内容を示す。 サービス閉塞中例外( ServiceUnavailable ) + サービス閉塞中例外の場合には、データ監視間隔に設定された時間分待機後に、再度後続ハンドラを実行する。 + リトライ可能例外 + リトライ可能例外( RetryUtil#isRetryable() が真を返す場合)の場合は、 何もせずに捕捉した例外を再送出する。 + プロセスを異常終了する例外 + プロセスを異常終了させることを示す例外の場合は、なにもせずに捕捉した例外を再送出する。 プロセスを異常終了させる例外は、 abnormalEndExceptions プロパティに設定する。 デフォルトでは、 ProcessAbnormalEnd (サブクラス含む)が、異常終了対象クラスとなる。 + プロセスを正常終了させる例外 + 後続のハンドラから戻された結果オブジェクトを、本ハンドラの戻り値として処理を終了する。 プロセスを正常終了させる例外については、 [プロセス常駐化ハンドラの終了方法](../../component/handlers/handlers-process-resident-handler.md#process-resident-handler-normal-end) を参照。 + 上記以外の例外 + 例外情報をログに記録し、リトライ可能例外 ( RetryableException )でラップし再送出する。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-process-stop-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-process-stop-handler.md index f1ebe0b1c..7ab681d7c 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-process-stop-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-process-stop-handler.md @@ -51,6 +51,7 @@ ## 制約 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに設定すること + 本ハンドラは、スレッドコンテキスト上のリクエストIDをもとに停止処理を行うため、 [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) より後ろに本ハンドラを設定する必要がある。 @@ -62,6 +63,7 @@ 以下に設定例を示す。 ポイント + * 都度起動バッチで使用する場合、本ハンドラはサブスレッド側に設定する。 * 常駐バッチで使用する場合、本ハンドラはメインスレッド側に設定する。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-request-thread-loop-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-request-thread-loop-handler.md index af755f752..29bf90ccd 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-request-thread-loop-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-request-thread-loop-handler.md @@ -49,6 +49,7 @@ ## 制約 [リトライハンドラ](../../component/handlers/handlers-retry-handler.md#retry-handler) より後ろに配置すること + このハンドラでは、処理が継続可能な例外の場合に リトライ可能例外(Retryable) を送出する。 このため、リトライ可能例外を処理する [リトライハンドラ](../../component/handlers/handlers-retry-handler.md#retry-handler) よりも後ろにこのハンドラを設定する必要がある。 @@ -86,28 +87,49 @@ このハンドラで行う後続ハンドラで発生した例外(エラー)に応じた処理内容について解説する。 サービス閉塞中例外(ServiceUnavailable) + 一定時間待機後に、再度後続ハンドラに処理を委譲する。 待機時間の設定方法は、 [サービス閉塞中の待機時間を設定する](../../component/handlers/handlers-request-thread-loop-handler.md#request-thread-loop-handler-interval) を参照。 + プロセス停止要求を示す例外(ProcessStop) + プロセス停止要求を示す例外であるため、本ハンドラの処理を終了する。 + プロセスの異常終了を示す例外(ProcessAbnormalEnd) + プロセスの異常終了を示す例外のため、捕捉した例外を再送出する。 + 処理を継続することができなかったことを示すサービスエラー(ServiceError) + 補足した例外クラスにログ出力処理を委譲し、 リトライ可能例外(Retryable) を送出する。 + ハンドラの処理が異常終了したことを示す例外(Result.Error) + `FATAL` レベルのログを出力し、 リトライ可能例外(Retryable) を送出する。 + 実行時例外(RuntimeException) + `FATAL` レベルのログを出力し、 リトライ可能例外(Retryable) を送出する。 + スレッドの停止を示す例外(ThreadDeath) + `INFO` レベルのログを出力し、補足した例外(ThreadDeath)を再送出する。 + スタックオーバーフローエラー(StackOverflowError) + `FATAL` レベルのログを出力し、 リトライ可能例外(Retryable) を送出する。 + ヒープ不足のエラー(OutOfMemoryError) + 標準エラー出力にヒープ不足が発生したことを示すメッセージを出力し、 `FATAL` レベルのログ出力を行う。 (ログ出力時に再度ヒープ不足が発生する可能性があるため、標準エラー出力にメッセージ出力後にログを出力する。) ヒープ不足の原因不足となったオブジェクトへの参照が切れ、処理継続可能な場合があるため リトライ可能例外(Retryable) を送出する。 + JVMの異常を示すエラー(VirtualMachineError) + 発生した例外を再送出する + 上記以外のエラー + `FATAL` レベルのログを出力し、 リトライ可能例外(Retryable) を送出する。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-resource-mapping.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-resource-mapping.md index 206b74251..07b63287f 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-resource-mapping.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-resource-mapping.md @@ -51,9 +51,12 @@ ## 制約 [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) よりも後に配置すること + 本ハンドラは、 [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) の機能により提供される `forward://` スキームを使用できる。 このため、本ハンドラは [内部フォーワードハンドラ](../../component/handlers/handlers-forwarding-handler.md#forwarding-handler) より後に配置する必要がある。 + [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) よりも後に配置すること + 本ハンドラは、 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) の機能により提供される `servlet://` 、 `file://` 、 `classpath://` スキームを使用できる。 また、エラーが発生した際は 404(Not Found)の応答を返す。 これらの応答を処理するため、本ハンドラは [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) より後に配置する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-secure-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-secure-handler.md index 8f7e65e4a..a94a8d590 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-secure-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-secure-handler.md @@ -48,6 +48,7 @@ ## 制約 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) よりも後ろに設定すること + 本ハンドラで設定したレスポンスヘッダを、 [HTTPレスポンスハンドラ](../../component/handlers/handlers-http-response-handler.md#http-response-handler) がServlet APIのレスポンスオブジェクトに設定するため。 ## デフォルトで適用されるヘッダの値を変更したい diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-status-code-convert-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-status-code-convert-handler.md index ae21f6023..5873e3151 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-status-code-convert-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-status-code-convert-handler.md @@ -29,6 +29,7 @@ ## 制約 [共通起動ランチャ](../../component/handlers/handlers-main.md#main) の直後に設定すること + 本ハンドラが処理結果のステータスコードをプロセスの終了コードに変換するため。 ## ステータスコード→プロセス終了コード変換 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-thread-context-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-thread-context-handler.md index 6e94e8c62..8ee66ad23 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-thread-context-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-thread-context-handler.md @@ -66,24 +66,32 @@ ThreadContextAttributeインタフェース デフォルトで以下のクラスを提供している。 リクエストID、内部リクエストID + * RequestIdAttribute * InternalRequestIdAttribute [1] [認可チェックハンドラ](../../component/handlers/handlers-permission-check-handler.md#permission-check-handler) や [サービス提供可否チェックハンドラ](../../component/handlers/handlers-ServiceAvailabilityCheckHandler.md#serviceavailabilitycheckhandler) のような、内部リクエストIDに対する処理を実施するハンドラを使用する場合に設定する。 ユーザID + * UserIdAttribute * UserIdAttributeInSessionStore + 言語 + * LanguageAttribute * HttpLanguageAttribute * LanguageAttributeInHttpCookie * LanguageAttributeInHttpSession + タイムゾーン + * TimeZoneAttribute * TimeZoneAttributeInHttpCookie * TimeZoneAttributeInHttpSession + 実行時ID + * ExecutionIdAttribute これらのクラスは、コンポーネント設定ファイルに定義を追加して使用する。 @@ -207,6 +215,7 @@ LanguageAttributeInHttpUtil ここでは、クッキーに言語を保持し、リンクにより言語を選択させる画面の実装例を示す。 設定例 + ```xml @@ -216,7 +225,9 @@ LanguageAttributeInHttpUtil ``` + JSPの実装例 + ```jsp <%-- n:submitLinkタグを使用しリンクを出力し n:paramタグを使用しリンク毎に別々の言語を送信する --%> @@ -234,7 +245,9 @@ JSPの実装例 ``` + ハンドラの実装例 + ```java // ユーザが選択した言語の保持を行うハンドラ。 // 複数画面でユーザに言語を選択させる場合を想定しハンドラとして実装する。 @@ -276,6 +289,7 @@ TimeZoneAttributeInHttpUtil ここでは、クッキーにタイムゾーンを保持し、リンクによりタイムゾーンを選択させる画面の実装例を示す。 設定例 + ```xml @@ -285,7 +299,9 @@ TimeZoneAttributeInHttpUtil ``` + JSPの実装例 + ```jsp <%-- n:submitLinkタグを使用しリンクを出力し n:paramタグを使用しリンク毎に別々のタイムゾーンを送信する --%> @@ -303,7 +319,9 @@ JSPの実装例 ``` + ハンドラの実装例 + ```java // ユーザが選択したタイムゾーンの保持を行うハンドラ。 // 複数画面でユーザにタイムゾーンを選択させる場合を想定しハンドラとして実装する。 diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-transaction-management-handler.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-transaction-management-handler.md index f805706d3..2e1e1a55f 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-transaction-management-handler.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-transaction-management-handler.md @@ -52,6 +52,7 @@ ## 制約 [データベース接続管理ハンドラ](../../component/handlers/handlers-database-connection-management-handler.md#database-connection-management-handler) より後ろに配置すること + データベースに対するトランザクションを制御する場合には、トランザクション管理対象のデータベース接続がスレッド上に存在している必要がある。 このため、本ハンドラは [データベース接続管理ハンドラ](../../component/handlers/handlers-database-connection-management-handler.md#database-connection-management-handler) より後ろに配置する必要がある。 @@ -128,6 +129,7 @@ 以下に例を示す。 コールバック処理を行うハンドラの作成 + 以下実装例のように、 TransactionEventCallback を実装したハンドラを作成する。 transactionNormalEnd にトランザクションコミット時のコールバック処理を実装し、 @@ -154,7 +156,9 @@ public static class SampleHandler } } ``` + ハンドラキューを構築する + 以下のように、このハンドラの後続ハンドラにコールバック処理を実装したハンドラを設定する。 ```xml diff --git a/.claude/skills/nabledge-5/docs/component/handlers/handlers-use-token.md b/.claude/skills/nabledge-5/docs/component/handlers/handlers-use-token.md index 6915119c4..b82ff2a92 100644 --- a/.claude/skills/nabledge-5/docs/component/handlers/handlers-use-token.md +++ b/.claude/skills/nabledge-5/docs/component/handlers/handlers-use-token.md @@ -46,6 +46,7 @@ public HttpResponse confirm(HttpRequest req, ExecutionContext ctx) { また、入力フォームへ明示的にトークンを埋め込む必要がある。 Thymeleafでの実装例 + ```xml
diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-authorization-permission-check.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-authorization-permission-check.md index 6fd25b462..c6820ebd9 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-authorization-permission-check.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-authorization-permission-check.md @@ -58,8 +58,11 @@ 例えば、ユーザ登録機能であれば、以下のようなデータとなる。 認可チェック単位 + ユーザ登録 + 認可チェック単位「ユーザ登録」に紐付くリクエスト + 入力画面の初期表示 入力画面の確認ボタン 確認画面の登録ボタン @@ -89,9 +92,12 @@ テーブルのレイアウトは以下となる。 グループ + | グループID(PK) | グループを識別するための値。文字列型 | |---|---| + システムアカウント + | ユーザID(PK) | ユーザを識別するための値。文字列型 | |---|---| | ユーザIDロック状態 | ユーザIDのロック状態。文字列型。 | @@ -103,7 +109,9 @@ yyyyMMdd形式で、指定しない場合は”19000101” yyyyMMdd形式で、指定しない場合は”99991231” + グループシステムアカウント + | グループID(PK) | グループを識別するための値。文字列型 | |---|---| | ユーザID(PK) | ユーザを識別するための値。文字列型 | @@ -113,18 +121,26 @@ yyyyMMdd形式で、指定しない場合は”99991231” yyyyMMdd形式で、指定しない場合は”19000101” yyyyMMdd形式で、指定しない場合は”99991231” + 認可チェック単位 + | 認可チェック単位ID(PK) | 認可チェック単位を識別するための値。文字列型 | |---|---| + 認可チェック単位リクエスト + | 認可チェック単位ID(PK) | 認可チェック単位を識別するための値。文字列型 | |---|---| | リクエストID(PK) | リクエストを識別するための値。文字列型 | + グループ権限 + | グループID(PK) | グループを識別するための値。文字列型 | |---|---| | 認可チェック単位ID(PK) | 認可チェック単位を識別するための値。文字列型 | + システムアカウント権限 + | ユーザID(PK) | ユーザを識別するための値。文字列型 | |---|---| | 認可チェック単位ID(PK) | 認可チェック単位を識別するための値。文字列型 | diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-bean-util.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-bean-util.md index de5858165..47387c8b7 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-bean-util.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-bean-util.md @@ -34,6 +34,7 @@ BeanUtil が提供するAPIを使用して、任意のJava Beansに対する操 BeanUtilの使用例を以下に示す。 Bean定義 + ```java public class User { private Long id; @@ -54,7 +55,9 @@ public class UserDto { // getter & setterは省略 } ``` + BeanUtilの使用例 + 幾つかのAPIの使用例を以下に示す。 詳細は、BeanUtilの Javadoc を参照。 @@ -205,6 +208,7 @@ public class SampleConversionManager implements ConversionManager { 1. コンポーネント設定ファイルに、 ConversionManager の実装クラスを設定する。 ポイント + * コンポーネント名は **conversionManager** とすること。 ```xml @@ -235,11 +239,14 @@ public class SampleConversionManager implements ConversionManager { 以下に設定方法を示す。 ポイント + * コンポーネント名を **conversionManager** で BasicConversionManager を定義する。 * `datePatterns` プロパティに許容する日付及び日時形式のフォーマットを設定する。 * `numberPatterns` プロパティに許容する数値形式のフォーマット定義を設定する。 * 複数のフォーマットを許容する場合は複数設定する。 + 設定例 + ```xml @@ -279,10 +286,13 @@ public class SampleConversionManager implements ConversionManager { 以下に実装例を示す。 ポイント + * コピー元(コピー先)のプロパティに対応したフィールドに対して CopyOption アノテーションを設定する。 * CopyOptionの `datePattern` に許容する日付及び日時のフォーマットを指定する。 * CopyOptionの `numberPattern` に許容する数値のフォーマットを指定する。 + 実装例 + ```java public class Bean { // 許容する日時フォーマットを指定する @@ -308,10 +318,13 @@ OSSなどを用いてBeanを自動生成している場合に [プロパティ 以下に実装例を示す。 ポイント + * CopyOptions を使用してプロパティに対して設定する。 `CopyOptions` の構築方法は、 CopyOptions.Builder を参照。 * 生成した CopyOptions を使用して BeanUtil を呼び出す。 + 実装例 + ```java final CopyOptions copyOptions = CopyOptions.options() // timestampプロパティに対して許容するフォーマットを指定 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-bean-validation.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-bean-validation.md index c663024b5..ea50d2993 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-bean-validation.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-bean-validation.md @@ -95,6 +95,7 @@ Nablarchで提供しているバリデータは以下のパッケージ内のア Bean Validationを使うために必要となる設定を以下に示す。 MessageInterpolatorの設定 + Bean Validationでバリデーションエラーが発生した際のメッセージを構築するクラス( MessageInterpolator を実装したクラス)を設定する。 設定を省略した場合(デフォルト)は、 [メッセージ管理](../../component/libraries/libraries-message.md#message) を使用する NablarchMessageInterpolator が使用される。 @@ -109,11 +110,17 @@ Bean Validationでバリデーションエラーが発生した際のメッセ ``` + ドメインバリデーション用の設定 + [ドメインバリデーションを使う](../../component/libraries/libraries-bean-validation.md#bean-validation-domain-validation) を参照 + ウェブアプリケーションでBean Validationを使うための設定 + [ウェブアプリケーションのユーザ入力値のチェックを行う](../../component/libraries/libraries-bean-validation.md#bean-validation-web-application) を参照 + RESTfulウェブサービスでBean Validationを使うための設定 + [RESTfulウェブサービスのユーザ入力値のチェックを行う](../../component/libraries/libraries-bean-validation.md#bean-validation-restful-web-service) を参照 ### バリデーションエラー時のエラーメッセージを定義する @@ -131,6 +138,7 @@ RESTfulウェブサービスでBean Validationを使うための設定 以下に例を示す。 Java実装例 + ```java public class SampleForm { @@ -146,7 +154,9 @@ public class SampleForm { // getter、setterは省略 } ``` + メッセージ定義例 + アノテーションで指定されているメッセージIDをキーにメッセージを定義する。 アノテーションのmessage属性を指定していない場合は、デフォルト値がメッセージIDとなる。 @@ -189,6 +199,7 @@ nablarch.core.validation.ee.SystemChar.message={charsetDef}を入力してくだ > このような操作が行われた場合、クライアントサイドバリデーションをすり抜け、サーバサイドに不正な値が送られる可能性がある。 実装例 + [Nablarchで提供しているバリデータ](../../component/libraries/libraries-bean-validation.md#bean-validation-validator) を参照し、アノテーションを設定する。 > **Tip:** @@ -216,6 +227,7 @@ public class SampleForm { ドメインバリデーションを使うための設定や実装例を示す。 ドメインごとのバリデーションルールを定義したBeanの作成 + ドメインバリデーションを使用するには、まずドメインごとのバリデーションルールを持つBean(ドメインBean)を作成する。 このBeanクラスには、ドメインごとのフィールドを定義し、フィールドに対してアノテーションを設定する。 @@ -243,7 +255,9 @@ public class SampleDomainBean { } ``` + ドメインBeanを有効化 + ドメインBeanを有効化するには、 DomainManager 実装クラスを作成する。 getDomainBean では、ドメインBeanのクラスオブジェクトを返す。 @@ -266,7 +280,9 @@ SampleDomainBean を使用したドメインバリデーションが有効とな ``` + 各Beanでドメインバリデーションを使う + Beanのバリデーション対象プロパティに @Domain アノテーションを設定することで、ドメインバリデーションが行われる。 この例では、 userName に対して SampleDomainBean の name フィールドに設定したバリデーションが行われる。 @@ -298,6 +314,7 @@ public class SampleForm { 以下に文字種毎の許容文字セットの定義方法を示す。 コンポーネント定義に許容文字のセットを定義する + 許容文字のセットは、以下のクラスの何れかを使って登録する。 登録する際には、コンポーネント名には文字種を表す任意の名前を設定すること。 @@ -338,7 +355,9 @@ public class SampleForm { ``` + アノテーションで文字種を指定する + 文字種バリデーションを行うプロパティには、 @SystemChar アノテーションを設定する。 このアノテーションの charsetDef 属性には、許容する文字種を表す名前を設定する。 この名前は、上記のコンポーネント設定ファイルに文字種セットを登録した際のコンポーネント名となる。 @@ -376,12 +395,14 @@ public class SampleForm { > ``` サロゲートペアを許容する + このバリデーションでは、デフォルトではサロゲートペアを許容しない。 (例え LiteralCharsetDef で明示的にサロゲートペアの文字を定義していても許容しない) サロゲートペアを許容する場合は次のようにコンポーネント設定ファイルに SystemCharConfig を設定する必要がある。 ポイント + * コンポーネント名は `ee.SystemCharConfig` とすること ```xml @@ -396,6 +417,7 @@ public class SampleForm { 複数の項目を使用した相関バリデーションを行うには、Bean Validationの @AssertTrue アノテーションを使用する。 実装例 + この例では、メールアドレスと確認用メールアドレスが一致していることを検証している。 検証エラーとなった場合は、 message プロパティに指定したメッセージがエラーメッセージとなる。 @@ -438,6 +460,7 @@ public class SampleForm { データベースとの相関バリデーションは、以下理由により業務アクション側で実装すること。 理由 + Bean Validationを使ってデータベースに対する相関バリデーションを実施した場合、 バリデーション実施前の安全ではない値を使ってデータベースアクセスを行うことになる。 (Bean Validation実行中のオブジェクトの値は、安全である保証がない。) @@ -503,6 +526,7 @@ public class SampleForm { 以下に幾つかの実装例を示す。 親BeanとネストしたBeanが1対Nの場合 + ネストしたBeanをバリデーション対象にし、親のBean初期化時にネストしたBeanのフィールドも初期化する。 ネストしたBeanの情報が必須(最低1つは選択 or 入力されていること)の場合は、 Size アノテーションを設定する。 @@ -518,7 +542,9 @@ public SampleForm() { sampleNestForms = new ArrayList<>(); } ``` + 親BeanとネストしたBeanが1対1の場合 + BeanをネストさせずにフラットなBeanにできないか検討すること。 接続先からの要求で対応できない場合には、ネストしたBeanに対するバリデーションが確実に実行されるよう実装すること。 @@ -613,6 +639,7 @@ Bean Validation(JSR349)の仕様では、項目名をメッセージに含める 以下に使用方法を示す。 コンポーネント設定ファイル + メッセージに項目名を含めるメッセージコンバータを生成するファクトリクラスを設定する。 コンポーネント名には、 `constraintViolationConverterFactory` を設定し、 クラス名には ItemNamedConstraintViolationConverterFactory を設定する。 @@ -621,7 +648,9 @@ Bean Validation(JSR349)の仕様では、項目名をメッセージに含める ``` + バリデーション対象のForm + ```java package sample; @@ -634,7 +663,9 @@ public class User { private String address; } ``` + 項目名の定義 + 項目名は、メッセージとして定義する。 項目名のメッセージIDは、バリデーション対象のクラスの完全修飾名 + "." + 項目のプロパティ名とする。 @@ -651,7 +682,9 @@ nablarch.core.validation.ee.Required.message=入力してください。 sample.User.name = ユーザ名 sample.User.address = 住所 ``` + 生成されるメッセージ + 生成されるメッセージは、エラーメッセージの先頭に項目名が付加される。 項目名は `[` 、 `]` で囲まれる。 @@ -678,6 +711,7 @@ ValidatorUtil.validate(form); バリデーションエラーが発生した場合は、 ApplicationException が送出される。 Webアプリケーションの場合 + ウェブアプリケーションで明示的にバリデーションを実行する場合、リクエストパラメータに含まれる入力値をBeanに変換する必要がある。 Beanに変換するためには、バリデーション前のリクエストパラメータを HttpRequest#getParamMap から取得する必要がある。 @@ -741,6 +775,7 @@ Nablarchでも、Bean Validationでグループ指定可能なAPIを提供して 以下に使用例を示す。 バリデーション対象のForm + ```java public class SampleForm { @@ -756,7 +791,9 @@ public class SampleForm { public interface Test1 {} } ``` + バリデーションを実行する処理 + ```java SampleForm form = new SampleForm(); diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-code.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-code.md index 71ceb9b15..1104929d2 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-code.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-code.md @@ -82,6 +82,7 @@ 以下にテーブルの構造及び設定例を示す。 テーブルの構造 + コード情報は、 `コードパターンテーブル` と `コード名称テーブル` の2つのテーブルを使用する。 2テーブルの関係は、以下のとおり。 @@ -129,10 +130,13 @@ VALUEに対応した略称を設定する。 カラム名やカラム数は必要数定義することが出来る。 詳細は、 [名称、略称以外の名称を定義する](../../component/libraries/libraries-code.md#code-option-name) を参照。 + 設定ファイル例 + コード管理を使用する為の設定ファイル例を以下に示す。 ポイント + * BasicCodeManager のコンポーネント名は、 **codeManager** とすること。 * BasicStaticDataCache の loadOnStartup に対する設定値は、 [データのキャッシュタイミングを制御する](../../component/libraries/libraries-static-data-cache.md#static-data-cache-cache-timing) を参照すること。 * BasicStaticDataCache は、初期化が必要なので初期化対象のリストに設定すること。 @@ -185,6 +189,7 @@ VALUEに対応した略称を設定する。 以下に例を示す。 コードパターンテーブルにパターンカラムを定義する + コードパターンテーブルに表示パターンを持つパターン列を定義する。 パターン列は、 CodePatternSchema.patternColumnNames に設定することで使用可能となる。 @@ -194,18 +199,23 @@ VALUEに対応した略称を設定する。 `PATTERN2` ではOTHERを非表示としている。 コードパターンテーブル + | ID | VALUE | PATTERN1 | PATTERN2 | |---|---|---|---| | GENDER | MALE | 1 | 1 | | GENDER | FEMALE | 1 | 1 | | GENDER | OTHER | 1 | 0 | + コード名称テーブル + | ID | VALUE | LANG | SORT_ORDER | NAME | SHORT_NAME | |---|---|---|---|---|---| | GENDER | MALE | ja | 1 | 男性 | 男 | | GENDER | FEMALE | ja | 2 | 女性 | 女 | | GENDER | OTHER | ja | 3 | その他 | 他 | + パターンを指定してコード情報を取得する + コード情報は、 CodeUtil を使用して取得する。 パターンを使用する場合、どのパターンを使用するかは文字列で指定する。 @@ -220,7 +230,9 @@ List pattern1 = CodeUtil.getValues("GENDER", "PATTERN1"); // [MALE, FEMALE]が取得できる。 List pattern2 = CodeUtil.getValues("GENDER", "PATTERN2"); ``` + 画面(JSP)でパターンを指定してコード情報を取得する + コード情報を取得するカスタムタグライブラリを使用する際に、パターンを指定することでそのパターンの情報のみが表示される。 カスタムタグライブラリの詳細な使用方法は、以下を参照。 @@ -244,6 +256,7 @@ PATTERN2で対象となっている、 `男性` と `女性` が出力される 以下に例を示す。 コード名称テーブルのデータ + この例の場合、 `ja` と `en` の2つの言語がサポートされる。 | ID | VALUE | LANG | SORT_ORDER | NAME | SHORT_NAME | @@ -254,7 +267,9 @@ PATTERN2で対象となっている、 `男性` と `女性` が出力される | GENDER | MALE | en | 1 | Male | M | | GENDER | FEMALE | en | 2 | Female | F | | GENDER | OTHER | en | 3 | Unknown | - | + 言語を指定してコード情報を取得する + CodeUtil を使用して、言語に対応した名称を取得出来る。 ```java @@ -279,6 +294,7 @@ CodeUtil.getShortName("GENDER", "MALE", Locale.ENGLISH) // -> M 以下に例を示す。 コード名称テーブルのSORT_ORDERにソート順を設定する + ソート順は、コード名称テーブルのSORT_ORDERカラムに設定する。 この例では、 `MALE` -> `FEMALE` -> `OTHER` の順に表示される。 @@ -288,7 +304,9 @@ CodeUtil.getShortName("GENDER", "MALE", Locale.ENGLISH) // -> M | GENDER | MALE | ja | 1 | 男性 | 男 | | GENDER | FEMALE | ja | 2 | 女性 | 女 | | GENDER | OTHER | ja | 3 | その他 | 他 | + 画面表示例 + カスタムタグライブラリの codeSelect を使用した場合は、 以下のように `MALE(男性)` -> `FEMALE(女性)` -> `OTHER(その他)` の順に表示される。 @@ -304,6 +322,7 @@ CodeUtil.getShortName("GENDER", "MALE", Locale.ENGLISH) // -> M 以下に例を示す。 コード名称テーブルにオプション名称カラムを定義する + コード名称テーブルに、オプションの名称を持つカラムを定義する。 パターン列は、 CodePatternSchema.patternColumnNames に設定することで使用可能となる。 @@ -316,7 +335,9 @@ CodeUtil.getShortName("GENDER", "MALE", Locale.ENGLISH) // -> M | GENDER | MALE | ja | 1 | 男性 | 男 | Male | おとこ | | GENDER | FEMALE | ja | 2 | 女性 | 女 | Female | おんな | | GENDER | OTHER | ja | 3 | その他 | 他 | Other | そのた | + オプションの名称を取得する + オプション名称は、 CodeUtil を使用して取得する。 オプション名称を取得する場合、どのオプション名称を取得するかを文字列で指定する。 @@ -326,7 +347,9 @@ CodeUtil.getShortName("GENDER", "MALE", Locale.ENGLISH) // -> M CodeUtil.getOptionalName("GENDER", "MALE", "KANA_NAME") // -> おとこ CodeUtil.getOptionalName("GENDER", "FEMALE", "FORM_NAME", Locale.JAPANESE) // -> Female ``` + 画面(JSP)でオプショナル名称を表示する + カスタムタグライブラリを使用する際に、オプショナル名称を指定することでその名称を表示できる。 カスタムタグライブラリの詳細な使用方法は以下を参照。 @@ -352,13 +375,16 @@ KANA_NAMEの名称を表示する場合は、以下のように optionColumnName 以下に例を示す。 [Bean Validation](../../component/libraries/libraries-bean-validation.md#bean-validation) + [Bean Validation](../../component/libraries/libraries-bean-validation.md#bean-validation) を使用する場合は、 nablarch.common.code.validator.ee.CodeValue アノテーションを使用する。 ```java @CodeValue(codeId = "GENDER") private String gender; ``` + [Nablarch Validation](../../component/libraries/libraries-nablarch-validation.md#nablarch-validation) + [Nablarch Validation](../../component/libraries/libraries-nablarch-validation.md#nablarch-validation) を使用する場合は、 nablarch.common.code.validator.CodeValue アノテーションを使用する。 ```java diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-data-bind.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-data-bind.md index 54bc4b2dd..be48c2780 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-data-bind.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-data-bind.md @@ -257,6 +257,7 @@ try (ObjectMapper mapper = ObjectMapperFactory.create(Person.class, inpu ウェブアプリケーションで、Java Beansオブジェクトの内容をデータファイルとしてダウンロードするための実装例を以下に示す。 ポイント + * データをメモリ上に展開すると大量データのダウンロード時などにメモリを圧迫する恐れがあるため、一時ファイルに出力する。 * データファイルへの書き込みについては、 [Java Beansオブジェクトの内容をデータファイルに書き込む](../../component/libraries/libraries-data-bind.md#data-bind-bean-to-file) を参照。 * FileResponse オブジェクト生成時にデータファイルを指定する。 @@ -292,6 +293,7 @@ public HttpResponse download(HttpRequest request, ExecutionContext context) { ウェブアプリケーションで、画面からアップロードされたデータファイルをJava Beansオブジェクトとして読み込むための実装例を以下に示す。 ポイント + * PartInfo#getInputStream を使用して、アップロードファイルのストリームを取得する。 * 不正なデータが入力されている可能性があるため、[Bean Validation](../../component/libraries/libraries-bean-validation.md#bean-validation) を使用して入力チェックを行う。 @@ -320,6 +322,7 @@ try (ObjectMapper mapper = ObjectMapperFactory.create(Person.class, part CSVファイルのフォーマット指定は、Java Beansクラスにバインドする場合とMapクラスにバインドする場合で2種類の指定方法がある。 Java Beansクラスにバインドする場合 + 以下のアノテーションを使用してフォーマットを指定する。 * Csv @@ -371,6 +374,7 @@ public class Person { > DataBindConfig を使用したフォーマットの指定はできない。 Mapクラスにバインドする場合 + ObjectMapper の生成時に CsvDataBindConfig を使用して個別にフォーマットを指定する。 @@ -382,6 +386,7 @@ CsvDataBindConfig#withProperties 以下に実装例を示す。 ポイント + * ヘッダタイトル、プロパティ名はCSVの項目順と一致するように定義すること ```java @@ -396,6 +401,7 @@ ObjectMapper mapper = ObjectMapperFactory.create(Map.class, outputStream, c 固定長ファイルのフォーマット指定は、Java Beansクラスにバインドする場合とMapクラスにバインドする場合で2種類の指定方法がある。 Java Beansクラスにバインドする場合 + 以下のアノテーションを使用してフォーマットを指定する。 * FixedLength @@ -442,6 +448,7 @@ public class Person { ``` Mapクラスにバインドする場合 + ObjectMapper の生成時に FixedLengthDataBindConfig を使用して個別にフォーマットを指定する。 @@ -470,6 +477,7 @@ final ObjectMapper mapper = ObjectMapperFactory.create(Map.class, outputStr Java Beansクラスにバインドする場合とMapクラスにバインドする場合で2種類の指定方法がある。 Java Beansクラスにバインドする場合 + フォーマットごとにJavaBeansクラスを定義して、それらのJava Beansクラスをプロパティとして持つ MultiLayout の継承クラスを作成することで、 複数フォーマットの固定長ファイルに対応できる。 @@ -477,6 +485,7 @@ MultiLayout の継承クラスを作成することで、 以下にフォーマット指定の実装例を示す。 ポイント + * フォーマットごとにJava Beansクラスを定義する。 * 上記のフォーマットを定義したJava Beansクラスをプロパティとして持つ、 MultiLayout の継承クラスを定義する。 @@ -572,13 +581,16 @@ try (ObjectMapper mapper = ObjectMapperFactory.create(Person.class, outp mapper.write(person); } ``` + Mapクラスにバインドする場合 + [固定長ファイルをMapクラスにバインドする場合のフォーマット指定方法](../../component/libraries/libraries-data-bind.md#data-bind-fixed-length-format-map) と同様の手順でフォーマットを指定できる。 以下にフォーマット指定の実装例を示す。 ポイント + * `multiLayout` メソッドを呼び出し、マルチレイアウト用のDataBindConfigを生成する。 * `recordIdentifier` メソッドには、対象のデータがどのフォーマットに紐づくかを識別する RecordIdentifier の実装クラスを指定する。 @@ -652,6 +664,7 @@ Java Beansクラスにバインドできるファイル形式を追加するに 以下にコンポーネント設定ファイルへの設定例を示す。 ポイント + * コンポーネント名は、 **objectMapperFactory** とすること。 ```xml @@ -673,6 +686,7 @@ Java Beansクラスにバインドできるファイル形式を追加するに | クォートモード | NORMAL | NORMAL | NORMAL | NORMAL | クォートモード + クォートモードとは、CSVファイルへの書き込み時にどのフィールドをフィールド囲み文字で囲むかを示すモードである。 クォートモードは以下のモードから選択できる。 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-data-format.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-data-format.md index c3c12cff0..d1c87606d 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-data-format.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-data-format.md @@ -60,6 +60,7 @@ > 例えば、下のケースで問題がある。 > XMLとJSONで必須項目にnullを指定した場合: + > * > XML:値を空文字として出力 > * > JSON:必須の例外を送出 > * > 出力対象のデータによってはJSONの仕様を満たせない場合がある。 @@ -73,6 +74,7 @@ > なお、 [メッセージング編](../../processing-pattern/db-messaging/db-messaging-messaging.md#messaging) は、内部で本機能を使用しているため、代替機能を使用できない。 > 本機能の代替機能 + > [データバインド](../../component/libraries/libraries-data-bind.md#data-bind) を使用すること。 > [データバインド](../../component/libraries/libraries-data-bind.md#data-bind) を使用すること。 @@ -165,6 +167,7 @@ data_format/format_definition 以下に実装例を示す。 ポイント + * ファイルに書き込むデータは Map として準備する。 * Map のキー値は、 [入出力データのフォーマットを定義する](../../component/libraries/libraries-data-format.md#data-format-format-definition-file) で定義したフィールド名を設定する。(大文字、小文字は区別しない) * FileRecordWriterHolder の open メソッドを呼び出して、ファイルリソースを書き込み可能状態にする。 @@ -225,6 +228,7 @@ FileRecordWriterHolder.write(user, "user.csv"); 以下に実装例を示す。 ポイント + * DataRecordResponse 生成時に、 フォーマット定義ファイルが格納された論理パス名と、フォーマット定義ファイル名を指定する。 * DataRecordResponse#write を使って、 @@ -272,11 +276,13 @@ public HttpResponse download(HttpRequest request, ExecutionContext context) { * [アップロードヘルパーを使った読み込み](../../component/libraries/libraries-data-format.md#data-format-upload-helper) 汎用データフォーマット(本機能)のみを使ったアップロードファイルの読み込み + 後述のアップロードヘルパーを使わずに本機能のAPIを使用したアップロードファイルのロード処理について解説する。 以下に実装例を示す。 ポイント + * HttpRequest#getPart を呼び出してアップロードされたファイルを取得する。 * HttpRequest#getPart の引数には、パラメータ名を指定する。 * FilePathSetting からフォーマット定義ファイルの File オブジェクトを取得する。 @@ -322,6 +328,7 @@ public HttpResponse upload(HttpRequest req, ExecutionContext ctx) { ``` アップロードヘルパーを使用したアップロードファイルの読み込み + アップロードヘルパー( UploadHelper )を使用すると、 ファイルの読み込み、バリデーション、データベースへの保存を簡易的に実行出来る。 @@ -334,6 +341,7 @@ public HttpResponse upload(HttpRequest req, ExecutionContext ctx) { 以下にシングルレイアウトのアップロードファイルに対して、入力チェックを行いデータベースに登録する例を示す。 ポイント + * HttpRequest#getPart を呼び出してアップロードされたファイルを取得する。 * HttpRequest#getPart の引数には、パラメータ名を指定する。 * 取得したアップロードファイルを元に UploadHelper を生成する。 @@ -373,6 +381,7 @@ JSONやXMLのような階層構造のデータを読み込んだ場合、Mapの 以下に例を示す。 フォーマット定義ファイル + JSONの場合には、 file-type を `JSON` に読み替えること。 階層構造を表すフォーマット定義ファイルの定義方法は、 階層構造の定義 を参照。 @@ -392,10 +401,13 @@ text-encoding: "UTF-8" > **Important:** > 親要素が任意であり、親要素が存在する場合のみ子要素を必須、といった設定には対応していない。 > そのため、階層構造のデータをフォーマット定義ファイルに定義する際は、全て任意項目として定義することを推奨する。 + Mapの構造 + 上記フォーマット定義ファイルを使って、XML及びJSONにデータを出力するMapの構造は以下のようになる。 ポイント + * 階層構造の場合、「親要素名 + "." + 子要素名」形式でMapに値を設定する。 * 階層構造が深い場合は、更に `.` で要素名が連結される。 * 最上位の要素名は、キーに含める必要はない @@ -414,10 +426,13 @@ data.put("user[1].name", "なまえ2"); data.put("user[1].address", "住所2"); data.put("user[1].age", 31); ``` + XMLおよびJSONの構造 + 上記フォーマット定義ファイルに対応したXML及びJSONの構造は以下のとおり。 XML + ```xml @@ -433,7 +448,9 @@ XML ``` + JSON + ```json { "user": [ @@ -496,11 +513,14 @@ JSON 以下に例を示す。 ポイント + * 名前空間は、名前空間を使用する要素に「"?@xmlns:" + 名前空間」として定義する。 タイプは、 `X` とし、フィールドコンバータ部にURIを指定する。 * 名前空間は、「名前空間 + ":" + 要素名」形式で表す。 * 入出力対象データのMapのキー値は、「名前空間+要素名(先頭大文字)」となる。 + フォーマット定義ファイル + ```bash file-type: "XML" text-encoding: "UTF-8" @@ -510,7 +530,9 @@ text-encoding: "UTF-8" 1 ?@xmlns:testns X "http://testns.hoge.jp/apply" 2 testns:key1 X ``` + XMLデータ + 上記フォーマット定義ファイルに対応したXMLは以下のとおり。 ```xml @@ -519,7 +541,9 @@ XMLデータ value1 ``` + Mapデータ + 入出力対象のMapの構造は以下のとおり。 ```java @@ -535,9 +559,12 @@ XMLで属性を持つ要素にコンテンツを定義したい場合は、 設定例を以下に示す。 ポイント + * コンテンツを表すフィールド名には `body` を指定する。 コンテンツを表すフィールド名をデフォルトから変更したい場合は、 [XMLで属性を持つ要素のコンテンツ名を変更する](../../component/libraries/libraries-data-format.md#data-format-xml-content-name-change) を参照。 + フォーマット定義ファイル + ```bash file-type: "XML" text-encoding: "UTF-8" @@ -549,7 +576,9 @@ text-encoding: "UTF-8" 1 @attr X 2 body X ``` + XMLデータ + 上記フォーマット定義ファイルに対応したXMLは以下のとおり。 ```xml @@ -558,7 +587,9 @@ XMLデータ value2 ``` + Mapデータ + 入出力対象のMapの構造は以下のとおり。 ```java @@ -574,6 +605,7 @@ data.put("child.body", "value2"); 以下に使用方法を示す。 置き換えルールを定義したプロパティを作成する + propertiesファイルには、「置き換え前の文字=置き換え後の文字」形式で、置き換えルールを定義する。 置き換え前、置き換え後の文字に定義できる値は、ともに1文字のみである。 @@ -589,8 +621,11 @@ propertiesファイルには、「置き換え前の文字=置き換え後の文 > **Tip:** > 接続先ごとに置き換えルールを定義する場合には、複数のpropertiesファイルを作成する。 + 置き換えルールの設定をコンポーネント設定ファイルに追加する + ポイント + * CharacterReplacementManager をコンポーネント名 `characterReplacementManager` で設定する。 * configList プロパティにリスト形式で CharacterReplacementConfig を設定する。 * 複数のpropertiesファイルを定義する場合は、 typeName プロパティに異なる名前を設定する。 @@ -616,7 +651,9 @@ propertiesファイルには、「置き換え前の文字=置き換え後の文 ``` + 初期化コンポーネントの設定 + 上記で設定した CharacterReplacementManager を初期化対象のリストに設定する。 ```xml @@ -631,7 +668,9 @@ propertiesファイルには、「置き換え前の文字=置き換え後の文 ``` + フォーマット定義ファイルにどの置き換えルールを使用するかを定義する + 入出力時に文字の置き換えを行う場合は、 replacement を使用する。 replacement の引数には、上記で設定した置き換えルールの typeName を設定する。 @@ -668,12 +707,15 @@ replacement の引数には、上記で設定した置き換えルールの type 詳細な手順は以下のとおり。 フィールドタイプに対応したデータタイプ実装の追加 + DataType を実装したクラスを作成する。 > **Tip:** > 標準のフィールドタイプ実装は、 nablarch.core.dataformat.convertor.datatype パッケージ配下に配置されている。 > 実装を追加する際には、これらのクラスを参考にすると良い。 + フォーマットに応じたファクトリの継承クラスの作成 + 追加したフィールドタイプを有効にするためには、 フォーマットに応じたファクトリの継承クラスを作成する。 @@ -699,7 +741,9 @@ public class CustomFixedLengthConvertorFactory extends FixedLengthConvertorFacto } } ``` + フォーマットに応じた設定クラスのプロパティに設定 + フォーマットに応じた設定クラスのプロパティに、先ほど作成したファクトリクラスを設定する。 以下にフォーマット毎の設定クラスとプロパティを示す。 @@ -743,6 +787,7 @@ Fixed(固定長)の場合の設定例を以下に示す。 コンポーネント設定ファイルの設定例を以下に示す。 ポイント + * XmlDataParser のコンポーネント名は `XmlDataParser` とすること * XmlDataBuilder のコンポーネント名は `XmlDataBuilder` とすること diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-database.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-database.md index d77c7edc1..f1e83472c 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-database.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-database.md @@ -147,13 +147,17 @@ Beanオブジェクトの状態を元に、実行するSQL文を動的に組み [データベースへの接続法を追加する](../../component/libraries/libraries-database.md#database-add-connection-factory) を参照し、データベースに接続する実装を追加すること。 接続設定例 + javax.sql.DataSource からデータベース接続の生成 + ```xml ``` + アプリケーションサーバのデータソースからデータベース接続の生成 + ```xml @@ -183,6 +187,7 @@ BasicDbConnectionFactoryForJndi への > 新しいバージョンの新機能を使いたい場合には、 [ダイアレクトを追加する](../../component/libraries/libraries-database.md#database-add-dialect) を参照し新しいダイアレクトを作成すること。 コンポーネント設定例 + この例では、 javax.sql.DataSource からデータベース接続を取得するコンポーネントへの設定例となる。 BasicDbConnectionFactoryForJndi の場合も以下の例と同じように dialect プロパティにダイアレクトを設定すれば良い。 @@ -249,6 +254,7 @@ where ``` SQLファイルからSQLをロードするための設定 + SQLファイルからSQLをロードするために必要な設定内容を説明する。 SQLをロードするためには、以下の例のように BasicStatementFactory#sqlLoader @@ -264,6 +270,7 @@ sql で定義したデータベース接続を取得するコンポーネントに設定する必要がある。 設定例 + ```xml @@ -286,6 +293,7 @@ SQLIDと実際に実行されるSQLとのマッピングルールは以下のと * SQLIDの `#` 以降がSQLファイル内のSQLIDとなる。 実装例 + この例では、 SQLIDに、 `jp.co.tis.sample.action.SampleAction#findUser` と指定しているため、 SQLファイルはクラスパス配下の `jp.co.tis.sample.action.SampleAction.sql` となる。 SQLファイル内のSQLIDは、 `findUser` となる。 @@ -345,6 +353,7 @@ String result = statement.getString(1); このような用途向けに本機能では、検索結果の範囲を指定できる機能を提供している。 実装例 + データベース接続( connection )からステートメントを生成する際に、検索対象の範囲を指定する。 この例では、以下の値を指定しているので、11件目から最大10件のレコードが取得される。 @@ -381,6 +390,7 @@ Beanオブジェクトを入力としてSQLを実行する場合は、SQLのIN 以下に実装例を示す。 SQL例 + INパラメータには名前付きパラメータを使用する。 ```sql @@ -393,7 +403,9 @@ insert into user :userName ) ``` + 実装例 + Beanオブジェクトに必要な値を設定し、Beanオブジェクトを入力としてSQLを実行する機能を呼び出す。 * AppDbConnection や ParameterizedSqlPStatement の使用方法は、Javadocを参照。 @@ -462,6 +474,7 @@ int result = statement.executeUpdateByObject(entity); 以下に使用例を示す。 コンポーネント設定ファイル + この機能を使用するには、コンポーネント設定ファイルに値を自動設定するクラスを設定する。 以下の例のように、 BasicStatementFactory#updatePreHookObjectHandlerList に対して、 @@ -482,7 +495,9 @@ AutoPropertyHandler 実装クラスをlistで設定する。 ``` + Beanオブジェクト(Entity) + 自動で値を設定したいプロパティにアノテーションを設定する。 なお、標準で提供されるアノテーションは nablarch.core.db.statement.autoproperty パッケージ配下に配置されている。 @@ -504,7 +519,9 @@ public class UserEntity { // アクセスメソッドなどは省略 } ``` + SQL + SQLは、 [Beanオブジェクトを入力としてSQLを実行する](../../component/libraries/libraries-database.md#database-input-bean) と同じように作成する。 ```sql @@ -518,7 +535,9 @@ insert into user ( :updatedAt ) ``` + 実装例 + 基本的には、 [Beanオブジェクトを入力としてSQLを実行する](../../component/libraries/libraries-database.md#database-input-bean) と同じように実装する。 値が自動設定される項目については、ロジックでBeanに対して値を設定する必要が無い。 なお、値を明示的に設定したとしても、SQL実行直前に値の自動設定機能により上書きされる。 @@ -546,14 +565,19 @@ int result = statement.executeUpdateByObject(entity); like検索は、 [Beanオブジェクトを入力としてSQLを実行する](../../component/libraries/libraries-database.md#database-input-bean) を使用し、SQLにはlike検索用の条件を以下のルールで記述する。 前方一致の場合 + 名前付きパラメータの末尾に `%` を記述する。 例: `name like :userName%` + 後方一致の場合 + 名前付きパラメータの先頭に `%` を記述する。 例: `name like :%userName` + 途中一致の場合 + 名前付きパラメータの前後に `%` を記述する。 例: `name like :%userName%` @@ -563,6 +587,7 @@ like検索時のエスケープ文字及びエスケープ対象文字の定義 以下に実装例を示す。 SQL + 上記のルールに従いSQLを定義する。 ```sql @@ -570,7 +595,9 @@ select * from user where name like :userName% ``` + 実装例 + [Beanオブジェクトを入力としてSQLを実行する](../../component/libraries/libraries-database.md#database-input-bean) と同じようにSQLを実行するだけで、like条件用に値の書き換えやエスケープ処理が行われる。 この例の場合、実際の条件は `name like 'な%' escape '\'` となる。 @@ -606,6 +633,7 @@ int result = statement.retrieve(bean); `%` 、 `_` コンポーネント設定例 + この例ではエスケープ文字に `\` を設定し、エスケープ文字には `%` 、 `%` 、 `_` 、 `_` の4文字を設定している。 ここで定義した BasicStatementFactory コンポーネントは、 [データベースに対する接続設定](../../component/libraries/libraries-database.md#database-connect) @@ -626,6 +654,7 @@ int result = statement.retrieve(bean); 可変条件を持つSQLの実行は、 [Beanオブジェクトを入力としてSQLを実行する](../../component/libraries/libraries-database.md#database-input-bean) を使用し、以下の記法を用いて条件を記述する。 可変条件の記述ルール + 可変条件は、 `$if(プロパティ名) {SQL文の条件}` で記述する。 `$if` の後のプロパティ名に対応したBeanオブジェクトの値により、その条件が除外される。 除外される条件は以下のとおり。 @@ -646,6 +675,7 @@ int result = statement.retrieve(bean); 以下に例を示す。 SQL + このSQLの場合、 `user_name` と `user_kbn` の条件が可変となる。 ```none @@ -660,7 +690,9 @@ where and $if (userKbn) {user_kbn in ('1', '2')} and birthday = :birthday ``` + 実装例 + userName プロパティのみに値が設定されているので、 可変条件で定義されている `user_kbn` は実行時の条件から除外される。 @@ -687,6 +719,7 @@ SqlResultSet result = statement.retrieve(entity); in句の条件数が可変となるSQLの実行は、 [Beanオブジェクトを入力としてSQLを実行する](../../component/libraries/libraries-database.md#database-input-bean) を使用し、以下の記法を用いて条件を記述する。 in句の記述ルール + 条件の名前付きパラメータの末尾に `[]` を付加する。 また名前付きパラメータに対応するBeanオブジェクトのプロパティの型は、 配列か java.util.Collection (サブタイプ含む) [1] とする必要がある。 @@ -701,6 +734,7 @@ in句の記述ルール 以下に例を示す。 SQL + このSQLでは、 `user_kbn` のin条件が動的に構築される。 なお、 `$if` と併用しているため、 userKbn プロパティがnullやサイズが0の場合には条件から除外される。 @@ -714,7 +748,9 @@ from where $if (userKbn) {user_kbn in (:userKbn[])} ``` + 実行例 + この例では、 userKbn プロパティに2つの要素が設定されているので、 実行されるSQLの条件は `userKbn in (?, ?)` となる。 @@ -750,6 +786,7 @@ in句に条件を設定できないため注意すること。 order byのソート項目が可変となるSQLの実行は、 [Beanオブジェクトを入力としてSQLを実行する](../../component/libraries/libraries-database.md#database-input-bean) を使用し、以下の記法を用いて条件を記述する。 order by句の記述ルール + ソート項目を可変にする場合は、order by句の代わりに `$sort` を使用し、以下のように記述する。 ```text @@ -772,6 +809,7 @@ $sort(プロパティ名) {(ケース1)(ケース2)・・・(ケースn)} 以下に使用例を示す。 SQL + ```none select user_id, @@ -788,7 +826,9 @@ $sort(sortId) { (default user_id) } ``` + 実装例 + この例では、ソートIDに `name_asc` を設定しているので、 order by句は `order by user_name asc` となる。 @@ -816,6 +856,7 @@ SqlResultSet result = statement.retrieve(condition); blob(データベース製品によりバイナリ型の型は異なる)などのバイナリ型のカラムへのアクセス方法について説明する。 バイナリ型の値を取得する + バイナリ型の値を取得する場合には、検索結果オブジェクトの SqlRow から byte[] として値を取得する。 以下に例を示す。 @@ -846,7 +887,9 @@ byte[] encryptedPassword = row.getBytes("password"); > // 一括で読み込んだ場合、全てヒープに展開されるので注意すること > } > ``` + バイナリ型の値を登録・更新する + サイズの小さいバイナリ値を登録・更新する場合は、 SqlPStatement#setByte を使用する。 ```java @@ -871,6 +914,7 @@ try (InputStream input = Files.newInputStream(pdf)) { CLOBのような大きいサイズの文字列型カラムへのアクセス方法について解説する。 CLOB型の値を取得する + CLOB型の値を取得する場合は、 検索結果オブジェクト から文字列型として値を取得する。 以下に例を示す。 @@ -901,7 +945,9 @@ String mailBody = row.getString("mailBody"); > // 読み込んだデータをヒープ上に全て保持した場合は、ヒープを圧迫するので注意すること。 > } > ``` + CLOB型に値を登録(更新)する + サイズが小さい値を登録更新する場合は、String型の値を SqlPStatement#setString を使用して設定する。 以下に例を示す。 @@ -931,15 +977,22 @@ try (Reader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) { これらの例外は全て非チェック例外のため、 SQLException のように `try-catch` で補足する必要はない。 データベースアクセスエラー時の例外 + データベースアクセス時に発生する例外で、 DbAccessException が送出される。 + データベース接続エラー時の例外 + データベースアクセスエラー時の例外がデータベース接続エラーを示す場合には、 DbConnectionException が送出される。 この例外は、 [リトライハンドラ](../../component/handlers/handlers-retry-handler.md#retry-handler) により処理される。([リトライハンドラ](../../component/handlers/handlers-retry-handler.md#retry-handler) 未適用の場合には、実行時例外として扱われる。) なお、データベース接続エラーの判定には、 [ダイアレクト](../../component/libraries/libraries-database.md#database-dialect) が使用される。 + SQL実行時の例外 + SQLの実行に失敗した時に発生する例外で、 SqlStatementException が送出される。 + SQL実行時の例外が一意制約違反の場合の例外 + SQL実行時の例外が一意制約違反を示す例外の場合は、 DuplicateStatementException が送出される。 一意制約違反をハンドリングしたい場合には、 [一意制約違反をハンドリングして処理を行う](../../component/libraries/libraries-database.md#database-duplicated-error) を参照。 @@ -985,11 +1038,13 @@ SQL実行時の例外が一意制約違反を示す例外の場合は、 Duplica 以下に使用例を示す。 コンポーネント設定ファイル + コンポーネント設定ファイルに SimpleDbTransactionManager を定義する。 * connectionFactory プロパティに ConnectionFactory 実装クラスを設定する。 ConnectionFactory 実装クラスの詳細は、 [データベースに対する接続設定](../../component/libraries/libraries-database.md#database-connect) を参照。 * transactionFactory プロパティに TransactionFactory 実装クラスを設定する。 + TransactionFactory 実装クラスの詳細は、 [データベースに対するトランザクション制御](../../component/libraries/libraries-transaction.md#transaction-database) を参照。 ```xml @@ -1005,7 +1060,9 @@ SQL実行時の例外が一意制約違反を示す例外の場合は、 Duplica ``` + 実装例 + コンポーネント設定ファイルに設定した SimpleDbTransactionManager を使って、SQLを実行する。 なお、 SimpleDbTransactionManager を直接使うのではなくトランザクションを制御する、 SimpleDbTransactionExecutor を使用すること。 @@ -1038,14 +1095,18 @@ SqlResultSet resultSet = new SimpleDbTransactionExecutor(dbTransac * データ更新タイミングが夜間のみで日中は更新されないデータ 制約 + LOB型について + LOB(BLOB型やCLOB型)のカラムを取得した場合、実際にDBに格納されたデータが取得されるのではなく、LOBロケータが取得される。 実際の値を取得する場合は、このLOBロケータ経由で値を取得する。 このLOBロケータの有効期間は、RDBMS毎の実装に依存している。 通常、 java.sql.ResultSet や java.sql.Connection がクローズされた時点でアクセスできなくなる。 このため、 ResultSet や Connection よりも生存期間が長いキャッシュにはBLOB、CLOB型を含めることができない。 + アプリケーションの冗長化について + デフォルトで提供するキャッシュを保持するコンポーネントはJVMのヒープ上にキャッシュを保持する。 このため、アプリケーションを冗長化構成とした場合、アプリケーションごとに検索結果がキャッシュされることになる。 @@ -1067,6 +1128,7 @@ LOB(BLOB型やCLOB型)のカラムを取得した場合、実際にDBに格納 以下に使用例を示す。 コンポーネント設定ファイル + 以下の手順に従い、検索結果のキャッシュを有効化する。 1. クエリ結果をキャッシュするコンポーネントの定義 @@ -1074,6 +1136,7 @@ LOB(BLOB型やCLOB型)のカラムを取得した場合、実際にDBに格納 3. 検索結果をキャッシュするSQL実行コンポーネントの定義 クエリ結果のキャッシュクラスのコンポーネントの定義 + デフォルトで提供されるクエリ結果をキャッシュするクラスの InMemoryResultSetCache を設定する。 ```xml @@ -1082,7 +1145,9 @@ LOB(BLOB型やCLOB型)のカラムを取得した場合、実際にDBに格納 ``` + SQLID毎のキャッシュ設定 + SQLID毎のキャッシュを設定する。 デフォルトで提供される BasicExpirationSetting では、SQLID毎にキャッシュの有効期限が設定できる。 @@ -1111,7 +1176,9 @@ SQLID毎のキャッシュを設定する。 ``` + 検索結果をキャッシュするSQL実行コンポーネントの定義 + 検索結果をキャッシュさせるためには、SQL実行コンポーネントの生成クラスに CacheableStatementFactory を設定する。 CacheableStatementFactory は、 デフォルトで提供される BasicStatementFactory を継承しているため、 @@ -1136,7 +1203,9 @@ SQLID毎のキャッシュ設定のコンポーネントを設定すること。 ``` + 実装例 + SQLを使ったデータベースアクセスは、キャッシュ有無によって変わることはない。 以下と同じように実装すれば良い。 @@ -1259,11 +1328,16 @@ SQL文中のスキーマをその環境に応じたものに置き換えるこ 以下に詳細な手順を示す。 DbAccessExceptionFactory の実装クラスを作成する + データベース接続取得時及びトランザクション制御時(commitやrollback)に発生させる DbAccessException を変更したい場合は、 このインタフェースの実装クラスを作成する。 + SqlStatementExceptionFactory の実装クラスを作成する + SQL実行時に発生させる SqlStatementException を変更したい場合は、 このインタフェースの実装クラスを作成する。 + コンポーネント設定ファイルに定義する + DbAccessExceptionFactory の実装クラスは、 [データベースに対する接続設定](../../component/libraries/libraries-database.md#database-connect) で定義したデータベース接続を取得するコンポーネントに設定する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-date.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-date.md index ea2d30fba..9ea42798e 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-date.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-date.md @@ -109,10 +109,13 @@ BasicBusinessDateProvider の設定をコンポーネント定義に追加する システムプロパティとして、以下の形式で指定する。 システムプロパティの形式 + BasicBusinessDateProvider.<区分>=日付 ※日付はyyyyMMdd形式 + システムプロパティの例 + 区分が"batch"の日付を"2016/03/17"に上書きしたい場合 -DBasicBusinessDateProvider.batch=20160317 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-db-double-submit.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-db-double-submit.md index 34cca260a..31ab38e45 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-db-double-submit.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-db-double-submit.md @@ -42,6 +42,7 @@ 作成するテーブルの定義を以下に示す。 DOUBLE_SUBMISSION テーブル + | カラム名 | データ型 | |---|---| | TOKEN(PK) | java.lang.String | diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-exclusive-control.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-exclusive-control.md index 44cc901fa..19346ed29 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-exclusive-control.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-exclusive-control.md @@ -24,8 +24,10 @@ > 排他制御には、 [ユニバーサルDAO](../../component/libraries/libraries-universal-dao.md#universal-dao) を使用すること。 > * > [ユニバーサルDAO](../../component/libraries/libraries-universal-dao.md#universal-dao) の排他制御は、本機能より簡単に使用できる。 + > [楽観的ロックを行う](../../component/libraries/libraries-universal-dao.md#universal-dao-jpa-optimistic-lock) 、 [悲観的ロックを行う](../../component/libraries/libraries-universal-dao.md#universal-dao-jpa-pessimistic-lock) を参照。 > * > 主キーを非文字列型で定義した場合、データベースによってはこの機能を使用することができない。 + > この機能は、主キーの値を全て文字列型( java.lang.String )で保持している。 > 主キーのカラム定義が非文字列型(charやvarchar以外)の場合に、 > データベースによっては型の不一致でSQL文の実行時例外が発生する。 @@ -97,6 +99,7 @@ 排他制御を使うためには、 **設定** と **排他制御に必要な情報を保持するクラスの作成** を行う。 設定 + BasicExclusiveControlManager の設定をコンポーネント定義に追加する。 ```xml @@ -107,7 +110,9 @@ BasicExclusiveControlManager の設定をコンポーネント定義に追加す ``` + 排他制御に必要な情報を保持するクラスの作成 + ExclusiveControlContext を継承して作成する。 このクラスは、排他制御用テーブルごとに作成し、排他制御を行うAPI呼び出しで使用する。 @@ -158,6 +163,7 @@ public class UsersExclusiveControl extends ExclusiveControlContext { 入力→確認→完了がある更新機能を例に、楽観的ロックの実装例を示す。 入力画面の初期表示 + ```java public HttpResponse index(HttpRequest request, ExecutionContext context) { @@ -177,7 +183,9 @@ public HttpResponse index(HttpRequest request, ExecutionContext context) { return new HttpResponse("/input.jsp"); } ``` + 入力画面の確認ボタン(入力→確認) + ```java @OnErrors({ @OnError(type = ApplicationException.class, path = "/input.jsp"), @@ -203,7 +211,9 @@ public HttpResponse confirm(HttpRequest request, ExecutionContext context) { > **Important:** > バージョン番号のチェック( HttpExclusiveControlUtil.checkVersions )を行わなければ、 > 画面間でバージョン番号が引き継がれない。 + 確認画面の更新ボタン(確認→完了) + ```java @OnErrors({ @OnError(type = ApplicationException.class, path = "/input.jsp"), @@ -238,6 +248,7 @@ public HttpResponse update(HttpRequest request, ExecutionContext context) { 二通りの実装方法がある。 複合主キーでない場合 + ユーザの一括削除を行う画面を例に、複合主キーでない場合の実装例を示す。 バージョン番号の取得部分は、 HttpExclusiveControlUtil#prepareVersions を呼び出すだけなので、 実装例を省略する。 @@ -272,7 +283,9 @@ HttpExclusiveControlUtil.checkVersions(request, context, "user.deactivate"); // チェックと更新の対象とする。 HttpExclusiveControlUtil.updateVersionsWithCheck(request, "user.deactivate"); ``` + 複合主キーの場合 + ユーザの一括削除を行う画面を例に、複合主キーの場合の実装例を示す。 バージョン番号の取得部分は、 HttpExclusiveControlUtil#prepareVersions を呼び出すだけなので、 実装例を省略する。 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-failure-log.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-failure-log.md index 779316471..3e86f346a 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-failure-log.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-failure-log.md @@ -32,6 +32,7 @@ 上記出力方針に対するログ出力の設定例を下記に示す。 log.propertiesの設定例 + ```properties writerNames=monitorLog,appLog @@ -60,7 +61,9 @@ loggers.MON.nameRegex=MONITOR loggers.MON.level=ERROR loggers.MON.writerNames=monitorLog ``` + app-log.propertiesの設定例 + ```properties # FailureLogFormatter #failureLogFormatter.className= @@ -120,6 +123,7 @@ try { > 障害コードのコード体系は、プロジェクト毎に規定すること。 障害ログに出力されるメッセージ + 障害ログに出力されるメッセージは、 [メッセージ管理](../../component/libraries/libraries-message.md#message) を使用して障害コードに対応するメッセージを取得する。 [メッセージ管理](../../component/libraries/libraries-message.md#message) では、メッセージが見つからない場合に例外が発生する。 メッセージ取得処理で例外が発生した場合は、障害ログとは別に、 @@ -138,44 +142,60 @@ failed to get the message to output the failure log. failureCode = [<障害コ 障害ログの設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + failureLogFormatter.className + FailureLogFormatter を実装したクラス。 差し替える場合に指定する。 failureLogFormatter.defaultFailureCode `必須` + デフォルトの障害コード。 例外ハンドラで例外がエラーを捕捉した場合など、障害コードの指定がない場合に使用する。 failureLogFormatter.defaultMessage `必須` + デフォルトのメッセージ。 デフォルトの障害コードを使用する場合に出力するメッセージとなる。 + failureLogFormatter.language + 障害コードからメッセージを取得する際に使用する言語。 指定がない場合は ThreadContext に設定されている言語を使用する。 failureLogFormatter.notificationFormat + 障害通知ログのフォーマット。 フォーマットに指定可能なプレースホルダ + | 項目名 | プレースホルダ | 説明 | |---|---|---| | 障害コード | $failureCode$ | 障害を一意に識別するコード。障害内容の特定に使用する。 | | メッセージ | $message$ | 障害コードに対応するメッセージ。障害内容の特定に使用する。 | | 処理対象データ | $data$ | 障害が発生した処理が対象としていたデータを特定するために使用する。 データリーダを使用して読み込まれたデータオブジェクトのtoStringメソッドを呼び出し出力される。 | | 連絡先 | $contact$ | 連絡先を特定するために使用する。 | + デフォルトのフォーマット + ```java fail_code = [$failureCode$] $message$ ``` + failureLogFormatter.analysisFormat + 障害解析ログのフォーマット。 フォーマットに指定可能なプレースホルダとデフォルトのフォーマットは、 [障害通知ログのフォーマット](../../component/libraries/libraries-failure-log.md#failure-log-prop-notification-format) と同じ。 + failureLogFormatter.contactFilePath + 障害の連絡先情報を指定したプロパティファイルのパス。 障害の連絡先情報を出力する場合に指定する。 詳細は [障害ログに連絡先情報を追加する](../../component/libraries/libraries-failure-log.md#failure-log-add-contact) を参照。 + failureLogFormatter.fwFailureCodeFilePath + フレームワークの障害コードの変更情報を指定したプロパティファイルのパス。 障害ログ出力時にフレームワークの障害コードを変更する場合に指定する。 詳細は [フレームワークの障害コードを変更する](../../component/libraries/libraries-failure-log.md#failure-log-change-fw-failure-code) を参照。 @@ -189,7 +209,9 @@ failureLogFormatter.fwFailureCodeFilePath > 派生元実行時情報とは、例えば、ウェブからバッチ処理にデータ連携する場合であれば、 > 画面処理を実行した時点の実行時情報(リクエストIDや実行時IDなど)がバッチ処理での派生元実行時情報となる。 > 派生元実行時情報の出力方法は、 [派生元実行時情報を出力する](../../component/libraries/libraries-failure-log.md#failure-log-output-src-exe-info) を参照。 + 記述例 + ```properties failureLogFormatter.className=nablarch.core.log.app.FailureLogFormatter failureLogFormatter.defaultFailureCode=UNEXPECTED_ERROR @@ -217,6 +239,7 @@ failureLogFormatter.fwFailureCodeFilePath=classpath:failure-log-fw-codes.propert まず、プロパティファイルを準備する。 `failure-log-contact.properties` というファイル名でクラスパス直下に配置しているものとする。 failure-log-contact.propertiesの設定例 + ```properties # リクエストID=連絡先情報 /users/=USRMGR999 @@ -241,6 +264,7 @@ failure-log-contact.propertiesの設定例 さらに、プロパティファイルのパスを指定する。 app-log.propertiesの設定例 + ```properties # FailureLogFormatterの設定 failureLogFormatter.defaultFailureCode=UNEXPECTED_ERROR @@ -304,6 +328,7 @@ Caused by: nablarch.core.message.MessageNotFoundException: message was not found nablarchというパッケージ名を指定することで、個別に指定していない全てのパッケージに対して障害コードを指定できる。 failure-log-fw-codes.propertiesの設定例 + ```properties # フレームワークのパッケージ名=障害コード nablarch=FW_ERROR @@ -330,6 +355,7 @@ nablarch=FW_ERROR 次に、FailureLogFormatterの設定でプロパティファイルのパスを指定する。 app-log.propertiesの設定例 + ```properties failureLogFormatter.defaultFailureCode=UNEXPECTED_ERROR failureLogFormatter.defaultMessage=an unexpected exception occurred. @@ -342,6 +368,7 @@ failureLogFormatter.fwFailureCodeFilePath=classpath:failure-log-fw-codes.propert 上記の設定により、フレームワークの障害コードが変更される。障害通知ログでいくつか出力例を下記に示す。 nablarch.core.date.BasicBusinessDateProviderクラスで例外を送出した場合 + ```bash # プロパティファイルのnablarch.core.date=FW_DATE_ERRORが該当する。 2011-02-15 16:48:54.993 -FATAL- [APUSRMGR0001201102151648315060002] R[/login] U[9999999999] fail_code = [FW_DATE_ERROR] segment was not found. segment:00. @@ -350,7 +377,9 @@ java.lang.IllegalStateException: segment was not found. segment:00. at nablarch.core.date.BasicBusinessDateProvider.getDate(BasicBusinessDateProvider.java:103) # 以降のスタックトレースは省略。 ``` + nablarch.core.message.StringResourceHolderクラスで例外を送出した場合 + ```bash # プロパティファイルのnablarch.core.message=FW_MESSAGE_ERRORが該当する。 2011-02-15 16:54:06.413 -FATAL- [APUSRMGR0001201102151653476260011] R[/users/edit] U[0000000001] fail_code = [FW_MESSAGE_ERROR] ValidateFor method invocation failed. targetClass = java.lang.Class, method = validateForRegisterUser @@ -362,7 +391,9 @@ Caused by: nablarch.core.message.MessageNotFoundException: message was not found at nablarch.core.message.StringResourceHolder.get(StringResourceHolder.java:40) # 以降のスタックトレースは省略。 ``` + nablarch.common.authentication.PasswordAuthenticatorクラスで例外を送出した場合 + ```bash # プロパティファイルのnablarch=FW_ERRORが該当する。 2011-02-15 16:59:03.076 -FATAL- [APUSRMGR0001201102151658551890017] R[/login] U[9999999999] fail_code = [FW_ERROR] authentication failed. @@ -394,6 +425,7 @@ nablarch.common.authentication.AuthenticationFailedException | ユーザID | UPDATED_USER_ID | app-log.propertiesの設定例 + ```properties failureLogFormatter.defaultFailureCode=UNEXPECTED_ERROR failureLogFormatter.defaultMessage=an unexpected exception occurred. @@ -401,7 +433,9 @@ failureLogFormatter.notificationFormat=fail_code = [$failureCode$] $message$ # 処理対象データのプレースホルダ「data」を障害解析ログのフォーマットに指定する。 failureLogFormatter.analysisFormat=fail_code = [$failureCode$] $message$\nInput Data :\n$data$ ``` + 障害解析ログの出力例 + ```bash # 障害解析ログ 2011-09-26 21:06:35.745 -FATAL- root [EXECUTION_ID_0000000123456789] boot_proc = [] proc_sys = [] req_id = [RB11AC0160] usr_id = [batchuser1] fail_code = [USER_REGISTER_FAILED] ユーザ情報の登録に失敗しました。 @@ -414,7 +448,9 @@ Stack Trace Information : at nablarch.fw.action.BatchAction.handle(BatchAction.java:1) # 以降のスタックトレースは省略。 ``` + 処理対象データ(出力例の「Input Data :」)に下記の実行時情報が出力される。 + ```properties INSERT_REQUEST_ID=RB11AC0140 INSERT_EXECUTION_ID=EXECUTION_ID_2000000123456789 @@ -434,6 +470,7 @@ UPDATED_USER_ID=batch_user ここでは、処理対象データ($data$)に対する出力処理のカスタマイズ例を示す。 LogItem を実装したクラスを作る + 処理対象データ($data$)に対する出力内容を提供するクラスを作る。 今回はフレームワークが提供する DataItem を継承して作成し、 処理対象データがMap型の場合のみマスク処理を行うように実装している。 @@ -479,7 +516,9 @@ private static final class CustomDataItem extends DataItem { } } ``` + FailureLogFormatter を継承したクラスを作り、プレースホルダを追加する + FailureLogFormatter#getLogItems をオーバライドし、プレースホルダ `$data$` に対して上記のCustomDataItemを設定する。 @@ -502,7 +541,9 @@ public class CustomDataFailureLogFormatter extends FailureLogFormatter { } } ``` + FailureLogFormatter を継承したクラスを使うように設定する + 障害ログのフォーマッタとしてCustomDataFailureLogFormatterを使用するように `app-log.properties` に設定する。 ```properties @@ -524,50 +565,70 @@ FailureJsonLogFormatter を使用する。 設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + FailureJsonLogFormatter を用いる際に 指定するプロパティは以下の通り。 failureLogFormatter.className `必須` + JSON形式でログを出力する場合、 FailureJsonLogFormatter を指定する。 + failureLogFormatter.defaultFailureCode `必須` + デフォルトの障害コード。 例外ハンドラで例外がエラーを捕捉した場合など、障害コードの指定がない場合に使用する。 + failureLogFormatter.defaultMessage `必須` + デフォルトのメッセージ。 デフォルトの障害コードを使用する場合に出力するメッセージとなる。 + failureLogFormatter.language + 障害コードからメッセージを取得する際に使用する言語。 指定がない場合は ThreadContext に設定されている言語を使用する。 failureLogFormatter.notificationTargets + 障害通知ログの出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + | 項目名 | 出力項目 | 説明 | デフォルト出力 | |---|---|---|---| | 障害コード | failureCode | 障害を一意に識別するコード。障害内容の特定に使用する。 | ○ | | メッセージ | message | 障害コードに対応するメッセージ。障害内容の特定に使用する。 | ○ | | 処理対象データ | data | 障害が発生した処理が対象としていたデータを特定するために使用する。 データリーダを使用して読み込まれたデータオブジェクトのtoStringメソッドを呼び出し出力される。 | | | 連絡先 | contact | 連絡先を特定するために使用する。 | | + failureLogFormatter.analysisTargets + 障害解析ログの出力項目。カンマ区切りで指定する。 指定可能な出力項目とデフォルト設定は、 [障害通知ログの出力項目](../../component/libraries/libraries-failure-log.md#failure-log-prop-notification-targets) と同じ。 + failureLogFormatter.contactFilePath + 障害の連絡先情報を指定したプロパティファイルのパス。 障害の連絡先情報を出力する場合に指定する。 詳細は [障害ログに連絡先情報を追加する](../../component/libraries/libraries-failure-log.md#failure-log-add-contact) を参照。 + failureLogFormatter.fwFailureCodeFilePath + フレームワークの障害コードの変更情報を指定したプロパティファイルのパス。 障害ログ出力時にフレームワークの障害コードを変更する場合に指定する。 詳細は [フレームワークの障害コードを変更する](../../component/libraries/libraries-failure-log.md#failure-log-change-fw-failure-code) を参照。 + failureLogFormatter.structuredMessagePrefix + フォーマット後のメッセージ文字列が JSON 形式に整形されていることを識別できるようにするために、メッセージの先頭に付与するマーカー文字列。 メッセージの先頭にあるマーカー文字列が JsonLogFormatter に設定しているマーカー文字列と一致する場合、 JsonLogFormatter はメッセージを JSON データとして処理する。 デフォルトは `"$JSON$"` となる。 変更する場合は、LogWriterの `structuredMessagePrefix` プロパティを使用して JsonLogFormatter にも同じ値を設定すること(LogWriterのプロパティについては [ログ出力の設定](../../component/libraries/libraries-log.md#log-basic-setting) を参照)。 + 記述例 + ```properties failureLogFormatter.className=nablarch.core.log.app.FailureJsonLogFormatter failureLogFormatter.structuredMessagePrefix=$JSON$ diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-file-path-management.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-file-path-management.md index 30b87b58d..28035f65d 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-file-path-management.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-file-path-management.md @@ -42,6 +42,7 @@ FilePathSetting にディレクトリ及び拡張子を設定し、 以下に例を示す。 ポイント + * FilePathSetting のコンポーネント名は `filePathSetting` とすること * basePathSettings にディレクトリを設定する * fileExtensions に拡張子を設定する diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-format-definition.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-format-definition.md index 57253fb8c..281822eb9 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-format-definition.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-format-definition.md @@ -37,8 +37,8 @@ | リテラル型 | 説明 | |---|---| -| 文字列 | Javaの文字リテラルと同じように `"` で値を囲んで記述する。 なお、Unicodeエスケープや8進数エスケープには対応していない。 記述例 "Nablarch" "\\r\\n" | -| 10進整数 | Javaの数値リテラルと同じように記述する。 なお、小数には対応していない。 記述例 123 -123 | +| 文字列 | Javaの文字リテラルと同じように `"` で値を囲んで記述する。 なお、Unicodeエスケープや8進数エスケープには対応していない。 記述例 "Nablarch" "\\r\\n" | +| 10進整数 | Javaの数値リテラルと同じように記述する。 なお、小数には対応していない。 記述例 123 -123 | | 真偽値 | `true` または、 `false` で設定する。(大文字でも可) | ### コメント @@ -94,7 +94,7 @@ Fixed(固定長)形式のデータで使用するディレクティブは以下 | positive-pack-sign-nibble `任意` | 符号付きパック数値の符号ビットに設定する正符号を16進数表記の文字列で指定する。 デフォルトでは、 text-encoding の値に応じて以下の値が使用される。 0x3 0xC | | negative-pack-sign-nibble `任意` | 符号付きパック数値の符号ビットに設定する負符号を16進数表記の文字列で指定する。 デフォルトでは、 text-encoding の値に応じて以下の値が使用される。 0x7 0xD | | required-decimal-point `任意` | 符号無し数値及び符号付き数値の小数点の要否を指定する。 `true` を指定すると書き込むデータに小数点が付与される。 `false` を指定すると、書き込むデータに小数点が付与されない。(固定小数点となる) デフォルト動作は 小数点付与( `true` )となる。 | -| fixed-sign-position `任意` | 符号付き数値の符号位置を固定するかの要否を指定する。 符号位置を固定( `true` )とした場合、符号位置は項目の先頭に固定される。 符号位置を非固定( `false` )とした場合、符号位置はパディング前の数値の先頭に付加される。 デフォルト動作は固定( `true` )となる。 例 -000123456 000-123456 | +| fixed-sign-position `任意` | 符号付き数値の符号位置を固定するかの要否を指定する。 符号位置を固定( `true` )とした場合、符号位置は項目の先頭に固定される。 符号位置を非固定( `false` )とした場合、符号位置はパディング前の数値の先頭に付加される。 デフォルト動作は固定( `true` )となる。 例 -000123456 000-123456 | | required-plus-sign `任意` | 符号付き数値の正の符号の要否を指定する。 `true` を指定した場合、読み込むデータには正の符号( `+` )が必要で、 書き込むデータには正の符号( `+` )が付加される。 デフォルトの動作は付加しない( `false` )となる。 | 以下に例を示す。 @@ -174,6 +174,7 @@ text-encoding: "utf-8" # 文字列型フィールドの文字エンコー レコードフォーマット定義例を以下に示す。 ポイント + * レコードを識別するためのレコードタイプ名を `[` 、 `]` で囲んで定義する。 * レコードタイプ名は、フォーマット定義ファイル内で一意となっていること。 * レコードタイプ名は、任意の値を定義する。 @@ -196,6 +197,7 @@ text-encoding: "utf-8" # 文字列型フィールドの文字エンコー > そのため、データとフォーマットの項目定義が合わず、データが正しく読み書きできない問題が発生する場合がある。 > 不適切な例 + > ```bash > [order] > 1 id N @@ -222,7 +224,7 @@ text-encoding: "utf-8" # 文字列型フィールドの文字エンコー | フィールド開始位置 `必須` | データ形式毎以下のルールに従いフィールド開始位置を定義する。 フィールドの開始バイト数(1起算)を設定する。 フィールドの項目通番を設定する。 フィールドの要素通番 フィールドの要素通番 | |---|---| | フィールド名 `必須` | フィールドを識別するための名前を設定する。 フィールド名は、 本機能の入出力で使用する java.util.Map のキーとなる。 フィールド名の先頭に `?` を付加した場合、その項目は入力時には java.util.Map には読み込まれない。 例えば、ホストでよく扱われる固定長ファイルのfiller項目に使用することで、余計な項目を入力対象除外できる。 > **Important:** > 数字のみのフィールド名は定義できないので注意すること。 XMLデータ形式の場合、フィールド名の先頭に `@` を付加することで、その項目を属性値として扱うことが出来る。 以下に例を示す。 ```bash [tagName] @attr ``` 上記に対応したXMLは、以下のようになる。 ```xml ・・・ ``` | -| 多重度 `任意` | フィールドの定義可能数を指定する。 この値は、JSON及びXMLデータ形式の場合のみ指定できる。 記述ルールは以下のとおり。 * 定義可能数は、 `[` 、 `]` で囲んで記述する。 * 下限と上限がある場合は、下限と上限の間に `..` を記述する。 * 上限がない場合は `*` を記述する。 * 省略した場合は、 `[1]` となる。 以下に指定例を示す。 ```bash address [1..3] # 1から3の定義が可能 address # 省略しているので1つだけ可能 address [0..*] # 条件なし(0から無制限) address [*] # 条件なし(0から無制限) address [1..*] # 1以上 ``` 以下のxmlの場合、 `address` フィールドの定義数は `2` となる。 ```xml
自宅住所
勤務先住所
``` 以下のJSONの場合、 `address` フィールドの要素数は、`3` となる。 ```json { "address" : ["自宅住所", "勤務先住所", "送付先住所"] } ``` | +| 多重度 `任意` | フィールドの定義可能数を指定する。 この値は、JSON及びXMLデータ形式の場合のみ指定できる。 記述ルールは以下のとおり。 * 定義可能数は、 `[` 、 `]` で囲んで記述する。 * 下限と上限がある場合は、下限と上限の間に `..` を記述する。 * 上限がない場合は `*` を記述する。 * 省略した場合は、 `[1]` となる。 以下に指定例を示す。 ```bash address [1..3] # 1から3の定義が可能 address # 省略しているので1つだけ可能 address [0..*] # 条件なし(0から無制限) address [*] # 条件なし(0から無制限) address [1..*] # 1以上 ``` 以下のxmlの場合、 `address` フィールドの定義数は `2` となる。 ```xml
自宅住所
勤務先住所
``` 以下のJSONの場合、 `address` フィールドの要素数は、`3` となる。 ```json { "address" : ["自宅住所", "勤務先住所", "送付先住所"] } ``` | | フィールドタイプ `必須` | フィールドのデータ型を定義する。 デフォルトで指定可能なフィールドタイプは、 [フィールドタイプ一覧](../../component/libraries/libraries-format-definition.md#data-format-field-type-list) を参照。 | | フィールドコンバータ `任意` | フィールドタイプに対するオプションの指定やデータ変換などの入出力の事前処理の内容を定義する。 デフォルトで指定可能なフィールドタイプは、 [フィールドコンバータ一覧](../../component/libraries/libraries-format-definition.md#data-format-field-convertor-list) を参照。 フィールドコンバータは、複数設定することも出来る。 | @@ -236,6 +238,7 @@ text-encoding: "utf-8" # 文字列型フィールドの文字エンコー 以下にマルチフォーマット形式のフォーマット定義例を示す。 ポイント + * レコード識別フィールドを定義する。レコードタイプ名は `Classifier` とする。 * 各レコード定義のレコードタイプ名直下に、レコードと判断するための条件を定義する。 * レコード識別(Classifier)に定義したフィールドは、レコード定義内に存在している必要がある。 @@ -276,6 +279,7 @@ multi_format_example 標準で提供するデータタイプ定義一覧を以下に示す。 Fixed(固定長)データ形式で使用可能なフィールドタイプ一覧 + | タイプ | Java型 | 説明 | |---|---|---| | X | String | シングルバイト文字列(バイト長 = 文字列長) デフォルトでは、半角空白による右トリム及びパディングが行われる。 バイト長(数値) `必須` 出力対象の値が `null` の場合、値を空文字に変換してから処理を行う。 読み込んだ値が空文字列の場合は、 `null` に変換する。 空文字列を `null` に変換したくない場合は、 convertEmptyToNull に `false` を設定する。 | @@ -288,17 +292,21 @@ Fixed(固定長)データ形式で使用可能なフィールドタイプ一覧 | B | byte[] | バイナリ列 パディングやトリムは行わない。 バイト長(数値) `必須` 出力対象の値が `null` の場合の変換仕様はアプリケーションごとに様々である。 そのため、本フィールドタイプではその場合でも値の変換は行わず、 InvalidDataFormatException を送出する。 本フィールドタイプを使用する場合、要件に合わせてアプリケーション側で明示的に値を設定すること。 | | X9 | BigDecimal | 符号無し数値文字列 (バイト長 = 文字数) フィールド中のシングルバイト文字列(X)を数値として扱う。 デフォルトでは、 `0` による左トリム・パディングを行う。 文字列中に小数点記号( `.` )を含めることできる。 バイト長(数値) `必須` 固定小数点の場合の小数点以下桁数(数値) `任意` デフォルト: `0` 出力対象の値が `null` の場合の扱いは、 ゾーン数値のフィールドタイプ と同じ。 読み込んだ値が空文字列の場合の扱いは、 シングルバイト文字列のフィールドタイプ と同じ。 | | SX9 | BigDecimal | 符号付き数値文字列 (バイト長 = 文字数) フィールド中のシングルバイト文字列(X)を符号付き数値として扱う。 デフォルトでは、 `0` による左トリム・パディングを行う。 バイト長(数値) `必須` 固定小数点の場合の小数点以下桁数(数値) `任意` デフォルト: `0` 出力対象の値が `null` の場合の扱いは、 ゾーン数値のフィールドタイプ と同じ。 読み込んだ値が空文字列の場合の扱いは、 シングルバイト文字列のフィールドタイプ と同じ。 符号文字(`+` 、`-`)を変更したい場合は、以下のクラスの実装を参考にプロジェクト固有のフィールドタイプを作成して対応する。 * SignedNumberStringDecimal フィールドタイプの追加については、 [フィールドタイプを追加する](../../component/libraries/libraries-data-format.md#data-format-field-type-add) を参照。 | + Variable(可変長)データ形式で使用可能なフィールドタイプ一覧 + | タイプ | Java型 | 説明 | |---|---|---| | X N XN X9 SX9 | String | 可変長データ形式では、すべてのフィールドを文字列(String)として読み書きする。 どのタイプ識別子を指定しても動作は変わらない。 また、フィールド長の概念が無いので、引数は不要である。 もし、文字列を数値形式(BigDecimal)として読み書きしたい場合は、 numberコンバータ または signed_numberコンバータ を使用すること。 出力対象の値が `null` の場合、値を空文字に変換してから処理を行う。 読み込んだ値が空文字列の場合は、 `null` に変換する。 空文字列を `null` に変換したくない場合は、 convertEmptyToNull に `false` を設定する。 | + JSONおよびXMLデータ形式で使用可能なフィールドタイプ一覧 + | タイプ | Java型 | 説明 | |---|---|---| | X N XN | String | 文字列データタイプ パディングなどの編集は行わない。 JSONの場合は、出力時に値がダブルクォート `"` で括られる。 出力対象の値が `null` の場合、JSONでは値の変換は行わなず、 XMLでは空文字に変換する。 | | X9 SX9 | String | 数値文字列タイプ パディングなどのデータ編集は行わない。出力時は値がそのまま出力される。 もし、文字列を数値形式(BigDecimal)として読み書きしたい場合は、 numberコンバータ または signed_numberコンバータ 使用すること。 出力対象の値が `null` の場合の扱いは、 文字列データタイプのフィールドタイプ と同じ。 | | BL | String | 文字列( `true` or `false` を文字列で表したもの) パディングなどのデータ編集は行わない。出力時は値がそのまま出力される。 出力対象の値が `null` の場合の扱いは、 文字列データタイプのフィールドタイプ と同じ。 | -| OB | - | ネストされたレコードタイプを指定する場合に使用する。 フィールド名に対応した、レコードタイプがネストした要素として入出力される。 出力対象の値が `null` の場合の扱いは、 文字列データタイプのフィールドタイプ と同じ。 以下に使用例を示す。 json ```json { "users": [ { "name" : "名前", "age" : 30, "address" : "住所" }, { "name" : "名前1", "age" : 31, "address" : "住所1" } ] } ``` xml ```xml 名前 30
住所
名前1 31
住所1
``` 上記のjson及びxmlに対応したフォーマット定義ファイルは以下のとおり。 ```bash [users] # ルート要素 1 user [1..*] OB [user] # ネストした要素 1 name N # 最下層の要素 2 age X9 3 address N ``` | +| OB | - | ネストされたレコードタイプを指定する場合に使用する。 フィールド名に対応した、レコードタイプがネストした要素として入出力される。 出力対象の値が `null` の場合の扱いは、 文字列データタイプのフィールドタイプ と同じ。 以下に使用例を示す。 json ```json { "users": [ { "name" : "名前", "age" : 30, "address" : "住所" }, { "name" : "名前1", "age" : 31, "address" : "住所1" } ] } ``` xml ```xml 名前 30
住所
名前1 31
住所1
``` 上記のjson及びxmlに対応したフォーマット定義ファイルは以下のとおり。 ```bash [users] # ルート要素 1 user [1..*] OB [user] # ネストした要素 1 name N # 最下層の要素 2 age X9 3 address N ``` | ### フィールドコンバータ一覧 @@ -318,8 +326,11 @@ JSONおよびXMLデータ形式で使用可能なフィールドタイプ一覧 フォーマット定義ファイルの項目定義と実際のデータの項目定義が合わない場合の振る舞いについて説明する。 固定長及び可変長データの場合 + 固定長及び可変長データの場合は、実際のデータとフォーマット定義の項目定義は厳密に一致させる必要がある。 このため、アプリケーションで不要となる項目が存在しているような場合でも、フォーマット定義ファイル上には項目を定義する必要がある。 + JSON及びXMLデータの場合 + JSON及びXMLの場合には、フォーマット定義ファイル上に定義されていない項目は、読み取り対象外となる。 このため、実際のデータ上に存在している項目でも、アプリケーションで不要なのであれば項目を定義しなくてもよい。 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-format.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-format.md index 42b9dff84..b2196fa6d 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-format.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-format.md @@ -74,6 +74,7 @@ FormatterUtil.format("dateTime", input, "yyyy年MM月dd日"); | [number](../../component/libraries/libraries-format.md#format-number) | String | #,###.### | | dateTime + 日付をフォーマットするフォーマッタ。 フォーマット対象の型は Date 及びその派生クラスと String である。 @@ -87,6 +88,7 @@ String 型をフォーマットする場合は、フォーマット対象とな 設定を変更したい場合は [フォーマッタの設定を変更する](../../component/libraries/libraries-format.md#format-custom) を参照すること。 number + 数値をフォーマットするフォーマッタ。 フォーマット対象の型は Number の派生クラスと String である。 @@ -94,7 +96,9 @@ number DecimalFormat が規定している構文を指定する。 デフォルトのパターンは `#,###.###` である。 + 使用例 + 例えば、データバインドを使用してファイルに出力する際に本機能を使用したい場合は、 Beanのgetterで使用するとよい。 @@ -125,6 +129,7 @@ public class SampleDto { コンポーネント設定ファイルに `nablarch.core.text.FormatterConfig` の設定をする。 ポイント + * コンポーネント名は `formatterConfig` とすること。 `nablarch.core.text.FormatterConfig` に使用するフォーマッタのリストの設定をする。 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-generator.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-generator.md index b6b546921..a524085ec 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-generator.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-generator.md @@ -22,6 +22,7 @@ 以下の理由によりアプリケーション側で対応することを推奨する。 理由 + サロゲートキーの採番処理は、 [ユニバーサルDAO](../../component/libraries/libraries-universal-dao.md#universal-dao) が行うためアプリケーション側で直接採番機能を使用する必要が無い。 それ以外の用途で値を採番する場合には、採番ルールが複雑であったり、採番した値を編集することが想定される。 このような場合は、単純な連番を採番する本機能を使用できないため、アプリケーション側で設計、実装する必要がある。 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-http-access-log.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-http-access-log.md index bcee2dadd..34c4c9561 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-http-access-log.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-http-access-log.md @@ -15,11 +15,16 @@ HTTPアクセスログは、フレームワークが提供するハンドラを HTTPアクセスログの出力に必要となるハンドラは以下のとおり。 [HTTPアクセスログハンドラ](../../component/handlers/handlers-http-access-log-handler.md#http-access-log-handler) + リクエスト処理開始時と終了時のログ出力を行う。 + [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) + hiddenパラメータ復号後のログ出力を行う。 hiddenパラメータについては、 [hidden暗号化](../../component/libraries/libraries-tag.md#tag-hidden-encryption) を参照。 + [HTTPリクエストディスパッチハンドラ](../../component/handlers/handlers-http-request-java-package-mapping.md#http-request-java-package-mapping) + ディスパッチ先クラス決定後のログ出力を行う。 リクエストパラメータを含めたリクエスト情報を出力することで、 @@ -38,6 +43,7 @@ HTTPアクセスログの出力方針 上記出力方針に対するログ出力の設定例を下記に示す。 log.propertiesの設定例 + ```properties writerNames=appLog @@ -61,7 +67,9 @@ loggers.ACC.nameRegex=HTTP_ACCESS loggers.ACC.level=INFO loggers.ACC.writerNames=appLog ``` + app-log.propertiesの設定例 + ```properties # HttpAccessLogFormatter #httpAccessLogFormatter.className= @@ -97,14 +105,18 @@ httpAccessLogFormatter.endFormat=@@@@ END @@@@ rid = [$requestId$] uid = [$userI HTTPアクセスログの設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + httpAccessLogFormatter.className + HttpAccessLogFormatter を実装したクラス。 差し替える場合に指定する。 httpAccessLogFormatter.beginFormat + リクエスト処理開始時のログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $requestId$ $userId$ @@ -130,7 +142,9 @@ $clientIpAddress$ $clientHost$ $clientUserAgent$ + デフォルトのフォーマット + ```bash @@@@ BEGIN @@@@ rid = [$requestId$] uid = [$userId$] sid = [$sessionId$] \n\turl = [$url$] @@ -152,32 +166,44 @@ $clientUserAgent$ > ハンドラ構成に [スレッドコンテキスト変数管理ハンドラ](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler) が含まれている必要がある。 > 特にユーザIDについては、 [ユーザIDを設定する](../../component/handlers/handlers-thread-context-handler.md#thread-context-handler-user-id-attribute-setting) を参照して > アプリケーションでセッションに値を設定する必要がある。 + httpAccessLogFormatter.parametersFormat + hiddenパラメータ復号後のログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + 「リクエスト処理開始時のログ出力に使用するフォーマット」と同じため省略。 + デフォルトのフォーマット + ```bash @@@@ PARAMETERS @@@@ \n\tparameters = [$parameters$] ``` + httpAccessLogFormatter.dispatchingClassFormat + ディスパッチ先クラス決定後のログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $dispatchingClass$ $sessionStoreId$ + デフォルトのフォーマット + ```bash @@@@ DISPATCHING CLASS @@@@ class = [$dispatchingClass$] ``` httpAccessLogFormatter.endFormat + リクエスト処理終了時のログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $dispatchingClass$ $statusCode$ @@ -197,7 +223,9 @@ $maxMemory$ $freeMemory$ $sessionStoreId$ + デフォルトのフォーマット + ```bash @@@@ END @@@@ rid = [$requestId$] uid = [$userId$] sid = [$sessionId$] url = [$url$] status_code = [$statusCode$] content_path = [$contentPath$] \n\tstart_time = [$startTime$] @@ -220,41 +248,61 @@ $sessionStoreId$ > `ステータスコード(クライアント)` の値は、 HTTPアクセスログハンドラの処理の後にJSPのエラーなどシステムエラーが発生した場合、 > 実際の内部コードと異なることがある。この場合、システムエラーとして別途障害監視ログが出力されるため、 > 障害監視ログが発生した際にはこの値が正しくない可能性があることを考慮してログを検証すること。 + httpAccessLogFormatter.datePattern + 開始日時と終了日時に使用する日時パターン。 パターンには、 SimpleDateFormat が規程している構文を指定する。 デフォルトは `yyyy-MM-dd HH:mm:ss.SSS` 。 + httpAccessLogFormatter.maskingPatterns + マスク対象のパラメータ名又は変数名を正規表現で指定する。 複数指定する場合はカンマ区切り。 リクエストパラメータとセッションスコープ情報の両方のマスキングに使用する。 指定した正規表現は大文字小文字を区別しない。 例えば、 `password` と指定した場合、 `password` `newPassword` `password2` 等にマッチする。 + httpAccessLogFormatter.maskingChar + マスクに使用する文字。デフォルトは `*` 。 + httpAccessLogFormatter.parametersSeparator + リクエストパラメータのセパレータ。 デフォルトは `\n\t\t` 。 + httpAccessLogFormatter.sessionScopeSeparator + セッションスコープ情報のセパレータ。 デフォルトは `\n\t\t` 。 + httpAccessLogFormatter.beginOutputEnabled + リクエスト処理開始時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理開始時に出力しない。 + httpAccessLogFormatter.parametersOutputEnabled + hiddenパラメータ復号後の出力が有効か否か。 デフォルトはtrue。 falseを指定するとhiddenパラメータ復号後に出力しない。 + httpAccessLogFormatter.dispatchingClassOutputEnabled + ディスパッチ先クラス決定後の出力が有効か否か。 デフォルトはtrue。 falseを指定するとディスパッチ先クラス決定後に出力しない。 + httpAccessLogFormatter.endOutputEnabled + リクエスト処理終了時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理終了時に出力しない。 + 記述例 + ```properties httpAccessLogFormatter.className=nablarch.fw.web.handler.HttpAccessLogFormatter httpAccessLogFormatter.beginFormat=> sid = [$sessionId$] @@@@ BEGIN @@@@\n\turl = [$url$]\n\tmethod = [$method$] @@ -282,17 +330,21 @@ HttpAccessJsonLogFormatter を使用する。 設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + HttpAccessJsonLogFormatter を用いる際に 指定するプロパティは以下の通り。 httpAccessLogFormatter.className `必須` + JSON形式でログを出力する場合、 HttpAccessJsonLogFormatter を指定する。 httpAccessLogFormatter.beginTargets + リクエスト処理開始時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + label `デフォルト` requestId `デフォルト` @@ -324,15 +376,20 @@ clientUserAgent 出力項目の詳細は、 [リクエスト処理開始時のログ出力に使用するフォーマット](../../component/libraries/libraries-http-access-log.md#http-access-log-prop-begin-format) のプレースホルダーと同じため省略。 + httpAccessLogFormatter.parametersTargets + hiddenパラメータ復号後のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目は、 [リクエスト処理開始時の出力項目](../../component/libraries/libraries-http-access-log.md#http-access-log-prop-begin-targets) と同じため省略。 デフォルトの出力項目は `label,parameters` となる。 + httpAccessLogFormatter.dispatchingClassTargets + ディスパッチ先クラス決定後のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + label `デフォルト` sessionId @@ -340,10 +397,13 @@ sessionId sessionStoreId dispatchingClass `デフォルト` + httpAccessLogFormatter.endTargets + リクエスト処理終了時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + label `デフォルト` requestId `デフォルト` @@ -377,52 +437,78 @@ freeMemory `デフォルト` 出力項目の詳細は、 [リクエスト処理終了時のログ出力に使用するフォーマット](../../component/libraries/libraries-http-access-log.md#http-access-log-prop-end-format) のプレースホルダーと同じため省略。 + httpAccessLogFormatter.datePattern + 開始日時と終了日時に使用する日時パターン。 パターンには、 SimpleDateFormat が規程している構文を指定する。 デフォルトは `yyyy-MM-dd HH:mm:ss.SSS` 。 + httpAccessLogFormatter.maskingPatterns + マスク対象のパラメータ名又は変数名を正規表現で指定する(部分一致)。 複数指定する場合はカンマ区切り。 リクエストパラメータとセッションスコープ情報の両方のマスキングに使用する。 指定した正規表現は大文字小文字を区別しない。 例えば、 `password` と指定した場合、 `password` `newPassword` `password2` 等にマッチする。 + httpAccessLogFormatter.maskingChar + マスクに使用する文字。デフォルトは `*` 。 + httpAccessLogFormatter.beginOutputEnabled + リクエスト処理開始時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理開始時に出力しない。 + httpAccessLogFormatter.parametersOutputEnabled + hiddenパラメータ復号後の出力が有効か否か。 デフォルトはtrue。 falseを指定するとhiddenパラメータ復号後に出力しない。 + httpAccessLogFormatter.dispatchingClassOutputEnabled + ディスパッチ先クラス決定後の出力が有効か否か。 デフォルトはtrue。 falseを指定するとディスパッチ先クラス決定後に出力しない。 + httpAccessLogFormatter.endOutputEnabled + リクエスト処理終了時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理終了時に出力しない。 + httpAccessLogFormatter.beginLabel + リクエスト処理開始時ログのlabelに出力する値。 デフォルトは `"HTTP ACCESS BEGIN"`。 + httpAccessLogFormatter.parametersLabel + hiddenパラメータ復号後ログのlabelに出力する値。 デフォルトは `"PARAMETERS"`。 + httpAccessLogFormatter.dispatchingClassLabel + ディスパッチ先クラス決定後ログのlabelに出力する値。 デフォルトは `"DISPATCHING CLASS"`。 + httpAccessLogFormatter.endLabel + リクエスト処理終了時ログのlabelに出力する値。 デフォルトは `"HTTP ACCESS END"`。 + httpAccessLogFormatter.structuredMessagePrefix + フォーマット後のメッセージ文字列が JSON 形式に整形されていることを識別できるようにするために、メッセージの先頭に付与するマーカー文字列。 メッセージの先頭にあるマーカー文字列が JsonLogFormatter に設定しているマーカー文字列と一致する場合、 JsonLogFormatter はメッセージを JSON データとして処理する。 デフォルトは `"$JSON$"` となる。 変更する場合は、LogWriterの `structuredMessagePrefix` プロパティを使用して JsonLogFormatter にも同じ値を設定すること(LogWriterのプロパティについては [ログ出力の設定](../../component/libraries/libraries-log.md#log-basic-setting) を参照)。 + 記述例 + ```properties httpAccessLogFormatter.className=nablarch.fw.web.handler.HttpAccessJsonLogFormatter httpAccessLogFormatter.structuredMessagePrefix=$JSON$ diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-http-system-messaging.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-http-system-messaging.md index 02406bd68..f803a7b50 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-http-system-messaging.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-http-system-messaging.md @@ -79,6 +79,7 @@ HTTPメッセージングでは、メッセージの送受信の実装を [MOM 以下に設定例を示す。 ポイント + * MessageSenderClient のデフォルト実装として HttpMessagingClient を提供している。 * ルックアップして使用されるため、コンポーネント名は `messageSenderClient` と指定する。 @@ -95,7 +96,9 @@ HTTPメッセージングでは、メッセージの送受信の実装を [MOM ![http_system_messaging-message_receive.png](../../../knowledge/assets/libraries-http-system-messaging/http_system_messaging-message_receive.png) 実装例 + ポイント + * HTTPメッセージ受信は、 MessagingAction で作成する。 * 応答電文は、 RequestMessage.reply で作成する。 @@ -133,7 +136,9 @@ public class SampleAction extends MessagingAction { ![http_system_messaging-message_send.png](../../../knowledge/assets/libraries-http-system-messaging/http_system_messaging-message_send.png) 実装例 + ポイント + * 要求電文は、 SyncMessage で作成する。 * メッセージ送信には、 MessageSender#sendSync を使用する。 使い方の詳細は、リンク先のJavadocを参照。 @@ -170,9 +175,12 @@ requestMessage.getHeaderRecord().put("Accept-Charset", "UTF-8"); 以下に、送受信の種類ごとに対応方法を示す。 HTTPメッセージ送信の場合 + フレームワーク制御ヘッダの読み書きは、メッセージボディのフォーマット定義により行う。 そのため、変更内容に合わせてメッセージボディのフォーマット定義を変更すればよい。 + HTTPメッセージ受信の場合 + フレームワーク制御ヘッダの読み書きは、 FwHeaderDefinition インタフェースを実装したクラスが行う。 デフォルトでは、 StandardFwHeaderDefinition が使用される。 @@ -206,20 +214,25 @@ HTTPメッセージングでは、送受信電文の内容を以下のデータ ![http_system_messaging-data_model.png](../../../knowledge/assets/libraries-http-system-messaging/http_system_messaging-data_model.png) プロトコルヘッダ + 主にウェブコンテナによるメッセージ送受信処理において使用される情報を格納したヘッダ領域である。 プロトコルヘッダはMapインターフェースでアクセスすることが可能となっている。 共通プロトコルヘッダ + プロトコルヘッダのうち、フレームワークが使用する以下のヘッダについては、特定のキー名でアクセスできる。 キー名をカッコで示す。 メッセージID(X-Message-Id) + 電文ごとに一意採番される文字列 送信処理の際に採番した値 送信側が発番した値 + 関連メッセージID(X-Correlation-Id) + 電文が関連する電文のメッセージID 要求電文のメッセージID @@ -227,6 +240,7 @@ HTTPメッセージングでは、送受信電文の内容を以下のデータ 応答再送を要求する要求電文のメッセージID メッセージボディ + HTTPリクエストのデータ領域をメッセージボディと呼ぶ。 フレームワーク機能は、原則としてプロトコルヘッダ領域のみを使用する。 それ以外のデータ領域については、未解析の単なるバイナリデータとして扱うものとする。 @@ -235,12 +249,14 @@ HTTPリクエストのデータ領域をメッセージボディと呼ぶ。 これにより、電文の内容をフィールド名をキーとするMap形式で読み書き可能である。 フレームワーク制御ヘッダ + 本フレームワークが提供する機能の中には、電文中に特定の制御項目が定義されていることを前提として設計されているものが多く存在する。 そのような制御項目のことを `フレームワーク制御ヘッダ` とよぶ。 フレームワーク制御ヘッダとそれを使用するハンドラの対応は以下のとおり。 リクエストID + この電文を受信したアプリケーションが実行すべき業務処理を識別するためのID。 このヘッダを使用する主要なハンドラ: @@ -249,19 +265,25 @@ HTTPリクエストのデータ領域をメッセージボディと呼ぶ。 [再送電文制御ハンドラ](../../component/handlers/handlers-message-resend-handler.md#message-resend-handler) [認可チェックハンドラ](../../component/handlers/handlers-permission-check-handler.md#permission-check-handler) [サービス提供可否チェックハンドラ](../../component/handlers/handlers-ServiceAvailabilityCheckHandler.md#serviceavailabilitycheckhandler) + ユーザID + この電文の実行権限を表す文字列 このヘッダを使用する主要なハンドラ: [認可チェックハンドラ](../../component/handlers/handlers-permission-check-handler.md#permission-check-handler) + 再送要求フラグ + 再送要求電文の送信時に設定されるフラグ このヘッダを使用する主要なハンドラ: [再送電文制御ハンドラ](../../component/handlers/handlers-message-resend-handler.md#message-resend-handler) + ステータスコード + 要求電文に対する処理結果を表すコード値 このヘッダを使用する主要なハンドラ: diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-jaxrs-access-log.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-jaxrs-access-log.md index 2893afb98..3e44f9c31 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-jaxrs-access-log.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-jaxrs-access-log.md @@ -15,6 +15,7 @@ HTTPアクセスログは、フレームワークが提供するハンドラを HTTPアクセスログの出力に必要となるハンドラは以下のとおり。 [HTTPアクセスログ(RESTfulウェブサービス用)ハンドラ](../../component/handlers/handlers-jaxrs-access-log-handler.md#jaxrs-access-log-handler) + リクエスト処理開始時と終了時のログ出力を行う。 リクエストパラメータを含めたリクエスト情報を出力することで、 @@ -33,6 +34,7 @@ HTTPアクセスログの出力方針 上記出力方針に対するログ出力の設定例を下記に示す。 log.propertiesの設定例 + ```properties writerNames=appLog @@ -56,7 +58,9 @@ loggers.ACC.nameRegex=HTTP_ACCESS loggers.ACC.level=INFO loggers.ACC.writerNames=appLog ``` + app-log.propertiesの設定例 + ```properties # JaxRsAccessLogFormatter #jaxRsAccessLogFormatter.className= @@ -91,14 +95,18 @@ jaxRsAccessLogFormatter.endFormat=@@@@ END @@@@ rid = [$requestId$] uid = [$user HTTPアクセスログの設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + jaxRsAccessLogFormatter.className + JaxRsAccessLogFormatter を実装したクラス。 差し替える場合に指定する。 jaxRsAccessLogFormatter.beginFormat + リクエスト処理開始時のログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $requestId$ $userId$ @@ -126,7 +134,9 @@ $clientHost$ $clientUserAgent$ $requestBody$ + デフォルトのフォーマット + ```bash @@@@ BEGIN @@@@ rid = [$requestId$] uid = [$userId$] sid = [$sessionId$] \n\turl = [$url$] @@ -151,9 +161,11 @@ $requestBody$ > アプリケーションでセッションに値を設定する必要がある。 jaxRsAccessLogFormatter.endFormat + リクエスト処理終了時のログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $statusCode$ $startTime$ @@ -169,7 +181,9 @@ $freeMemory$ $sessionStoreId$ $responseBody$ + デフォルトのフォーマット + ```bash @@@@ END @@@@ rid = [$requestId$] uid = [$userId$] sid = [$sessionId$] url = [$url$] status_code = [$statusCode$] \n\tstart_time = [$startTime$] @@ -178,47 +192,69 @@ $responseBody$ \n\tmax_memory = [$maxMemory$] \n\tfree_memory = [$freeMemory$] ``` + jaxRsAccessLogFormatter.datePattern + 開始日時と終了日時に使用する日時パターン。 パターンには、 SimpleDateFormat が規程している構文を指定する。 デフォルトは `yyyy-MM-dd HH:mm:ss.SSS` 。 + jaxRsAccessLogFormatter.maskingPatterns + マスク対象のパラメータ名又は変数名を正規表現で指定する。 複数指定する場合はカンマ区切り。 リクエストパラメータとセッションスコープ情報の両方のマスキングに使用する。 指定した正規表現は大文字小文字を区別しない。 例えば、 `password` と指定した場合、 `password` `newPassword` `password2` 等にマッチする。 + jaxRsAccessLogFormatter.maskingChar + マスクに使用する文字。デフォルトは `*` 。 + jaxRsAccessLogFormatter.bodyLogTargetMatcher + リクエストボディ及びレスポンスボディを出力するか判定するためのクラス。 MessageBodyLogTargetMatcher を実装するクラス名を指定する。 デフォルトは JaxRsBodyLogTargetMatcher 。 + jaxRsAccessLogFormatter.bodyMaskingFilter + リクエストボディ及びレスポンスボディをマスク処理するためのクラス。 LogContentMaskingFilter を実装するクラス名を指定する。 デフォルトは JaxRsBodyMaskingFilter 。 > **Important:** > RESTfulウェブサービスで送受信するボディの形式にはいくつかあるが、デフォルトの JaxRsBodyMaskingFilter ではJSON形式のみサポートしている。 + jaxRsAccessLogFormatter.bodyMaskingItemNames + リクエストボディ及びレスポンスボディをマスク処理する場合、マスク対象の項目名を指定する。 複数指定する場合はカンマ区切り。 + jaxRsAccessLogFormatter.parametersSeparator + リクエストパラメータのセパレータ。 デフォルトは `\n\t\t` 。 + jaxRsAccessLogFormatter.sessionScopeSeparator + セッションスコープ情報のセパレータ。 デフォルトは `\n\t\t` 。 + jaxRsAccessLogFormatter.beginOutputEnabled + リクエスト処理開始時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理開始時に出力しない。 + jaxRsAccessLogFormatter.endOutputEnabled + リクエスト処理終了時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理終了時に出力しない。 + 記述例 + ```properties jaxRsAccessLogFormatter.className=nablarch.fw.jaxrs.JaxRsAccessLogFormatter jaxRsAccessLogFormatter.beginFormat=> sid = [$sessionId$] @@@@ BEGIN @@@@\n\turl = [$url$]\n\tmethod = [$method$] @@ -245,17 +281,21 @@ JaxRsAccessJsonLogFormatter を使用する。 設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + JaxRsAccessJsonLogFormatter を用いる際に 指定するプロパティは以下の通り。 httpAccessLogFormatter.className `必須` + JSON形式でログを出力する場合、 JaxRsAccessJsonLogFormatter を指定する。 jaxRsAccessLogFormatter.beginTargets + リクエスト処理開始時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + label `デフォルト` requestId `デフォルト` @@ -289,10 +329,13 @@ requestBody 出力項目の詳細は、 [リクエスト処理開始時のログ出力に使用するフォーマット](../../component/libraries/libraries-jaxrs-access-log.md#jaxrs-access-log-prop-begin-format) のプレースホルダーと同じため省略。 + jaxRsAccessLogFormatter.endTargets + リクエスト処理終了時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + label `デフォルト` requestId `デフォルト` @@ -322,38 +365,56 @@ responseBody 出力項目の詳細は、 [リクエスト処理終了時のログ出力に使用するフォーマット](../../component/libraries/libraries-jaxrs-access-log.md#jaxrs-access-log-prop-end-format) のプレースホルダーと同じため省略。 + jaxRsAccessLogFormatter.datePattern + 開始日時と終了日時に使用する日時パターン。 パターンには、 SimpleDateFormat が規程している構文を指定する。 デフォルトは `yyyy-MM-dd HH:mm:ss.SSS` 。 + jaxRsAccessLogFormatter.maskingPatterns + マスク対象のパラメータ名又は変数名を正規表現で指定する(部分一致)。 複数指定する場合はカンマ区切り。 リクエストパラメータとセッションスコープ情報の両方のマスキングに使用する。 指定した正規表現は大文字小文字を区別しない。 例えば、 `password` と指定した場合、 `password` `newPassword` `password2` 等にマッチする。 + jaxRsAccessLogFormatter.maskingChar + マスクに使用する文字。デフォルトは `*` 。 + jaxRsAccessLogFormatter.beginOutputEnabled + リクエスト処理開始時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理開始時に出力しない。 + jaxRsAccessLogFormatter.endOutputEnabled + リクエスト処理終了時の出力が有効か否か。 デフォルトはtrue。 falseを指定するとリクエスト処理終了時に出力しない。 + jaxRsAccessLogFormatter.beginLabel + リクエスト処理開始時ログのlabelに出力する値。 デフォルトは `"HTTP ACCESS BEGIN"`。 + jaxRsAccessLogFormatter.endLabel + リクエスト処理終了時ログのlabelに出力する値。 デフォルトは `"HTTP ACCESS END"`。 + jaxRsAccessLogFormatter.structuredMessagePrefix + フォーマット後のメッセージ文字列が JSON 形式に整形されていることを識別できるようにするために、メッセージの先頭に付与するマーカー文字列。 メッセージの先頭にあるマーカー文字列が JsonLogFormatter に設定しているマーカー文字列と一致する場合、 JsonLogFormatter はメッセージを JSON データとして処理する。 デフォルトは `"$JSON$"` となる。 変更する場合は、LogWriterの `structuredMessagePrefix` プロパティを使用して JsonLogFormatter にも同じ値を設定すること(LogWriterのプロパティについては [ログ出力の設定](../../component/libraries/libraries-log.md#log-basic-setting) を参照)。 + 記述例 + ```properties httpAccessLogFormatter.className=nablarch.fw.jaxrs.JaxRsAccessJsonLogFormatter httpAccessLogFormatter.structuredMessagePrefix=$JSON$ diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-log.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-log.md index 1f4d1c1c1..79648869a 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-log.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-log.md @@ -68,19 +68,23 @@ LoggerFactory を差し替えればよい。 ログ出力機能がデフォルトで提供しているクラスを示す。 Logger/LoggerFactory + * BasicLogger * BasicLoggerFactory LogWriter + * FileLogWriter (ファイルへ出力。ログのローテーション。) * SynchronousFileLogWriter (複数プロセスから1ファイルへの出力) * StandardOutputLogWriter (標準出力へ出力) * LogPublisher (任意のリスナーへ出力) LogFormatter + * BasicLogFormatter (パターン文字列によるフォーマット) RotatePolicy + * DateRotatePolicy (日時によるログのローテーション) * FileSizeRotatePolicy (ファイルサイズによるログのローテーション) @@ -200,6 +204,7 @@ Logger の取得ではロガー名を指定する。 ログ出力の設定は、プロパティファイルに行う。 プロパティファイルの場所 + クラスパス直下の **log.properties** を使用する。 場所を変更したい場合は、システムプロパティで **nablarch.log.filePath** をキーにファイルパスを指定する。 ファイルパスの指定方法は @@ -208,29 +213,46 @@ FileUtil#getResource を参照。 ```bash >java -Dnablarch.log.filePath=classpath:nablarch/example/log.properties ... ``` + プロパティファイルの記述ルール + プロパティファイルの記述ルールを以下に示す。 LoggerFactory + 記述ルール + loggerFactory.className + LoggerFactoryを実装したクラスのFQCNを指定する。 本機能を使う場合は、 BasicLoggerFactory を指定する。 + 記述例 + ```properties # LoggerFactoryにより、ログ出力に使用する実装(本機能やLog4Jなど)が決まる。 loggerFactory.className=nablarch.core.log.basic.BasicLoggerFactory ``` + LogWriter + 記述ルール + writerNames + 使用する全てのLogWriterの名前を指定する。複数指定する場合はカンマ区切り。 + writer.<名前>.className + LogWriterを実装したクラスのFQCNを指定する。 + writer.<名前>.<プロパティ名> + LogWriter毎のプロパティに設定する値を指定する。 指定できるプロパティについては使用するLogWriterのJavadocを参照。 + 記述例 + ```properties # 2つの名前を定義する。 writerNames=appLog,stdout @@ -242,9 +264,13 @@ writer.appLog.filePath=/var/log/app/app.log # stdoutの設定を行う。 writer.stdout.className=nablarch.core.log.basic.StandardOutputLogWriter ``` + ロガー設定 + 記述ルール + availableLoggersNamesOrder + 使用する全てのロガー設定の名前を指定する。複数指定する場合はカンマ区切り。 > **Important:** @@ -268,19 +294,27 @@ availableLoggersNamesOrder > このチェックは、設定漏れの発生を防ぐために行っている。 > 上記の設定にあるavailableLoggersNamesOrderから `access` を取り除いた場合は、明示的にloggers.access.*の設定も取り除く必要がある。 + loggers.<名前>.nameRegex + ロガー名とのマッチングに使用する正規表現を指定する。 正規表現は、ロガー設定の対象となるロガーを絞り込むために使用する。 ロガーの取得時に指定されたロガー名(つまり LoggerManager#get の引数に指定されたロガー名)に対してマッチングを行う。 + loggers.<名前>.level + LogLevel の名前を指定する。 ここで指定したレベル以上のログを全て出力する。 + loggers.<名前>.writerNames + 出力先とするLogWriterの名前を指定する。 複数指定する場合はカンマ区切り。 ここで指定した全てのLogWriterに対してログの書き込みを行う。 + 記述例 + ```properties # 2つのロガー設定の名前を定義する。 availableLoggersNamesOrder=sql,root @@ -295,7 +329,9 @@ loggers.sql.nameRegex=SQL loggers.sql.level=DEBUG loggers.sql.writerNames=sqlLog ``` + プロパティファイルの記述例 + プロパティファイル全体の記述例を以下に示す。 ```properties @@ -416,6 +452,7 @@ BasicLogFormatter * [実行時ID](../../component/libraries/libraries-log.md#log-execution-id) 起動プロセス + 起動プロセスとは、アプリケーションを起動した実行環境を特定するために使用する名前である。 起動プロセスにサーバ名とJOBIDなどの識別文字列を組み合わせた名前を使用することで、 同一サーバの複数プロセスから出力されたログの実行環境を特定できる。 @@ -425,6 +462,7 @@ BasicLogFormatter システムプロパティの指定がない場合、起動プロセスはブランクとなる。 処理方式 + 処理方式とは、ウェブ、バッチなどを意味する。 アプリケーションの処理方式を識別したい場合に、プロジェクト毎に規定して使用する。 @@ -433,6 +471,7 @@ BasicLogFormatter プロパティの指定がない場合はブランクとなる。 実行時ID + 実行時IDとは、リクエストIDに対するアプリケーションの個々の実行を識別するためにつけるIDである。 1つのリクエストIDに対して実行された数だけ実行時IDが発行されるため、 リクエストIDと実行時IDの関係は1対多となる。 @@ -443,6 +482,7 @@ BasicLogFormatter を初期化するタイミングで発行し、 ThreadContext に設定される。 実行時IDのID体系 + ```none # 起動プロセスは指定された場合のみ付加する。 起動プロセス+システム日時(yyyyMMddHHmmssSSS)+連番(4桁) @@ -456,6 +496,7 @@ BasicLogFormatter > アプリケーションでセッションに値を設定する必要がある。 改行コードとタブ文字を含めたい場合 + フォーマットに改行コードとタブ文字を含めたい場合は、以下に示すように、Javaと同様の記述を使用する。 ```none @@ -481,6 +522,7 @@ BasicLogFormatter 各種ログの設定は、プロパティファイルに行う。 プロパティファイルの場所 + クラスパス直下の **app-log.properties** を使用する。 場所を変更したい場合は、システムプロパティで **nablarch.appLog.filePath** をキーにファイルパスを指定する。 ファイルパスの指定方法は @@ -489,7 +531,9 @@ FileUtil#getResource を参照。 ```bash >java -Dnablarch.appLog.filePath=file:/var/log/app/app-log.properties ... ``` + プロパティファイルの記述ルール + 各種ログごとに異なるので、以下を参照。 * [障害ログの設定](../../component/libraries/libraries-failure-log.md#failure-log-setting) @@ -579,6 +623,7 @@ writer.appLog.formatter.bootProcess=CUSTOM_PROCESS ``` LogItem を実装したクラスを作る + ```java // カスタムの起動プロセスを取得するクラス。 public class CustomBootProcessItem implements LogItem { @@ -597,7 +642,9 @@ public class CustomBootProcessItem implements LogItem { } } ``` + BasicLogFormatter を継承したクラスを作り、プレースホルダを追加する + ```java public class CustomLogFormatter extends BasicLogFormatter { @@ -698,6 +745,7 @@ LogWriterで使用するフォーマッタを JsonLogFormatter に変更する ログの出力をJSON形式にできる。 使用方法 + JsonLogFormatter の設定例を以下に示す。 ```properties @@ -738,6 +786,7 @@ targetsプロパティで指定できる出力項目 > `datePattern` および `label` (ログレベルの文言指定)は、 BasicLogFormatter と同様に機能する。 記述例 + ```java // クラスを指定してLoggerを取得する。 // Loggerはクラス変数に保持する。 @@ -753,7 +802,9 @@ LOGGER.logInfo("hello"); ```none {"date":"2021-02-04 12:34:56.789","logLevel":"INFO","message":"hello"} ``` + 項目を独自に追加する + 出力対象に `payload` を含む場合、オプション情報に指定されたMapオブジェクトをJSONオブジェクトとして出力する。 オブジェクトの変換ルールは下記の通り。 @@ -771,6 +822,7 @@ LOGGER.logInfo("hello"); | その他のオブジェクト | `toString()` メソッドの戻り値をJSONの文字列として出力する。 | 記述例 + ```java Map structuredArgs = new HashTable(); structuredArgs.put("key1", "value1"); @@ -829,36 +881,50 @@ ApplicationSettingLogFormatter は、システム設定値をログに出力す 設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + ApplicationSettingJsonLogFormatter を用いる際に 指定するプロパティは以下の通り。 applicationSettingLogFormatter.className `必須` + JSON形式でログを出力する場合、 ApplicationSettingJsonLogFormatter を指定する。 + applicationSettingLogFormatter.appSettingTargets + アプリケーション設定ログで出力する項目(業務日付なし)。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + systemSettings `デフォルト` businessDate + applicationSettingLogFormatter.appSettingWithDateTargets + アプリケーション設定ログで出力する項目(業務日付あり)。カンマ区切りで指定する。 指定可能な出力項目 + systemSettings businessDate デフォルトは全ての出力項目が対象となる。 + applicationSettingLogFormatter.systemSettingItems + 出力するシステム設定値の名前の一覧。カンマ区切りで指定する。 デフォルトは空なので、何も出力しない。 + applicationSettingLogFormatter.structuredMessagePrefix + フォーマット後のメッセージ文字列が JSON 形式に整形されていることを識別できるようにするために、メッセージの先頭に付与するマーカー文字列。 メッセージの先頭にこのマーカーがある場合、 JsonLogFormatter はメッセージを JSON データとして処理する。 デフォルトは `"$JSON$"` となる。 + 記述例 + ```properties applicationSettingLogFormatter.className=nablarch.core.log.app.ApplicationSettingJsonLogFormatter applicationSettingLogFormatter.structuredMessagePrefix=$JSON$ @@ -874,16 +940,21 @@ LauncherLogFormatter は、バッチの開始・終了ログを出力すると 設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + LauncherJsonLogFormatter を用いる際に 指定するプロパティは以下の通り。 launcherLogFormatter.className `必須` + JSON形式でログを出力する場合、 LauncherJsonLogFormatter を指定する。 + launcherLogFormatter.startTargets + バッチの開始ログに出力する項目。カンマ区切りで指定する。 指定可能な出力項目 + label commandLineOptions @@ -891,10 +962,13 @@ commandLineOptions commandLineArguments デフォルトは全ての出力項目が対象となる。 + launcherLogFormatter.endTargets + バッチの終了ログに出力する項目。カンマ区切りで指定する。 指定可能な出力項目 + label exitCode @@ -902,15 +976,23 @@ exitCode executeTime デフォルトは全ての出力項目が対象となる。 + launcherLogFormatter.startLogMsgLabel + 開始ログのlabelで出力する値。デフォルトは `"BATCH BEGIN"`。 + launcherLogFormatter.endLogMsgLabel + 終了ログのlabelで出力する値。デフォルトは `"BATCH END"`。 + launcherLogFormatter.structuredMessagePrefix + フォーマット後のメッセージ文字列が JSON 形式に整形されていることを識別できるようにするために、メッセージの先頭に付与するマーカー文字列。 メッセージの先頭にこのマーカーがある場合、 JsonLogFormatter はメッセージを JSON データとして処理する。 デフォルトは `"$JSON$"` となる。 + 記述例 + ```properties launcherLogFormatter.className=nablarch.fw.launcher.logging.LauncherJsonLogFormatter launcherLogFormatter.structuredMessagePrefix=$JSON$ @@ -929,6 +1011,7 @@ CommitLogger は、コミット件数をログに出力するために用いら 以下に、コンポーネント定義の例を示す。 コンポーネント定義の例 + ```xml @@ -973,6 +1056,7 @@ SynchronousFileLogWriter 障害コードを設定するプロパティ名を以下に示す。 failureCodeCreateLockFile + ロックファイルが生成できない FATAL @@ -980,7 +1064,9 @@ FATAL ロックファイルの生成に失敗しました。おそらくロックファイルのパスが間違っています。ロックファイルパス=[{0}]。 failed to create lock file. perhaps lock file path was invalid. lock file path=[{0}]. + failureCodeReleaseLockFile + 生成したロックファイルを解放(削除)できない FATAL @@ -988,7 +1074,9 @@ FATAL ロックファイルの削除に失敗しました。ロックファイルパス=[{0}]。 failed to delete lock file. lock file path=[{0}]. + failureCodeForceDeleteLockFile + 解放されないロックファイルを強制削除できない FATAL @@ -996,7 +1084,9 @@ FATAL ロックファイルの強制削除に失敗しました。ロックファイルが不正に開かれています。ロックファイルパス=[{0}]。 failed to delete lock file forcedly. lock file was opened illegally. lock file path=[{0}]. + failureCodeInterruptLockWait + ロック取得待ちでスレッドをスリープしている際に、割り込みが発生 FATAL diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-mail.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-mail.md index 467d33f77..74803c67d 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-mail.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-mail.md @@ -153,12 +153,14 @@ * [メール送信バッチの設定](../../component/libraries/libraries-mail.md#mail-mail-sender-settings) メール送信要求とメール送信バッチの共通設定 + 共通設定では、以下のとおり設定する。 * [テーブルスキーマ](../../component/libraries/libraries-mail.md#mail-common-settings-table-schema) * [コード値とメッセージ](../../component/libraries/libraries-mail.md#mail-common-settings-mail-config) テーブルスキーマ + 次のクラスの設定をコンポーネント定義に追加する。 設定項目の詳細はリンク先のJavadocを参照。 @@ -211,6 +213,7 @@ > sendProcessIdColumnNameプロパティについては [メール送信をマルチプロセス化する](../../component/libraries/libraries-mail.md#mail-mail-multi-process) を参照すること。 コード値とメッセージ + メール送信に使用するコード値、メッセージID、障害コードを設定する。 MailConfig の設定をコンポーネント定義に追加する。 設定項目の詳細は、 MailConfigのJavadoc を参照。 @@ -249,6 +252,7 @@ MailConfig の設定をコンポーネント定義に追加する。 ``` メール送信要求の設定 + 以下のクラスをコンポーネント定義に追加する。 設定項目の詳細はリンク先のJavadocを参照。 @@ -263,6 +267,7 @@ MailRequester は、 設定例を以下に示す。 ポイント + * MailRequester は名前でルックアップされるため、 コンポーネント名に `mailRequester` と指定する。 @@ -313,6 +318,7 @@ MailRequester は、 詳しくは [テンプレートを使った定型メールを送信できる。](../../component/libraries/libraries-mail.md#mail-template) を参照。 メール送信バッチの設定 + メール送信バッチが使用するSMTPサーバへの接続情報を設定する。 MailSessionConfig をコンポーネント定義に追加する。 設定項目の詳細は、リンク先のJavadocを参照。 @@ -391,6 +397,7 @@ MailSender は、 [常駐バッチ](../../processing-pattern/nablarch-batch/nabl これにより、メール送信成功時にはステータスが確実に送信済みとなっているため、二重送信を防止できる。 メール送信の処理の流れ + ![mail_sender_flow.png](../../../knowledge/assets/libraries-mail/mail_sender_flow.png) > **Important:** @@ -408,6 +415,7 @@ MailSender は、 [常駐バッチ](../../processing-pattern/nablarch-batch/nabl 実行方法の詳細については、 [アプリケーションを起動する](../../component/handlers/handlers-main.md#main-run-application) を参照。 ポイント + * requestPathオプションで MailSender を指定する。 ```bash @@ -418,6 +426,7 @@ java nablarch.fw.launcher.Main \ ``` 未送信のデータを抽出する際の条件 + MailSender は、 メール送信要求テーブルから未送信のデータを抽出し、メールを送信する。 未送信のデータを抽出する際の条件は、次の2つから選択可能となっている。 @@ -436,6 +445,7 @@ MailSender は、 以下に実行例を示す。 ポイント + * `mailSendPatternId` という名前のオプションでメール送信パターンIDを指定する。 ```bash @@ -500,9 +510,12 @@ MailSender は、外部からの入力データ(アドレスやヘッダ)に起 * プログラミング言語の標準APIを使用してメールを送信する。Javaの場合は JavaMail API(外部サイト、英語) を使用する。 メールヘッダは固定値を使用する。外部からの入力値を使用しない。 + これについては、プロジェクトで対応する。 固定値にできない場合は、改行コードを変換するか、取り除く対応をプロジェクトで行う。 + プログラミング言語の標準APIを使用してメールを送信する。Javaの場合は JavaMail API(外部サイト、英語) を使用する。 + 本機能では JavaMail API(外部サイト、英語) を使用している。 しかし、 JavaMail API(外部サイト、英語) を使用しても、一部のメールヘッダの項目に改行コードが含まれていてもメール送信可能な項目がある。 そのため、保険的対策として、これらの項目に対して改行コードが含まれている場合にはメール送信を実施しないチェック機能を設けている。 @@ -543,6 +556,7 @@ MailSender は、 その場合の設定例を以下に示す。 ポイント + * トランザクションマネージャとメール送信要求IDの採番で指定するトランザクション名を同じにする。 ```xml diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-message.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-message.md index 931205185..f0c0ebc2e 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-message.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-message.md @@ -89,9 +89,13 @@ (よくある、「そのアプリケーションで使っているとは思ってませんでした」による、障害を未然に防ぐことができる) 例 + コンシューマ向けアプリケーション + consumer/main/resources/messages.properties + 社員向けアプリケーション + intra/main/resources/messages.properties ### プロパティファイルにメッセージを定義する @@ -102,6 +106,7 @@ intra/main/resources/messages.properties なお、NablarchはJava6以上を想定しているため、 **UTF-8** で作成すればよくユニコード変換(native2ascii)は必要ない。 プロパティファイルの例 + ```properties label.user.register.title=ユーザ登録画面 errors.login.alreadyExist=入力されたログインIDは既に登録されています。別のログインIDを入力してください。 @@ -125,6 +130,7 @@ success.update.project=プロジェクトの更新が完了しました。 もし、 ThreadContext#getLanguage からロケールが取得できない場合は Locale.getDefault() が使用される。 PropertiesStringResourceLoaderへの言語設定 + サポートする言語として、 `en` 、 `zh` 、 `de` を設定する場合の例を示す。 ```xml @@ -162,7 +168,9 @@ PropertiesStringResourceLoaderへの言語設定 ``` + 言語ごとのプロパティファイルの作成 + 上記の PropertiesStringResourceLoader に設定したサポート言語に対応するプロパティファイルの作成例を示す。 PropertiesStringResourceLoader に設定した言語に対応するプロパティファイルを作成する。 @@ -186,10 +194,13 @@ main/resources/messages.properties # デフォルトの言語に対応し MessageUtil から取得した Message を元に業務例外( ApplicationException )を生成し送出する。 プロパティファイル + ```properties errors.login.alreadyExist=入力されたログインIDは既に登録されています。別のログインIDを入力してください。 ``` + 実装例 + ```java Message message = MessageUtil.createMessage(MessageLevel.ERROR, "errors.login.alreadyExist"); @@ -205,26 +216,35 @@ java.text.MessageFormat を使用せずに Map のキー値を元に値を埋め 埋め込み文字を使用する場合には、メッセージにパターン文字を使用し、メッセージ取得時に埋め込み文字を指定する。 埋め込み文字に Map 以外を使用した場合 + プロパティファイル + java.text.MessageFormat の仕様に従い、メッセージを定義する。 ```properties success.upload.project={0}件のプロジェクトを登録しました。 ``` + 実装例 + projects.size() が **5** を返した場合、取得されるメッセージは「5件のプロジェクトを登録しました。」となる。 ```java MessageUtil.createMessage(MessageLevel.INFO, "success.upload.project", projects.size()); ``` + 埋め込み文字に Map のみを使用した場合 + プロパティファイル + 埋め込み文字部分には、 Map のキー名を `{` 、 `}` で囲んで定義する。 ```properties success.upload.project={projectCount}件のプロジェクトを登録しました。 ``` + 実装例 + メッセージ取得時に指定する埋め込み文字に Map を指定する。 projects.size() が **5** を返した場合、取得されるメッセージは「5件のプロジェクトを登録しました。」となる。 @@ -250,16 +270,21 @@ MessageUtil.createMessage(MessageLevel.INFO, "success.upload.project", options); message タグの詳細な使用方法は、 [メッセージを出力する](../../component/libraries/libraries-tag.md#tag-write-message) を参照。 プロパティファイル + ```properties login.title=ログイン ``` + JSP + ```jsp
``` + 画面表示結果 + プロパティファイルに定義したメッセージが固定文言として表示される。 ![jsp_title.png](../../../knowledge/assets/libraries-message/jsp_title.png) @@ -279,6 +304,7 @@ JSP > このため、 [errorsタグを使用したメッセージレベルに応じたスタイル切り替え](../../component/libraries/libraries-message.md#message-level-with-tag) を使用するのではなく以下の実装方法を推奨する。 > サーバサイド + > サーバサイドでメッセージ文字列を構築し、リクエストスコープに設定する。 > メッセージを生成する際にはメッセージレベルが必須なため、INFOレベルを指定すれば良い。 @@ -286,7 +312,9 @@ JSP > context.setRequestScopedVar("message", > MessageUtil.createMessage(MessageLevel.INFO, "login.message").formatMessage()); > ``` + > View + > View(JSP等)では、リクエストスコープに設定したメッセージを出力する。 > JSPを使用する場合は、 [write](../../component/libraries/libraries-tag-reference.md#tag-write-tag) タグを使用してリクエストスコープに設定したメッセージを出力する。 @@ -297,6 +325,7 @@ JSP > ``` errorsタグを使用したメッセージレベルに応じたスタイル切り替え例 + メッセージレベルは、 INFO 、 WARN 、 ERROR の3種類があり、 MessageLevel に定義されている。 @@ -314,12 +343,15 @@ nablarch_error > 全て ERROR レベルとなる。 プロパティファイル + ```properties info=インフォメーション warn=ワーニング error=エラー ``` + スタイルシート + メッセージレベルに対応したスタイルを定義する。 ```css @@ -335,7 +367,9 @@ error=エラー color: #ff0000; } ``` + action class + errors タグで出力するメッセージは、 WebUtil.notifyMessages を使ってリクエストスコープに格納する。 ```java @@ -343,13 +377,17 @@ WebUtil.notifyMessages(context, MessageUtil.createMessage(MessageLevel.INFO, "in WebUtil.notifyMessages(context, MessageUtil.createMessage(MessageLevel.WARN, "warn")); WebUtil.notifyMessages(context, MessageUtil.createMessage(MessageLevel.ERROR, "error")); ``` + JSP + errors タグを使用して、 WebUtil に格納したメッセージを画面表示する。 ```jsp ``` + 画面表示結果 + メッセージレベルに応じてスタイルが切り替わっていることがわかる。 ![message_level.png](../../../knowledge/assets/libraries-message/message_level.png) @@ -402,6 +440,7 @@ PropertiesStringResourceLoader には、ファイル名やディレクトリの 以下に例を示す。 MessageFormatterの実装クラス + ```java package sample; @@ -415,7 +454,9 @@ public class SampleMessageFormatter implements MessageFormatter { } } ``` + コンポーネント設定ファイル + コンポーネント名を `messageFormatter` として、 MessageFormatter の実装クラスを設定する。 ```xml @@ -426,7 +467,10 @@ public class SampleMessageFormatter implements MessageFormatter { なお、 MessageFormatter の実装としては以下のクラスを提供している。 BasicMessageFormatter: + [埋め込み文字の仕様](../../component/libraries/libraries-message.md#message-format-spec) に従いメッセージをフォーマットする。 MessageFormatter の実装クラスがコンポーネント定義されていない場合は本クラスが使用される。 + JavaMessageFormatBaseMessageFormatter: + MessageFormat を使用してメッセージをフォーマットする。 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-messaging-log.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-messaging-log.md index 211c2f100..d19d88e47 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-messaging-log.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-messaging-log.md @@ -24,6 +24,7 @@ 上記出力方針に対するログ出力の設定例を下記に示す。 log.propertiesの設定例 + ```properties writerNames=appLog @@ -47,7 +48,9 @@ loggers.MESSAGING.nameRegex=MESSAGING loggers.MESSAGING.level=INFO loggers.MESSAGING.writerNames=appLog ``` + app-log.propertiesの設定例 + ```properties # MessagingLogFormatter #messagingLogFormatter.className= @@ -93,10 +96,14 @@ messagingLogFormatter.httpReceivedMessageFormat=@@@@ HTTP RECEIVED MESSAGE @@@@\ メッセージングログの設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + messagingLogFormatter.className + MessagingLogFormatter を実装したクラス。 差し替える場合に指定する。 + messagingLogFormatter.maskingPatterns + メッセージ本文のマスク対象文字列を正規表現で指定する。 正規表現で指定された最初のキャプチャ部分(括弧で囲まれた部分)がマスク対象となる。 @@ -106,12 +113,17 @@ messagingLogFormatter.maskingPatterns 複数指定する場合はカンマ区切り。 指定した正規表現は大文字小文字を区別しない。 + messagingLogFormatter.maskingChar + マスクに使用する文字。デフォルトは’*’。 + messagingLogFormatter.sentMessageFormat + MOM送信メッセージのログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $threadName$ $messageId$ @@ -129,7 +141,9 @@ $messageBody$ [1] $messageBodyHex$ [1] $messageBodyLength$ + デフォルトのフォーマット + ```bash @@@@ SENT MESSAGE @@@@ \n\tthread_name = [$threadName$] @@ -140,10 +154,13 @@ $messageBodyLength$ \n\ttime_to_live = [$timeToLive$] \n\tmessage_body = [$messageBody$] ``` + messagingLogFormatter.receivedMessageFormat + MOM受信メッセージのログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $threadName$ $messageId$ @@ -161,7 +178,9 @@ $messageBody$ [1] $messageBodyHex$ [1] $messageBodyLength$ + デフォルトのフォーマット + ```bash @@@@ RECEIVED MESSAGE @@@@ \n\tthread_name = [$threadName$] @@ -171,10 +190,13 @@ $messageBodyLength$ \n\treply_to = [$replyTo$] \n\tmessage_body = [$messageBody$] ``` + messagingLogFormatter.httpSentMessageFormat + HTTP送信メッセージのログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $threadName$ $messageId$ @@ -190,7 +212,9 @@ $messageBodyHex$ [1] $messageBodyLength$ $messageHeader$ + デフォルトのフォーマット + ```bash @@@@ HTTP SENT MESSAGE @@@@ \n\tthread_name = [$threadName$] @@ -200,10 +224,13 @@ $messageHeader$ \n\tmessage_header = [$messageHeader$] \n\tmessage_body = [$messageBody$] ``` + messagingLogFormatter.httpReceivedMessageFormat + HTTP受信メッセージのログ出力に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $threadName$ $messageId$ @@ -219,7 +246,9 @@ $messageBodyHex$ [1] $messageBodyLength$ $messageHeader$ + デフォルトのフォーマット + ```bash @@@@ HTTP RECEIVED MESSAGE @@@@ \n\tthread_name = [$threadName$] @@ -234,6 +263,7 @@ $messageHeader$ * **$messageBodyHex$:** $messageBody$の内容をヘキサダンプして出力する。 記述例 + ```properties messagingLogFormatter.className=nablarch.fw.messaging.logging.MessagingLogFormatter messagingLogFormatter.maskingChar=# @@ -258,13 +288,17 @@ MessagingJsonLogFormatter を使用する。 設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + MessagingJsonLogFormatter を用いる際に 指定するプロパティは以下の通り。 messagingLogFormatter.className `必須` + JSON形式でログを出力する場合、 MessagingJsonLogFormatter を指定する。 + messagingLogFormatter.maskingPatterns + メッセージ本文のマスク対象文字列を正規表現で指定する。 正規表現で指定された最初のキャプチャ部分(括弧で囲まれた部分)がマスク対象となる。 @@ -274,12 +308,17 @@ messagingLogFormatter.maskingPatterns 複数指定する場合はカンマ区切り。 指定した正規表現は大文字小文字を区別しない。 + messagingLogFormatter.maskingChar + マスクに使用する文字。デフォルトは’*’。 + messagingLogFormatter.sentMessageTargets + MOM送信メッセージログの出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + label `デフォルト` threadName `デフォルト` @@ -299,10 +338,13 @@ messageBody [2] `デフォルト` messageBodyHex [2] messageBodyLength + messagingLogFormatter.receivedMessageTargets + MOM受信メッセージログの出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + label `デフォルト` threadName `デフォルト` @@ -322,10 +364,13 @@ messageBody [2] `デフォルト` messageBodyHex [2] messageBodyLength + messagingLogFormatter.httpSentMessageTargets + HTTP送信メッセージログの出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + label `デフォルト` threadName `デフォルト` @@ -343,10 +388,13 @@ messageBodyHex [2] messageBodyLength messageHeader `デフォルト` + messagingLogFormatter.httpReceivedMessageTargets + HTTP受信メッセージログの出力項目。カンマ区切りで指定する。 指定可能な出力項目およびデフォルトの出力項目 + label `デフォルト` threadName `デフォルト` @@ -364,19 +412,29 @@ messageBodyHex [2] messageBodyLength messageHeader `デフォルト` + messagingLogFormatter.sentMessageLabel + MOM送信メッセージログのlabelに出力する値。 デフォルトは `"SENT MESSAGE"`。 + messagingLogFormatter.receivedMessageLabel + MOM受信メッセージログのlabelに出力する値。 デフォルトは `"RECEIVED MESSAGE"`。 + messagingLogFormatter.httpSentMessageLabel + HTTP送信メッセージログのlabelに出力する値。 デフォルトは `"HTTP SENT MESSAGE"`。 + messagingLogFormatter.httpReceivedMessageLabel + HTTP受信メッセージログのlabelに出力する値。 デフォルトは `"HTTP RECEIVED MESSAGE"`。 + messagingLogFormatter.structuredMessagePrefix + フォーマット後のメッセージ文字列が JSON 形式に整形されていることを識別できるようにするために、メッセージの先頭に付与するマーカー文字列。 メッセージの先頭にあるマーカー文字列が JsonLogFormatter に設定しているマーカー文字列と一致する場合、 JsonLogFormatter はメッセージを JSON データとして処理する。 デフォルトは `"$JSON$"` となる。 @@ -386,6 +444,7 @@ messagingLogFormatter.structuredMessagePrefix * **messageBodyHex:** messageBodyの内容をヘキサダンプして出力する。 記述例 + ```properties messagingLogFormatter.className=nablarch.fw.messaging.logging.MessagingJsonLogFormatter messagingLogFormatter.structuredMessagePrefix=$JSON$ diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-mom-system-messaging.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-mom-system-messaging.md index 27155bc40..f4909abcf 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-mom-system-messaging.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-mom-system-messaging.md @@ -109,6 +109,7 @@ MOMメッセージングでは、以下のクラスをコンポーネント定 以下に設定例を示す。 ポイント + * データリーダのコンポーネント名には `dataReader` を指定する。 * MessageReader は FwHeaderReader の @@ -135,6 +136,7 @@ MOMメッセージングでは、以下のクラスをコンポーネント定 ![mom_system_messaging-async_message_send.png](../../../knowledge/assets/libraries-mom-system-messaging/mom_system_messaging-async_message_send.png) 送信電文に設定する [共通プロトコルヘッダ](../../component/libraries/libraries-mom-system-messaging.md#mom-system-messaging-common-protocol-header) の内容 + 設定する必要があるのは、基本的に送信宛先ヘッダのみである。 設定不要(送信後に採番される) @@ -181,12 +183,17 @@ AsyncMessageSendAction プロジェクト情報を送信する場合の実装例を以下に示す。 実装例 + 送信電文のデータを保持する一時テーブル + ポイント + * 主キーは、電文を一意に識別するためのIDを格納するカラムとする。 * テーブルの属性情報には、送信する電文の各項目に対応するカラムを定義する。 * 各プロジェクトの方式に合わせて共通項目(更新ユーザIDや更新日時など)を定義する。 + INS_PROJECT_SEND_MESSAGE + | 送信電文連番(PK) | SEND_MESSAGE_SEQUENCE | |---|---| | プロジェクト名 | PROJECT_NAME | @@ -196,10 +203,15 @@ INS_PROJECT_SEND_MESSAGE | ステータス | STATUS | | 更新ユーザID | UPDATED_USER_ID | | 更新日時 | UPDATED_DATE | + フォーマット定義ファイル + ポイント + * ファイル名は `<送信電文のリクエストID>_SEND.fmt` とする。 + ProjectInsertMessage_SEND.fmt + ```bash file-type: "Fixed" # 固定長 text-encoding: "MS932" # 文字列型フィールドの文字エンコーディング @@ -208,15 +220,20 @@ record-length: 2120 # 各レコードの長さ [userData] 項目定義は省略 ``` + SQLファイル + ポイント + * ファイル名は `<送信電文のリクエストID>.sql` とする。 * SQL_IDは次の通りとする。 * `SELECT_SEND_DATA`: ステータスが未送信のデータを取得するためのSELECT文 * `UPDATE_NORMAL_END`: ステータスを処理済みに更新するためのUPDATE文 * `UPDATE_ABNORMAL_END`: ステータスを送信失敗に更新するためのUPDATE文 + ProjectInsertMessage.sql + ```bash SELECT_SEND_DATA = SELECT @@ -248,11 +265,16 @@ SET WHERE SEND_MESSAGE_SEQUENCE = :sendMessageSequence ``` + ステータス更新用のフォームクラス + ポイント + * このフォームクラスは、ステータス更新専用のクラスとなるため、 プロパティとして一時テーブルの属性を全て保持する必要はない。 + SendMessagingForm.java + ```java public class SendMessagingForm { @@ -270,15 +292,20 @@ public class SendMessagingForm { // コンストラクタとアクセッサは省略 } ``` + AsyncMessageSendActionの設定 + ポイント + * AsyncMessageSendAction を使用する場合は、送信先のキュー名やフォーマット定義ファイルの格納ディレクトリなどの設定が必要となる。 設定は、 AsyncMessageSendActionSettings をコンポーネント定義に追加することで行う。 設定項目については、リンク先のJavadocを参照。 + messaging-async-send-component-configuration.xml + ```xml @@ -295,13 +322,18 @@ messaging-async-send-component-configuration.xml
``` + AsyncMessageSendActionの適用 + ポイント + * AsyncMessageSendAction を [Nablarchバッチアプリケーション](../../processing-pattern/nablarch-batch/nablarch-batch-nablarch-batch.md#nablarch-batch) で動作させるためには、 [リクエストディスパッチハンドラ](../../component/handlers/handlers-request-path-java-package-mapping.md#request-path-java-package-mapping) のコンポーネント定義で AsyncMessageSendAction を指定する。 + messaging-async-send-component-configuration.xml + ```xml _SEND.fmt` * 受信用: `<電文のリクエストID>_RECEIVE.fmt` * レコードタイプ名は `data` 固定である。 + ProjectInsertMessage_SEND.fmt + ```bash file-type: "Fixed" # 固定長 text-encoding: "MS932" # 文字列型フィールドの文字エンコーディング @@ -379,7 +419,9 @@ record-separator: "\r\n" # 改行コード [data] 項目定義は省略 ``` + ProjectInsertMessage_RECEIVE.fmt + ```bash file-type: "Fixed" # 固定長 text-encoding: "MS932" # 文字列型フィールドの文字エンコーディング @@ -389,14 +431,19 @@ record-separator: "\r\n" # 改行コード [data] 項目定義は省略 ``` + MessageSenderを使った送受信処理 + ポイント + * 要求電文は、 SyncMessage で作成する。 * メッセージ送信には、 MessageSender#sendSync を使用する。 使い方については、リンク先のJavadocを参照。 + SendProjectInsertMessageAction.java + ```java public Result handle(SqlRow inputData, ExecutionContext ctx) { @@ -418,8 +465,11 @@ public Result handle(SqlRow inputData, ExecutionContext ctx) { return new Success(); } ``` + MessageSenderの設定 + ポイント + * MessageSender を使用する場合は、 送受信先のキュー名やフォーマット定義ファイルの格納ディレクトリなどの設定が必要となる。 設定は、 [依存値を設定する](../../component/libraries/libraries-repository.md#repository-environment-configuration) により行う。 @@ -429,7 +479,9 @@ MessageSenderの設定 * 送受信する電文の変換処理を変更する場合は、コンポーネント設定ファイルに SyncMessageConvertor を継承したクラスを定義して、コンポーネントの名前を `messageSender.DEFAULT.messageConvertorName` に指定することで変更できる。 詳細については、 [フレームワーク制御ヘッダの読み書きを変更する(同期応答メッセージ送信の場合)](../../component/libraries/libraries-mom-system-messaging.md#mom-system-messaging-change-fw-header-sync-ex) を参照。 + messaging.properties + ```properties messageSender.DEFAULT.messagingProviderName=defaultMessagingProvider messageSender.DEFAULT.destination=TEST.REQUEST @@ -438,7 +490,9 @@ messageSender.DEFAULT.retryCount=10 messageSender.DEFAULT.formatDir=format messageSender.DEFAULT.headerFormatName=HEADER ``` + コンポーネント設定ファイル + ```xml @@ -451,6 +505,7 @@ messageSender.DEFAULT.headerFormatName=HEADER ![mom_system_messaging-async_message_receive.png](../../../knowledge/assets/libraries-mom-system-messaging/mom_system_messaging-async_message_receive.png) 外部システムが作成する受信電文の [共通プロトコルヘッダ](../../component/libraries/libraries-mom-system-messaging.md#mom-system-messaging-common-protocol-header) の内容 + 設定不要(送信後に採番される) 設定不要 @@ -483,14 +538,19 @@ AsyncMessageReceiveAction プロジェクト情報を受信する場合の実装例を以下に示す。 実装例 + 電文を登録するための一時テーブル + ポイント + * 受信した電文は、電文の種類毎に専用の一時テーブルに保存する。 * 主キーは、電文を一意に識別するためのIDを格納するカラムとする。 このカラムに格納する値は、 [サロゲートキーの採番](../../component/libraries/libraries-generator.md#generator) を用いてフレームワークで採番を行う。 * テーブルの属性情報には、受信した電文の各項目に対応するカラムを定義する。 * 各プロジェクトの方式に合わせて共通項目(登録ユーザIDや登録日時など)を定義する。 + INS_PROJECT_RECEIVE_MESSAGE + | 受信メッセージ連番(PK) | RECEIVED_MESSAGE_SEQUENCE | |---|---| | プロジェクト名 | PROJECT_NAME | @@ -500,10 +560,15 @@ INS_PROJECT_RECEIVE_MESSAGE | ステータス | STATUS | | 登録ユーザID | INSERT_USER_ID | | 登録日時 | INSERT_DATE | + フォーマット定義ファイル + ポイント + * ファイル名は `<受信電文のリクエストID>_RECEIVE.fmt` とする。 + ProjectInsertMessage_RECEIVE.fmt + ```bash file-type: "Fixed" # 固定長 text-encoding: "MS932" # 文字列型フィールドの文字エンコーディング @@ -512,11 +577,16 @@ record-length: 2120 # 各レコードの長さ [userData] 項目定義は省略 ``` + SQLファイル + ポイント + * ファイル名は `<受信電文のリクエストID>.sql` とする。 * SQL_IDは `INSERT_MESSAGE` とする。 + ProjectInsertMessage.sql + ```bash INSERT_MESSAGE = INSERT INTO INS_PROJECT_RECEIVE_MESSAGE ( @@ -526,15 +596,20 @@ INSERT INTO INS_PROJECT_RECEIVE_MESSAGE ( PROJECT_CLASS, 以下省略 ``` + 電文を登録する際に使用するフォームクラス + ポイント + * クラス名は `<受信電文のリクエストID>Form` とする。 * String、RequestMessage の2つの引数を持つコンストラクタを定義する。それぞれのパラメータの意味は以下の通り。 * String -> 受信電文連番 * RequestMessage -> 受信電文 + ProjectInsertMessageForm.java + ```java public class ProjectInsertMessageForm { @@ -560,15 +635,20 @@ public class ProjectInsertMessageForm { // アクセッサは省略 } ``` + AsyncMessageReceiveActionの設定 + ポイント + * AsyncMessageReceiveAction を使用する場合は、フォーマット定義ファイルやSQLファイルの配置場所などの設定が必要となる。 設定は、 AsyncMessageReceiveActionSettings をコンポーネント定義に追加することで行う。 設定項目については、リンク先のJavadocを参照。 + messaging-async-receive-component-configuration.xml + ```xml @@ -584,13 +664,18 @@ messaging-async-receive-component-configuration.xml ``` + AsyncMessageReceiveActionの適用 + ポイント + * AsyncMessageReceiveAction を [MOMによるメッセージング](../../processing-pattern/mom-messaging/mom-messaging-mom.md#mom-messaging) で動作させるためには、 [リクエストディスパッチハンドラ](../../component/handlers/handlers-request-path-java-package-mapping.md#request-path-java-package-mapping) のコンポーネント定義で AsyncMessageReceiveAction を指定する。 + messaging-async-receive-component-configuration.xml + ```xml _RECEIVE.fmt` * 送信用: `<電文のリクエストID>_SEND.fmt` + ProjectInsertMessage_RECEIVE.fmt + ```bash file-type: "Fixed" # 固定長 text-encoding: "MS932" # 文字列型フィールドの文字エンコーディング @@ -649,7 +739,9 @@ record-separator: "\r\n" # 改行コード [data] 項目定義は省略 ``` + ProjectInsertMessage_SEND.fmt + ```bash file-type: "Fixed" # 固定長 text-encoding: "MS932" # 文字列型フィールドの文字エンコーディング @@ -659,8 +751,11 @@ record-separator: "\r\n" # 改行コード [data] 項目定義は省略 ``` + 電文受信時とエラー発生時の処理(アクションクラス) + ポイント + * MessagingAction を継承し、 以下のメソッドをオーバーライドする。 @@ -668,7 +763,9 @@ record-separator: "\r\n" # 改行コード * MessagingAction#onError * 応答電文は、 RequestMessage#reply で作成する。 * 要求電文と応答電文の内容を保持するため、それぞれに対応したフォームクラスを作成する。 + ProjectInsertMessageAction.java + ```java public class ProjectInsertMessageAction extends MessagingAction { @@ -723,6 +820,7 @@ public class ProjectInsertMessageAction extends MessagingAction { 以下に、送受信の種類ごとに対応方法を示す。 応答不要メッセージ送信の場合 + フレームワーク制御ヘッダの書き込みは、以下のメソッドにより行っているので、 以下のメソッドをオーバーライドして対応すればよい。 @@ -730,6 +828,7 @@ public class ProjectInsertMessageAction extends MessagingAction { * AsyncMessageSendAction#createHeaderRecord 同期応答メッセージ送信の場合 + MessageSender では、送受信する電文の変換処理を変更できるように、 変換処理を SyncMessageConvertor に委譲しており、 このクラスがフレームワーク制御ヘッダを読み書きしている。 @@ -740,6 +839,7 @@ MessageSender の設定については、 MessageSenderSettings を参照。 応答不要メッセージ受信の場合 + フレームワーク制御ヘッダの読み込みは、 FwHeaderReader に設定された FwHeaderDefinition インタフェースを実装したクラスが行う。 @@ -750,7 +850,9 @@ FwHeaderDefinition インタフェースを実装したクラスが行う。 コンポーネント定義で FwHeaderReader#fwHeaderDefinition プロパティに指定すればよい。 + 同期応答メッセージ受信の場合 + フレームワーク制御ヘッダの読み込みは、 [応答不要メッセージ受信の場合](../../component/libraries/libraries-mom-system-messaging.md#mom-system-messaging-change-fw-header-async-receive) と同じである。 @@ -767,32 +869,41 @@ MOMメッセージングでは、送受信電文の内容を以下のデータ ![mom_system_messaging-data_model.png](../../../knowledge/assets/libraries-mom-system-messaging/mom_system_messaging-data_model.png) プロトコルヘッダ + 主にMOMによるメッセージ送受信処理において使用される情報を格納したヘッダ領域である。 プロトコルヘッダはMapインターフェースでアクセスすることが可能となっている。 共通プロトコルヘッダ + プロトコルヘッダのうち、フレームワークが使用する以下のヘッダについては、特定のキー名でアクセスできる。 キー名をカッコで示す。 メッセージID(MessageId) + 電文ごとにMOMが採番する文字列 MOMが採番した値 送信側のMOMが発番した値 + 関連メッセージID(CorrelationId) + 電文が関連する電文のメッセージID 要求電文のメッセージID 応答再送を要求する要求電文のメッセージID + 送信宛先(Destination) + 電文の送信宛先を表す論理名 送信キューの論理名 受信キューの論理名 + 応答宛先(ReplyTo) + この電文に応答を送信する際に使用する宛先を表す論理名 同期応答の場合は応答受信キューの論理名。 @@ -800,7 +911,9 @@ MOMが採番した値 同期応答の場合は応答宛先キューの論理名。 応答不要の場合は通常設定なし + 有効期間(TimeToLive) + 送信処理開始時点を起点とする電文の有効期間(msec) 送信電文の有効期間 @@ -813,6 +926,7 @@ MOMが採番した値 > 例えば、JMSメッセージングプロバイダの場合、全てのJMSヘッダ、JMS拡張ヘッダおよび任意属性は、個別プロトコルヘッダとして扱われる。 メッセージボディ + プロトコルヘッダを除いた電文のデータ領域をメッセージボディと呼ぶ。 MOMに依存する MessagingProvider は、 原則としてプロトコルヘッダ領域のみを使用する。 @@ -822,12 +936,14 @@ MOMに依存する MessagingProvider は、 これにより、電文の内容をフィールド名をキーとするMap形式で読み書き可能である。 フレームワーク制御ヘッダ + 本フレームワークが提供する機能の中には、電文中に特定の制御項目が定義されていることを前提として設計されているものが多く存在する。 そのような制御項目のことを `フレームワーク制御ヘッダ` とよぶ。 フレームワーク制御ヘッダとそれを使用するハンドラの対応は以下のとおり。 リクエストID + この電文を受信したアプリケーションが実行すべき業務処理を識別するためのID。 このヘッダを使用する主要なハンドラ: @@ -836,19 +952,25 @@ MOMに依存する MessagingProvider は、 [再送電文制御ハンドラ](../../component/handlers/handlers-message-resend-handler.md#message-resend-handler) [認可チェックハンドラ](../../component/handlers/handlers-permission-check-handler.md#permission-check-handler) [サービス提供可否チェックハンドラ](../../component/handlers/handlers-ServiceAvailabilityCheckHandler.md#serviceavailabilitycheckhandler) + ユーザID + この電文の実行権限を表す文字列 このヘッダを使用する主要なハンドラ: [認可チェックハンドラ](../../component/handlers/handlers-permission-check-handler.md#permission-check-handler) + 再送要求フラグ + 再送要求電文の送信時に設定されるフラグ このヘッダを使用する主要なハンドラ: [再送電文制御ハンドラ](../../component/handlers/handlers-message-resend-handler.md#message-resend-handler) + ステータスコード + 要求電文に対する処理結果を表すコード値 このヘッダを使用する主要なハンドラ: diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-multi-format-example.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-multi-format-example.md index 9cac41b8f..291e9f9b5 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-multi-format-example.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-multi-format-example.md @@ -1,8 +1,7 @@ - - ## Fixed(固定長)のマルチフォーマット定義のサンプル集 単一のフィールドでフォーマットを識別する例 + 単一フィールドが条件の場合、そのフィールド値が各フォーマットに定義した条件と一致した場合に、そのレコード定義で処理される。 このサンプルでは、以下のルールでレコードが識別される。 @@ -32,7 +31,9 @@ dataKbn = "2" 1 dataKbn X(1) 2 data X(39) ``` + 複数のフィールドでフォーマットを識別する例 + 複数のフィールドでレコードを識別する場合、全ての条件を満たした場合に、そのレコード定義で処理される。 このサンプルでは、以下のルールでレコードが識別される。 @@ -67,7 +68,9 @@ type = "02" 10 type X(2) 13 data X(28) ``` + レコード毎に識別項目が異なる場合の例 + レコード毎に識別に使用する項目が異なる場合、レコード識別フィールドには識別に使用する全てのフィールドを定義する。 個別のレコードの条件定義部には、そのレコードを識別する条件を定義する。 @@ -116,6 +119,7 @@ type = "02" Variable(可変長)データのマルチフォーマットの定義方法について説明する。 単一のフィールドでフォーマットを識別する例 + 単一フィールドが条件の場合、そのフィールド値が各フォーマットに定義した条件と一致した場合に、そのレコード定義で処理される。 このサンプルでは、以下のルールでレコードが識別される。 @@ -145,7 +149,9 @@ dataKbn = "2" 1 dataKbn X 2 data X ``` + 複数のフィールドでフォーマットを識別する例 + 複数のフィールドでレコードを識別する場合、全ての条件を満たした場合に、そのレコード定義で処理される。 このサンプルでは、以下のルールでレコードが識別される。 @@ -180,7 +186,9 @@ type = "02" 3 type X 4 data X ``` + レコード毎に識別項目が異なる場合の例 + レコード毎に識別に使用する項目が異なる場合、レコード識別フィールドには識別に使用する全てのフィールドを定義する。 個別のレコードの条件定義部には、そのレコードを識別する条件を定義する。 @@ -225,6 +233,7 @@ type = "02" ``` タイトルレコードを使用した場合の例 + タイトルレコードあり の可変長ファイルの場合、タイトルレコードに関してはレコード識別条件を定義する必要が無い。 タイトルレコード以外のフォーマットがシングルフォーマットの場合には、以下の例のようにレコード識別( `Classifier` )の定義は不要となる。 diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-nablarch-validation.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-nablarch-validation.md index 81eca6684..491e505eb 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-nablarch-validation.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-nablarch-validation.md @@ -100,6 +100,7 @@ Nablarchが提供しているバリデータ及びコンバータについては > バリデータやコンバータの設定がない場合、バリデーション機能は使用できないので必ず設定すること。 設定例 + * ValidationManager を **validationManager** という名前でコンポーネント定義する。 * ValidationManager#convertors に使用するコンバータを列挙する。 * ValidationManager#validators に使用するバリデータを列挙する。 @@ -134,6 +135,7 @@ Nablarchが提供しているバリデータ及びコンバータについては > 後述する [ドメインバリデーション](../../component/libraries/libraries-nablarch-validation.md#nablarch-validation-domain-validation) を使うことを推奨する。 実装例 + [Nablarchで提供しているバリデータとコンバータ](../../component/libraries/libraries-nablarch-validation.md#nablarch-validation-validator-convertor) を参照しアノテーションを設定する。 この例では、 userName は入力が必須で、全角文字の最大10文字が許容される。 @@ -168,6 +170,7 @@ public class SampleForm { ドメインバリデーションを使うための設定や実装例を示す。 ドメインごとのバリデーションルールを定義したEnumの作成 + ドメインバリデーションを使用するには、まずドメインごとのバリデーションルールを持つEnum(ドメインEnum)を作成する。 このEnumは、必ず DomainDefinition インタフェースを実装すること。 @@ -197,7 +200,9 @@ public enum SampleDomain implements DomainDefinition { } } ``` + ドメインを表すアノテーションの作成 + ドメインを表すアノテーションを作成する。 value 属性には、上記で作成したドメインEnumを指定できるようにする。 @@ -210,7 +215,9 @@ public @interface Domain { SampleDomain value(); } ``` + バリデーション対象のBeanにドメインを設定 + 上記で作成したドメインを表すアノテーションを設定することで、ドメインバリデーションが行われる。 この例では、 userName に対して SampleDomain.NAME に設定したバリデーションが実行される。 @@ -222,7 +229,9 @@ public void setUserName(String userName) { this.userName = userName; } ``` + ドメインバリデーションを有効にするための設定 + ドメインバリデーションを有効にするためには、以下の設定が必要となる。 * DomainValidationHelper の設定 @@ -233,6 +242,7 @@ public void setUserName(String userName) { 以下に例を示す。 DomainValidationHelper の設定 + * domainAnnotationプロパティ にドメインを表すアノテーションの完全修飾名(FQCN)を設定する。 @@ -244,7 +254,9 @@ DomainValidationHelper の設定 ``` + DomainValidator の設定 + * domainValidationHelperプロパティ に、上記で設定した DomainValidationHelper を設定する。 * validatorsプロパティ @@ -266,7 +278,9 @@ DomainValidator の設定 ``` + ValidationManager の設定 + * domainValidationHelperプロパティ に、上記で設定した DomainValidationHelper を設定する。 * validatorsプロパティ @@ -283,7 +297,9 @@ ValidationManager の設定 ``` + 初期化コンポーネントの設定 + 上記で設定した、 DomainValidator と ValidationManager を初期化対象のリストに設定する。 @@ -299,7 +315,9 @@ ValidationManager を初期化対象のリストに設定する。 ``` + ドメインバリデーションに複数のバリデーションルールを設定した場合の挙動 + ドメインバリデーションにて1つの入力項目に複数のエラーが存在する場合、精査を1つ目のエラーで打ち切る。 ```java @@ -356,6 +374,7 @@ public class ChildForm extends ParentForm { バリデーションは、 ValidationUtil で提供されるメソッドを呼び出すことで実行できる。 実装例 + まず、入力値からBeanオブジェクトを生成するため、バリデーション対象のBeanにMapを引数に取るコンストラクタを実装する。 次にバリデーション対象のBeanにバリデーションを行うためのstaticメソッドを実装する。 @@ -428,6 +447,7 @@ SampleForm form = validationContext.createObject(); 特定の画面だけパターンを変えてバリデーションしたい場合に、個別にバリデーションを実行する。 実装例 + 明示的なバリデーションの実行は、Beanクラスの @ValidateFor アノテーションが設定されたメソッドから行う。 なお、明示的バリデーションの実行時に指定できるアノテーションは、 DirectCallableValidator を実装しているものに限定される。 (コンバータは指定できない。) @@ -468,6 +488,7 @@ public class SampleForm { [Bean Validation](../../component/libraries/libraries-bean-validation.md#bean-validation) とは完全修飾名が異なる(アノテーション名は同一)ので注意すること。 サロゲートペアを許容する + このバリデーションでは、デフォルトではサロゲートペアを許容しない。 (例え LiteralCharsetDef で明示的にサロゲートペアの文字を定義していても許容しない) @@ -488,6 +509,7 @@ public class SampleForm { このメソッドでまずは項目ごとのバリデーションを実施し、エラーが発生しなかった場合に複数項目を使用したバリデーションを実行する。 実装例 + この例では、mailAddressとconfirmMailAddressを使用した相関バリデーションを行っている。 相関バリデーションでエラーとなった場合は、ユーザに通知すべきメッセージを示すメッセージIDを明示的に ValidationContext に追加する。 @@ -604,6 +626,7 @@ public class SampleForm { メッセージに項目名を埋め込むには、 @PropertyName アノテーションを使用して、バリデーション対象の項目の項目名を指定する。 実装例 + メッセージには、項目名を埋め込むためのパターン文字を使用する。 項目名は、必ず先頭に指定されるので項目名を埋め込む箇所には、 **{0}** と指定する。 @@ -630,7 +653,9 @@ public class SampleForm { } } ``` + 生成されるメッセージ + 上記実装で、 username プロパティで必須エラーが発生すると、生成されるメッセージは **「名前を入力してください。」** となる。 ### 数値型への型変換 @@ -641,6 +666,7 @@ public class SampleForm { なお、数値型へ変換するためのコンバータが [使用するバリデータとコンバータを設定する](../../component/libraries/libraries-nablarch-validation.md#nablarch-validation-definition-validator-convertor) の手順に従い設定されていることが前提となる。 実装例 + この例では、setterに指定しているが、ドメインバリデーションを使用したドメインEnumへの指定を推奨する。 ```java @@ -678,6 +704,7 @@ public class SampleForm { 以下に手順を示す。 アノテーションの作成 + アノテーションは以下の条件を満たすこと。 * @Validation アノテーションを設定すること。 @@ -691,7 +718,9 @@ public class SampleForm { public @interface Sample { } ``` + バリデータの作成 + バリデータは、 Validator インタフェースを実装し、バリデーションロジックを実装する。 ```java @@ -706,7 +735,9 @@ public class SampleValidator implements Validator { } } ``` + 設定ファイルにバリデータの登録 + [使用するバリデータとコンバータを設定する](../../component/libraries/libraries-nablarch-validation.md#nablarch-validation-definition-validator-convertor) を参照。 ### プロジェクト固有のコンバータを追加したい @@ -719,6 +750,7 @@ public class SampleValidator implements Validator { 以下に手順を示す。 コンバータの作成 + コンバータは、 Convertor インタフェースを実装し、型変換ロジックなどを実装する。 ```java @@ -757,7 +789,9 @@ public class SampleConvertor implements Convertor { } } ``` + 設定ファイルにコンバータの登録 + [使用するバリデータとコンバータを設定する](../../component/libraries/libraries-nablarch-validation.md#nablarch-validation-definition-validator-convertor) を参照。 ### バリデーション対象のBeanオブジェクトの生成方法を変更したい diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-performance-log.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-performance-log.md index 62eaf595a..7be7064f6 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-performance-log.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-performance-log.md @@ -27,6 +27,7 @@ 上記出力方針に対するログ出力の設定例を下記に示す。 log.propertiesの設定例 + ```properties writerNames=appLog @@ -50,7 +51,9 @@ loggers.PER.nameRegex=PERFORMANCE loggers.PER.level=DEBUG loggers.PER.writerNames=appLog ``` + app-log.propertiesの設定例 + ```properties # PerformanceLogFormatter #performanceLogFormatter.className= @@ -107,13 +110,18 @@ PerformanceLogUtil.end(point, String.valueOf(searchResult.size())); パフォーマンスログの設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + performanceLogFormatter.className + PerformanceLogFormatter を実装したクラス。 差し替える場合に指定する。 + performanceLogFormatter.format + パフォーマンスログの個別項目のフォーマット。 フォーマットに指定可能なプレースホルダ + $point$ $result$ @@ -133,7 +141,9 @@ $startUsedMemory$ $endFreeMemory$ $endUsedMemory$ + デフォルトのフォーマット + ```bash \n\tpoint = [$point$] result = [$result$] \n\tstart_time = [$startTime$] end_time = [$endTime$] @@ -142,15 +152,21 @@ $endUsedMemory$ \n\tstart_free_memory = [$startFreeMemory$] start_used_memory = [$startUsedMemory$] \n\tend_free_memory = [$endFreeMemory$] end_used_memory = [$endUsedMemory$] ``` + performanceLogFormatter.datePattern + 開始日時と終了日時に使用する日時パターン。 パターンには、 SimpleDateFormat が規程している構文を指定する。 デフォルトは”yyyy-MM-dd HH:mm:ss.SSS”。 + performanceLogFormatter.targetPoints + 出力対象とするポイント名。 複数指定する場合はカンマ区切り。 パフォーマンスログは、誤設定による無駄な出力を防ぐため、この設定に基づき出力する。 + 記述例 + ```properties performanceLogFormatter.className=nablarch.core.log.app.PerformanceLogFormatter performanceLogFormatter.targetPoints=UserSearchAction#doUSERS00101 @@ -168,16 +184,21 @@ PerformanceJsonLogFormatter を使用する。 設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + PerformanceJsonLogFormatter を用いる際に 指定するプロパティは以下の通り。 performanceLogFormatter.className `必須` + JSON形式でログを出力する場合、 PerformanceJsonLogFormatter を指定する。 + performanceLogFormatter.targets + パフォーマンスログの出力項目。カンマ区切りで指定する。 指定可能な出力項目 + point result @@ -199,20 +220,28 @@ endFreeMemory endUsedMemory デフォルトは全ての出力項目が対象となる。 + performanceLogFormatter.datePattern + 開始日時と終了日時に使用する日時パターン。 パターンには、 SimpleDateFormat が規程している構文を指定する。 デフォルトは”yyyy-MM-dd HH:mm:ss.SSS”。 + performanceLogFormatter.targetPoints + 出力対象とするポイント名。 複数指定する場合はカンマ区切り。 パフォーマンスログは、誤設定による無駄な出力を防ぐため、この設定に基づき出力する。 + performanceLogFormatter.structuredMessagePrefix + フォーマット後のメッセージ文字列が JSON 形式に整形されていることを識別できるようにするために、メッセージの先頭に付与するマーカー文字列。 メッセージの先頭にあるマーカー文字列が JsonLogFormatter に設定しているマーカー文字列と一致する場合、 JsonLogFormatter はメッセージを JSON データとして処理する。 デフォルトは `"$JSON$"` となる。 変更する場合は、LogWriterの `structuredMessagePrefix` プロパティを使用して JsonLogFormatter にも同じ値を設定すること(LogWriterのプロパティについては [ログ出力の設定](../../component/libraries/libraries-log.md#log-basic-setting) を参照)。 + 記述例 + ```properties performanceLogFormatter.className=nablarch.core.log.app.PerformanceJsonLogFormatter performanceLogFormatter.structuredMessagePrefix=$JSON$ diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-repository.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-repository.md index 77883fe77..e12942286 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-repository.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-repository.md @@ -224,6 +224,7 @@ componentタグのname属性が同じオブジェクトを登録することで 以下に設定例を示す。 java.lang.String + java.lang.String型に値を設定する場合、value属性にリテラルで設定する値を記述する。 この例では、strプロパティに対して「あいうえお」が設定される。 @@ -231,7 +232,9 @@ java.lang.String型に値を設定する場合、value属性にリテラルで ```xml ``` + java.lang.String[] + java.lang.String[]型に値を設定する場合、value属性に値をカンマ(,)区切りで設定する。 カンマで区切られた値が、配列の1つの要素となる。 @@ -241,7 +244,9 @@ java.lang.String[]型に値を設定する場合、value属性に値をカンマ ```xml ``` + java.lang.Integer(int) + java.lang.Integer型及びint型に値を設定する場合、value属性に設定する値を記述する。 設定できる値は、 Integer#valueOf により変換できる値。 @@ -250,13 +255,19 @@ java.lang.Integer型及びint型に値を設定する場合、value属性に設 ```xml ``` + java.lang.Integer[](int[]) + java.lang.String[]と同じように、value属性に値をカンマ(,)区切りで設定する。 各要素に設定できる値は、 Integer#valueOf により変換できる値。 + java.lang.Long(long) + java.lang.Integer(int)と同じように、value属性に設定する値を記述する。 設定できる値は、 Long#valueOf により変換できる値。 + java.lang.Boolean(boolean) + java.lang.Boolean型に値を設定する場合、value属性にリテラルで設定する値を記述する。 設定できる値は、 Boolean#valueOf により変換できる値。 @@ -271,6 +282,7 @@ java.lang.Boolean型に値を設定する場合、value属性にリテラルで list要素やmap要素を使ってコンポーネント設定をすることで、ListやMapを受け取るpropertyに対するsetterインジェクションが行える。 list要素を使ったListの設定 + list要素には、文字列または任意のJava Beansオブジェクトを設定できる。 この例では、SampleBeanのstringListプロパティに対して、[string1, string2, string3]を持つ文字列のListが設定される。 @@ -319,7 +331,9 @@ list要素にも任意の名前を設定でき、property要素で名前参照 ``` + map要素を使ったMapの設定 + この例では、mapプロパティに対してentryに「{key1=1, key2=2, key3=3}」を持つMapが設定される。 ```xml @@ -385,17 +399,23 @@ value-component要素を使用することで、Mapの値として任意のBean autowireType属性に指定可能なタイプは以下の通り。 ByType + DIコンテナ上にそのプロパティの型が1つしか存在しない場合に、そのコンポーネントを自動的にインジェクションする。 デフォルトではこのタイプが使用される。 + ByName + プロパティ名と一致する名称のコンポーネントが存在する場合に、そのコンポーネントを自動的にインジェクションする。 なお、プロパティとコンポーネントの型が一致しない場合はエラーとなる。 + None + 自動インジェクションを行わない。 デフォルト(ByType)の設定で自動インジェクションする例を以下に示す。 インジェクション対象のクラスを作成する + インジェクション対象のインタフェース及び実装クラスを作成する。 この例では、インタフェースを作成しているが、インタフェースの作成は必須ではない。 @@ -406,7 +426,9 @@ public interface SampleComponent { public class BasicSampleComponent implements SampleComponent { } ``` + インジェクション対象のオブジェクトを使用するクラスを作成する + 上記で作成したクラスを使って処理を行うクラスを作成する。 このクラスは、setterインジェクションで上記のクラスを受け取る。 @@ -419,7 +441,9 @@ public class SampleClient { } } ``` + コンポーネント設定ファイルにコンポーネントを定義する + この例では、 SampleClient に sampleComponent propertyを定義していないが、 SampleComponent を実装したクラスの設定が1つだけなので、 sampleComponent propertyには自動的に BasicSampleComponent が設定される。 @@ -476,6 +500,7 @@ database.password = sa 以下に例を示す。 環境依存値 + ```bash database.url = jdbc:h2:mem:sample database.user = sa @@ -494,12 +519,15 @@ DIコンテナで管理するオブジェクトに対して環境依存値を設 以下に例を示す。 環境設定ファイル + ```bash database.url = jdbc:h2:mem:sample database.user = sa database.password = sa ``` + コンポーネント設定ファイル + 環境設定ファイルを読み込む場合には、config-file要素を使用する。 この例のようにファイル名指定で読み込んだり、特定ディレクトリ配下のファイルを一括で読み込むことができる。 @@ -539,6 +567,7 @@ message=上書きされるメッセージ ``` システムプロパティで値を上書きする + javaコマンドの `-D` オプションでシステムプロパティを設定することで、環境設定ファイルの値を上書きできる。 この例の場合、 message の値は「上書きするメッセージ」となる。 @@ -549,6 +578,7 @@ java -Dmessage=上書きするメッセージ 以下の説明に沿って設定することで、環境依存値をOS環境変数で上書きできるようになる。 OS環境変数による上書きを有効にするための設定方法 + 環境依存値を上書きする仕組みは、 ExternalizedComponentDefinitionLoader インタフェースを実装したクラスによって実現されている。 この実装クラスは、 `java.util.ServiceLoader` を使ってロードされる。 @@ -581,6 +611,7 @@ nablarch.core.repository.di.config.externalize.SystemPropertyExternalizedLoader 上記例の場合は、OS環境変数で設定した値よりもシステムプロパティで設定した値の方が優先されることになる。 OS環境変数の名前について + Linuxでは、OS環境変数の名前に `.` や `-` を使用できない。 したがって、 `example.error-message` のような名前の環境依存値があった場合に、これを上書きするためのOS環境変数をそのままの名前で定義できない。 @@ -604,9 +635,11 @@ Java Beansとして実装されているクラスであれば、setterインジ 以下に手順を示す。 ファクトリクラスを作成する + ファクトリクラスは、 ComponentFactory インタフェースを実装し作成する。 実装例 + ```java public class SampleComponentFactory implements ComponentFactory { // 生成するオブジェクトへの設定値 @@ -623,7 +656,9 @@ public class SampleComponentFactory implements ComponentFactory } } ``` + コンポーネント設定ファイルにファクトリクラスを設定する + ファクトリクラスを通常のコンポーネントと同じように設定することで、 自動的にファクトリクラスが生成したオブジェクトが設定される。 @@ -673,6 +708,7 @@ SystemRepositoryComponent を #### 使用方法 収集対象のパッケージを特定するクラスを作成する。 + SystemRepositoryComponent が付与された クラスの収集は ExternalizedComponentDefinitionLoader インタフェースを実装したクラスで行っている。 このクラスは AnnotationComponentDefinitionLoader という抽象クラスで、収集対象の基点となるパッケージを返す @@ -688,10 +724,14 @@ public class ExampleComponentDefinitionLoader extends AnnotationComponentDefinit } } ``` + 作成したクラスをサービスプロバイダとして設定する。 + `java.util.ServiceLoader` でロードされるよう [OS環境変数による上書きを有効にするための設定方法](../../component/libraries/libraries-repository.md#repository-overwrite-environment-configuration-by-os-env-var) と同様 `nablarch.core.repository.di.config.externalize.ExternalizedComponentDefinitionLoader` というファイルを作成し上記のクラスの完全修飾名を記述する。 + DIコンテナで管理したいクラスにアノテーションを付与する。 + SystemRepositoryComponent を付与することでDIコンテナで管理される。 ```java @@ -716,6 +756,7 @@ SystemRepositoryComponent が付与されたクラスは構築時に以下の条 * 引数の型に一致するコンポーネントがDIコンテナ上に存在しないまたは複数存在する場合は、何もインジェクションしない 設定値をインジェクションする + コンストラクタ引数に ConfigValue を 付与することでアノテーションの `value` に設定した値がインジェクションされる。 使用可能な設定値の型は [文字列や数値、真偽値を設定値として使う](../../component/libraries/libraries-repository.md#repository-property-type) に準ずる。 @@ -733,7 +774,9 @@ public class ExampleService { this.errorMessageId = errorMessageId; } ``` + コンポーネントをインジェクションする + コンストラクタ引数に ComponentRef を 付与することでアノテーションの `value` に設定した名前のコンポーネントがインジェクションされる。 @@ -799,6 +842,7 @@ Nablarchで用意されたディスパッチハンドラ( [ルーティング 以下に詳細な手順を示す。 Initializableインタフェースを実装する + initialize で初期化処理を行う。 ```java @@ -808,7 +852,9 @@ public class SampleComponent implements Initializable { } } ``` + コンポーネント設定ファイルに初期化対象のリストを設定する + 初期化対象のオブジェクトを BasicApplicationInitializer に設定する。 初期化対象のオブジェクトの初期化順を意識する必要がある場合は、先に初期化を行いたいオブジェクトをより上に設定する。 @@ -852,6 +898,7 @@ public class SampleComponent implements Initializable { 以下に詳細な手順を示す。 Disposableインタフェースを実装する + dispose で廃棄処理を行う。 ```java @@ -861,7 +908,9 @@ public class SampleComponent implements Disposable { } } ``` + コンポーネント設定ファイルに廃棄対象のリストを設定する + 廃棄対象のオブジェクトを BasicApplicationDisposer に設定する。 廃棄対象のオブジェクトの廃棄順を意識する必要がある場合は、先に廃棄したいオブジェクトをより **下に設定する** 。 @@ -901,7 +950,9 @@ public class SampleComponent implements Disposable { その場合、廃棄処理はインスタンス生成とは逆の順序で行うことが望ましい(例:JDBCの `Connection`, `Statement`, `ResultSet`)。 このため、 BasicApplicationDisposer では `disposableList` に設定されている順序とは逆の順序で廃棄処理を呼ぶようになっている。 + Closeableオブジェクトを廃棄対象リストに設定する + `java.io.Closeable` を実装したコンポーネントであれば、 DisposableAdaptor を用いることで、次のように廃棄対象リストに簡単に設定できる。 ```xml @@ -954,6 +1005,7 @@ SystemRepository.load(new DiContainer(loader)); 以下のように、component要素(listやmap要素を含む)に設定したname属性の値を指定して、オブジェクトを取得できる。 コンポーネント定義 + ```xml @@ -963,7 +1015,9 @@ SystemRepository.load(new DiContainer(loader)); ``` + 取得例 + ```java // SystemRepository#getを使用して取得する。 SampleComponent sample = SystemRepository.get("sampleComponent"); @@ -977,18 +1031,24 @@ Component2 component2 = SystemRepository.get("component.component2"); 環境設定ファイルにはconfigファイルとpropertiesファイルの二種類があり、ここでは各環境設定ファイルの記述ルールについて説明する。 propertisファイルの仕様 + JavaのPropertiesの仕様に基づいて解析される。 + configファイルの仕様 + 以下、configファイルの仕様について説明する。 設定値の記述形式 + 設定値は、 キーと値を `=` で区切って記述する。 ```bash key1=value1 key2=value2 ``` + コメントの記述 + コメントは、 `#` を用いた行コメントのみサポートする。 行中に `#` が存在した場合は、それ以降をコメントとして扱う。 @@ -996,7 +1056,9 @@ key2=value2 # コメントです key = value # コメントです ``` + 複数行にまたがった設定値の記述 + 行末に `\` を記述することで、複数行にまたがって設定値を記述できる。 下の例の場合、設定値の組み合わせは以下のようになる。 @@ -1012,7 +1074,9 @@ value2 key3 = abcd\ # ここにコメントを定義できる efg ``` + 予約語のエスケープ + 以下の予約語を一般文字として扱う場合は、 `\` を用いてエスケープする。 * `#` diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-session-store.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-session-store.md index 62374fdcb..236c9135e 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-session-store.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-session-store.md @@ -164,6 +164,7 @@ SessionManager をコンポーネント定義に設定する。 作成するテーブルの定義を以下に示す。 USER_SESSION テーブル + | カラム名 | データ型 | |---|---| | SESSION_ID(PK) | java.lang.String | @@ -194,8 +195,11 @@ UserSessionSchema のコンポーネントを定義する。 複数タブでの画面操作を許容するか否かでセッションストアを使い分ける。 複数タブでの画面操作を許容しない場合 + DBストアを使用してデータベース上のテーブルにセッション変数を保持する。 + 複数タブでの画面操作を許容する場合 + HIDDENストアを使用してクライアントサイドにセッション変数を保持する。 HIDDENストアを使用する場合、以下の様に入力・確認画面のJSPに [hiddenStoreタグ](../../component/libraries/libraries-tag-reference.md#tag-hidden-store-tag) を使用する。 @@ -237,6 +241,7 @@ session_store/update_example ログイン、ログアウト時のセッションストアの実装例を以下に示す。 アプリケーションにログインする + ```java // ログイン前にセッションIDを変更する SessionUtil.changeId(ctx); @@ -257,6 +262,7 @@ SessionUtil.put(ctx, "user", user, "db"); > 詳しくは [CSRFトークンを再生成する](../../component/handlers/handlers-csrf-token-verification-handler.md#csrf-token-verification-handler-regeneration) を参照。 アプリケーションからログアウトする + ```java // セッションストア全体を破棄 SessionUtil.invalidate(ctx); @@ -302,6 +308,7 @@ JSPからセッションストアで保持しているセッション変数の ``` ポイント + 暗号化の鍵及びIVは、base64でエンコードした値を設定する。 鍵の強度を高めるためには、以下の機能を使用して生成すると良い。 @@ -321,9 +328,11 @@ Java8で追加された `java.util.Base64.Encoder` を使用して行うと良 以下に実現方法を示す。 システムで共通のエラーページに遷移させる + システムで共通のエラーページに遷移させる場合は、ハンドラで例外を捕捉し遷移先を指定する。 実装例 + ```java public class SampleErrorHandler implements Handler { @@ -341,11 +350,14 @@ public class SampleErrorHandler implements Handler { } } ``` + リクエスト毎に遷移先を指定する + リクエスト毎に遷移先を切り替える場合には、 [OnErrorインターセプタ](../../component/handlers/handlers-on-error.md#on-error-interceptor) を使用して遷移先を指定する。 なお、上記のシステムで共通のエラーページに遷移させると併用することで、一部のリクエストのみ遷移先を変更することも出来る。 実装例 + ```java // 対象例外にセッション変数が存在しないことを示す例外を指定して、リクエスト毎の遷移先を指定する @OnError(type = SessionKeyNotFoundException.class, path = "redirect://error") @@ -369,6 +381,7 @@ public HttpResponse backToNew(HttpRequest request, ExecutionContext context) { デフォルトで使用できるセッション変数の保存先は以下の通り。 DBストア + データベース上のテーブル * ローリングメンテナンス等でアプリケーションサーバが停止した場合でもセッション変数の復元が可能。 @@ -376,6 +389,7 @@ DBストア * 同一セッションの処理が複数スレッドで実行された場合後勝ちとなる。(先に保存されたセッションのデータは消失する) HIDDENストア + クライアントサイド ( hidden タグを使用して画面間でセッション変数を引き回して実現) @@ -384,6 +398,7 @@ HIDDENストア * 同一セッションの処理が複数スレッドで実行された場合、セッションのデータはそれぞれのスレッドに紐付けて保存される。 HTTPセッションストア + アプリケーションサーバのヒープ領域 (アプリケーションサーバの設定によっては、データベースやファイル等に保存される場合がある。) diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-sql-log.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-sql-log.md index 92d4eef25..694340d85 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-sql-log.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-sql-log.md @@ -26,6 +26,7 @@ SQLログの出力方針 上記出力方針に対するログ出力の設定例を下記に示す。 log.propertiesの設定例 + ```properties writerNames=appLog @@ -49,7 +50,9 @@ loggers.SQL.nameRegex=SQL loggers.SQL.level=TRACE loggers.SQL.writerNames=appLog ``` + app-log.propertiesの設定例 + ```properties # SqlLogFormatter #sqlLogFormatter.className= @@ -99,14 +102,19 @@ sqlLogFormatter.endExecuteBatchFormat=$methodName$\ SQLログの設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + sqlLogFormatter.className + SqlLogFormatter を実装したクラス。 差し替える場合に指定する。 + sqlLogFormatter.startRetrieveFormat + SqlPStatement#retrieve の開始時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $sql$ @@ -120,7 +128,9 @@ $queryTimeout$ $fetchSize$ $additionalInfo$ + デフォルトのフォーマット + ```bash $methodName$ \n\tSQL = [$sql$] @@ -129,11 +139,14 @@ $methodName$ \n\tadditional_info: \n\t$additionalInfo$ ``` + sqlLogFormatter.endRetrieveFormat + SqlPStatement#retrieve の終了時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $executeTime$ @@ -141,136 +154,180 @@ $executeTime$ $retrieveTime$ $count$ + デフォルトのフォーマット + ```bash $methodName$ \n\texecute_time(ms) = [$executeTime$] retrieve_time(ms) = [$retrieveTime$] count = [$count$] ``` + sqlLogFormatter.startExecuteFormat + SqlPStatement#execute の開始時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $sql$ $additionalInfo$ + デフォルトのフォーマット + ```bash $methodName$ \n\tSQL = [$sql$] \n\tadditional_info: \n\t$additionalInfo$ ``` + sqlLogFormatter.endExecuteFormat + SqlPStatement#execute の終了時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $executeTime$ + デフォルトのフォーマット + ```bash $methodName$ \n\texecute_time(ms) = [$executeTime$] ``` + sqlLogFormatter.startExecuteQueryFormat + SqlPStatement#executeQuery の開始時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $sql$ $additionalInfo$ + デフォルトのフォーマット + ```bash $methodName$ \n\tSQL = [$sql$] \n\tadditional_info: \n\t$additionalInfo$ ``` + sqlLogFormatter.endExecuteQueryFormat + SqlPStatement#executeQuery の終了時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $executeTime$ + デフォルトのフォーマット + ```bash $methodName$ \n\texecute_time(ms) = [$executeTime$] ``` + sqlLogFormatter.startExecuteUpdateFormat + SqlPStatement#executeUpdate の開始時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $sql$ $additionalInfo$ + デフォルトのフォーマット + ```bash $methodName$ \n\tSQL = [$sql$] \n\tadditional_info: \n\t$additionalInfo$ ``` + sqlLogFormatter.endExecuteUpdateFormat + SqlPStatement#executeUpdate の終了時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $executeTime$ $updateCount$ + デフォルトのフォーマット + ```bash $methodName$ \n\texecute_time(ms) = [$executeTime$] update_count = [$updateCount$] ``` + sqlLogFormatter.startExecuteBatchFormat + SqlStatement#executeBatch の開始時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $sql$ $additionalInfo$ + デフォルトのフォーマット + ```bash $methodName$ \n\tSQL = [$sql$] \n\tadditional_info: \n\t$additionalInfo$ ``` + sqlLogFormatter.endExecuteBatchFormat + SqlStatement#executeBatch の終了時に使用するフォーマット。 フォーマットに指定可能なプレースホルダ + $methodName$ $executeTime$ $batchCount$ + デフォルトのフォーマット + ```bash $methodName$ \n\texecute_time(ms) = [$executeTime$] batch_count = [$updateCount$] ``` + 記述例 + ```properties sqlLogFormatter.className=nablarch.core.db.statement.SqlLogFormatter sqlLogFormatter.startRetrieveFormat=$methodName$\n\tSQL:$sql$\n\tstart:$startPosition$ size:$size$\n\tadditional_info:\n\t$additionalInfo$ @@ -295,17 +352,22 @@ SqlJsonLogFormatter を使用する。 設定は、 [各種ログの設定](../../component/libraries/libraries-log.md#log-app-log-setting) で説明したプロパティファイルに行う。 記述ルール + SqlJsonLogFormatter を用いる際に 指定するプロパティは以下の通り。 sqlLogFormatter.className `必須` + JSON形式でログを出力する場合、 SqlJsonLogFormatter を指定する。 + sqlLogFormatter.startRetrieveTargets + SqlPStatement#retrieve の開始時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName sql @@ -321,11 +383,14 @@ fetchSize additionalInfo デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.endRetrieveTargets + SqlPStatement#retrieve の終了時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName executeTime @@ -335,11 +400,14 @@ retrieveTime count デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.startExecuteTargets + SqlPStatement#execute の開始時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName sql @@ -347,21 +415,27 @@ sql additionalInfo デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.endExecuteTargets + SqlPStatement#execute の終了時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName executeTime デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.startExecuteQueryTargets + SqlPStatement#executeQuery の開始時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName sql @@ -369,21 +443,27 @@ sql additionalInfo デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.endExecuteQueryTargets + SqlPStatement#executeQuery の終了時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName executeTime デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.startExecuteUpdateTargets + SqlPStatement#executeUpdate の開始時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName sql @@ -391,11 +471,14 @@ sql additionalInfo デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.endExecuteUpdateTargets + SqlPStatement#executeUpdate の終了時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName executeTime @@ -403,11 +486,14 @@ executeTime updateCount デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.startExecuteBatchTargets + SqlStatement#executeBatch の開始時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName sql @@ -415,11 +501,14 @@ sql additionalInfo デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.endExecuteBatchTargets + SqlStatement#executeBatch の終了時のログ出力項目。カンマ区切りで指定する。 指定可能な出力項目 + methodName executeTime @@ -427,12 +516,16 @@ executeTime batchCount デフォルトは全ての出力項目が対象となる。 + sqlLogFormatter.structuredMessagePrefix + フォーマット後のメッセージ文字列が JSON 形式に整形されていることを識別できるようにするために、メッセージの先頭に付与するマーカー文字列。 メッセージの先頭にあるマーカー文字列が JsonLogFormatter に設定しているマーカー文字列と一致する場合、 JsonLogFormatter はメッセージを JSON データとして処理する。 デフォルトは `"$JSON$"` となる。 変更する場合は、LogWriterの `structuredMessagePrefix` プロパティを使用して JsonLogFormatter にも同じ値を設定すること(LogWriterのプロパティについては [ログ出力の設定](../../component/libraries/libraries-log.md#log-basic-setting) を参照)。 + 記述例 + ```properties sqlLogFormatter.className=nablarch.core.db.statement.SqlJsonLogFormatter sqlLogFormatter.structuredMessagePrefix=$JSON$ diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-static-data-cache.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-static-data-cache.md index bc03e33b7..29899522c 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-static-data-cache.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-static-data-cache.md @@ -54,6 +54,7 @@ 以下に詳細な手順を示す。 StaticDataLoaderインタフェースを実装しローダーを作成する + StaticDataLoader を実装し、任意のストアから静的データをロードする処理を実装する。 幾つか実装すべきメソッドがあるが、以下のルールにもとづいて実装すると良い。 @@ -67,7 +68,9 @@ StaticDataLoader を実装し、任意のストアから静的データをロー この機能は実装方法が複雑になるだけでなく、使用するメリットもないため原則使用しない。 実装としては、 return null で良い。 + BasicStaticDataCacheクラスにローダーを設定する + StaticDataLoader を実装したローダーを、 BasicStaticDataCache.loader に設定する。 設定例は、 [静的データキャッシュの設定ファイル例](../../component/libraries/libraries-static-data-cache.md#static-data-cache-config-sample) を参照。 @@ -75,7 +78,9 @@ StaticDataLoader を実装したローダーを、 BasicStaticDataCache.loader > **Important:** > 設定例でも行っているように、 BasicStaticDataCache は必ず初期化対象に設定すること。 > 初期化の詳細は、 [オブジェクトの初期化処理を行う](../../component/libraries/libraries-repository.md#repository-initialize-object) を参照。 + キャッシュを使用するクラスにBasicStaticDataCacheを設定する + キャッシュを使用するクラスに、ローダーを持つ BasicStaticDataCache を設定することで、キャッシュされたデータにアクセスできる。 以下にキャッシュを使用するクラスの例を示す。 @@ -100,6 +105,7 @@ public class SampleService { ``` 設定ファイル例 + ```xml diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-tag-reference.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-tag-reference.md index 99dd2ca16..0367c8314 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-tag-reference.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-tag-reference.md @@ -4,9 +4,11 @@ 各タグの使用方法や使用例などの詳細については [JSPカスタムタグ](../../component/libraries/libraries-tag.md#tag) を参照すること。 フォーム + [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) (フォーム) 入力 + [textタグ](../../component/libraries/libraries-tag-reference.md#tag-text-tag) (テキスト) [searchタグ](../../component/libraries/libraries-tag-reference.md#tag-search-tag) (検索テキスト) [telタグ](../../component/libraries/libraries-tag-reference.md#tag-tel-tag) (電話番号) @@ -39,40 +41,58 @@ [hiddenStoreタグ](../../component/libraries/libraries-tag-reference.md#tag-hidden-store-tag) (HIDDENストア) サブミット + フォームのサブミット + [submitタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-tag) (inputタグのボタン) [buttonタグ](../../component/libraries/libraries-tag-reference.md#tag-button-tag) (buttonタグのボタン) [submitLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-link-tag) (リンク) + 別ウィンドウを開いてサブミット(ポップアップ) + [popupSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-submit-tag) (inputタグのボタン) [popupButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-button-tag) (buttonタグのボタン) [popupLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-link-tag) (リンク) + ダウンロード用のサブミット + [downloadSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-download-submit-tag) (inputタグのボタン) [downloadButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-download-button-tag) (buttonタグのボタン) [downloadLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-download-link-tag) (リンク) + サブミット制御 + [paramタグ](../../component/libraries/libraries-tag-reference.md#tag-param-tag) (サブミット時に追加するパラメータの指定) [changeParamNameタグ](../../component/libraries/libraries-tag-reference.md#tag-change-param-name-tag) (ポップアップ用のサブミット時にパラメータ名の変更) 出力 + 値 + [writeタグ](../../component/libraries/libraries-tag-reference.md#tag-write-tag) (オブジェクトの値) [prettyPrintタグ](../../component/libraries/libraries-tag-reference.md#tag-pretty-print-tag) (オブジェクトの値。修飾系のHTML(bタグなど)のみエスケープしない) [rawWriteタグ](../../component/libraries/libraries-tag-reference.md#tag-raw-write-tag) (オブジェクトの値。HTMLエスケープしない) [codeタグ](../../component/libraries/libraries-tag-reference.md#tag-code-tag) (コード値) [cspNonceタグ](../../component/libraries/libraries-tag-reference.md#tag-csp-nonce-tag) (Content Security Policyのnonceの値) + メッセージ + [messageタグ](../../component/libraries/libraries-tag-reference.md#tag-message-tag) (メッセージ) + エラー + [errorsタグ](../../component/libraries/libraries-tag-reference.md#tag-errors-tag) (エラーメッセージの一覧表示) [errorタグ](../../component/libraries/libraries-tag-reference.md#tag-error-tag) (エラーメッセージの個別表示) + URIを指定するHTMLタグ(コンテキストパスの付加とURLリライト) + [aタグ](../../component/libraries/libraries-tag-reference.md#tag-a-tag) [imgタグ](../../component/libraries/libraries-tag-reference.md#tag-img-tag) [linkタグ](../../component/libraries/libraries-tag-reference.md#tag-link-tag) [scriptタグ](../../component/libraries/libraries-tag-reference.md#tag-script-tag) + ユーティリティ + [noCacheタグ](../../component/libraries/libraries-tag-reference.md#tag-no-cache-tag) (ブラウザのキャッシュを抑制する) [setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) (変数に値を設定する) [includeタグ](../../component/libraries/libraries-tag-reference.md#tag-include-tag) (インクルード) diff --git a/.claude/skills/nabledge-5/docs/component/libraries/libraries-tag.md b/.claude/skills/nabledge-5/docs/component/libraries/libraries-tag.md index 18d0c4005..a79053b7c 100644 --- a/.claude/skills/nabledge-5/docs/component/libraries/libraries-tag.md +++ b/.claude/skills/nabledge-5/docs/component/libraries/libraries-tag.md @@ -186,6 +186,7 @@ CustomTagConfig により行う。 [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) + カスタムタグを使用したリクエストを処理する際に、以下の機能に必要となる前処理を行うハンドラ。 カスタムタグを使用する場合は、このハンドラの設定が必須となる。 @@ -195,7 +196,9 @@ CustomTagConfig * [複合キーのラジオボタンやチェックボックスを作る](../../component/libraries/libraries-tag.md#tag-composite-key) このハンドラの設定値については、 [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) を参照。 + CustomTagConfig + カスタムタグのデフォルト値を設定するクラス。 選択項目のラベルパターンなど、カスタムタグの属性は、個々の画面で毎回設定するよりも、 アプリケーション全体で統一したデフォルト値を使用したい場合がある。 @@ -224,17 +227,25 @@ CustomTagConfig * [errorタグ](../../component/libraries/libraries-tag-reference.md#tag-error-tag) などのエラー表示を行うカスタムタグ 入力フォームを作る上でのポイント + 入力値の復元 + バリデーションエラーなどで、入力フォームを再表示した場合、カスタムタグによりリクエストパラメータから入力値が復元される。 + 初期値の出力 + 入力項目に初期値を出力したい場合は、アクション側でリクエストスコープに初期値を設定したオブジェクトを設定する。 そして、カスタムタグのname属性と、リクエストスコープ上の変数名が対応するように、name属性を指定する。 指定方法の詳細や実装例は、 [入力/出力データへのアクセスルール](../../component/libraries/libraries-tag.md#tag-access-rule) を参照。 + サブミット先のURI指定 + カスタムタグでは、フォームに配置された複数のボタン/リンクから、それぞれ別々のURIにサブミットできる。 ボタン/リンクのサブミット先となるURIは、uri属性に指定する。 指定方法の詳細や実装例は、 [URIの指定方法](../../component/libraries/libraries-tag.md#tag-specify-uri) を参照。 + 実装例 + ```jsp
@@ -252,7 +263,9 @@ CustomTagConfig
``` + 出力結果 + ![login_form.png](../../../knowledge/assets/libraries-tag/login_form.png) > **Tip:** @@ -262,6 +275,7 @@ CustomTagConfig > * > JavaScriptの変数名の構文に則った値を指定する > 画面内で一意な名前をname属性に指定する + > カスタムタグでは、サブミット制御にJavaScriptを使用する。 > JavaScriptについては [サブミット前に処理を追加する](../../component/libraries/libraries-tag.md#tag-onclick-override) を参照。 @@ -272,11 +286,14 @@ CustomTagConfig > アプリケーションで [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) のname属性を指定しなかった場合、 > カスタムタグは一意な値をname属性に設定する。 + > JavaScriptの変数名の構文に則った値を指定する + > [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) のname属性はJavaScriptで使用するため、 > JavaScriptの変数名の構文に則った値を指定する必要がある。 > 変数名の構文 + > * > 値の先頭は英字始まり > * > 先頭以降の値は英数字またはアンダーバー @@ -296,7 +313,9 @@ CustomTagConfig > Object#toString してから行う。 実装例 + 選択肢のクラス + ```java public class Plan { @@ -322,7 +341,9 @@ public class Plan { } } ``` + アクション + ```java // 選択肢リストをリクエストスコープに設定する。 List plans = Arrays.asList(new Plan("A", "フリー"), @@ -332,8 +353,11 @@ List plans = Arrays.asList(new Plan("A", "フリー"), // カスタムタグはここで指定した名前を使ってリクエストスコープから選択肢リストを取得する。 context.setRequestScopedVar("plans", plans); ``` + プルダウン + JSP + ```jsp ``` + 出力されるHTML + ```html ``` + 出力されるHTML + ```html ``` + 更新画面 + ```jsp ``` + 更新確認画面 + ```jsp ``` + 更新完了画面 + ```jsp @@ -562,12 +607,15 @@ HTMLのcheckboxタグは、チェックなしの場合にリクエストパラ > このため、特に理由がない限り [useHiddenEncryption](../../component/libraries/libraries-tag.md#tag-use-hidden-encryption) には `false` を設定すること。 hidden暗号化 + hidden暗号化は、 [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) と [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) により実現する。 hidden暗号化の処理イメージを以下に示す。 [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) が暗号化、 [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) が復号及び改竄チェックを行う。 ![hidden_encryption.png](../../../knowledge/assets/libraries-tag/hidden_encryption.png) + 暗号化処理 + 暗号化は、 Encryptor インタフェースを実装したクラスが行う。 フレームワークでは、デフォルトの暗号化アルゴリズムとして `AES(128bit)` を使用する。 暗号化アルゴリズムを変更したい場合は、 @@ -594,6 +642,7 @@ Encryptor を実装したクラスを > [plainHiddenタグ](../../component/libraries/libraries-tag-reference.md#tag-plain-hidden-tag) を使用して、暗号化しないhiddenタグを出力する。 復号処理 + 復号処理は、 [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) が行う。 [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) では以下の場合に改竄と判定し、設定で指定された画面に遷移させる。 @@ -602,16 +651,23 @@ Encryptor を実装したクラスを * 復号に失敗する。 * 暗号化時に生成したハッシュ値と復号した値で生成したハッシュ値が一致しない。 * 暗号化時に追加したリクエストIDと受け付けたリクエストのリクエストIDが一致しない。 + 暗号化に使用する鍵の保存場所 + 暗号化に使用する鍵は、鍵の有効期間をできるだけ短くするため、セッション毎に生成する。 このため、同じユーザであってもログインをやり直すと、ログイン前に使用していた画面から処理を継続できない。 + hidden暗号化の設定 + hidden暗号化では、 [カスタムタグの設定](../../component/libraries/libraries-tag.md#tag-setting) により、以下の設定ができる。 useHiddenEncryptionプロパティ + hidden暗号化を使用するか否か。 デフォルトはtrue。 + noHiddenEncryptionRequestIdsプロパティ + hidden暗号化を行わないリクエストID。 noHiddenEncryptionRequestIdsプロパティには、以下のように、hidden暗号化を使用できないリクエストを指定する。 @@ -628,9 +684,12 @@ noHiddenEncryptionRequestIdsプロパティの設定値は、 それぞれ暗号化と復号の際に参照して処理を行う。 [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) + [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) に暗号化対象のリクエストIDが1つでも含まれていれば暗号化する。 反対に、暗号化対象のリクエストIDが1つも含まれていない場合、 [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) は暗号化しない。 + [Nablarchカスタムタグ制御ハンドラ](../../component/handlers/handlers-nablarch-tag-handler.md#nablarch-tag-handler) + リクエストされたリクエストIDが暗号化対象のリクエストIDの場合のみ、復号する。 ### 複合キーのラジオボタンやチェックボックスを作る @@ -659,9 +718,11 @@ noHiddenEncryptionRequestIdsプロパティの設定値は、 > [Bean Validation](../../component/libraries/libraries-bean-validation.md#bean-validation) は対応していない。 実装例 + 一覧表示で複合キーをもつチェックボックスを使用する例を元に、実装方法を説明する。 フォーム + フォームでは、複合キーを保持するプロパティを CompositeKey として定義する。 @@ -682,7 +743,9 @@ public class OrderItemsForm { } } ``` + JSP + ```jsp @@ -725,14 +788,19 @@ JSP 1つのフォームに複数のボタンとリンクを配置できる。 フォームのサブミット + [submitタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-tag) (inputタグのボタン) [buttonタグ](../../component/libraries/libraries-tag-reference.md#tag-button-tag) (buttonタグのボタン) [submitLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-link-tag) (リンク) + 別ウィンドウを開いてサブミット(ポップアップ) + [popupSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-submit-tag) (inputタグのボタン) [popupButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-button-tag) (buttonタグのボタン) [popupLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-link-tag) (リンク) + ダウンロード用のサブミット + [downloadSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-download-submit-tag) (inputタグのボタン) [downloadButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-download-button-tag) (buttonタグのボタン) [downloadLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-download-link-tag) (リンク) @@ -750,6 +818,7 @@ name属性は、フォーム内で一意な名前を指定する。name属性の uri属性の指定方法については、 [URIの指定方法](../../component/libraries/libraries-tag.md#tag-specify-uri) を参照。 実装例 + ```jsp @@ -762,6 +831,7 @@ uri属性の指定方法については、 [URIの指定方法](../../component/ ボタン/リンクのonclick属性にその関数呼び出しを設定した状態でHTMLを出力する。 カスタムタグが出力するJavaScript関数のシグネチャ + ```javascript /** * @param event イベントオブジェクト @@ -774,13 +844,16 @@ function nablarch_submit(event, element) 出力例を以下に示す。 JSP + ```jsp ``` + HTML + ```html \n\n \n \n\n```\n\nサブミット前に処理を追加したい場合は、onclick属性にアプリケーションで作成したJavaScript関数を指定する。\nカスタムタグは、onclick属性が指定された場合、サブミット用のJavaScript関数を呼び出さない。\nこの場合、アプリケーションで作成したJavaScriptで、カスタムタグが設定する [JavaScript関数](../../component/libraries/libraries-tag.md#tag-submit-function) を呼び出す必要がある。\n\n> **Important:**\n> Content Security Policy(CSP)に対応する場合は、onclick属性にインラインでJavaScriptを記述してしまうとCSPに対応しようとしているにも\n> 関わらず `unsafe-inline` を使いセキュリティレベルを低下させてしまう、 もしくは `unsafe-hashes` を利用することになってしまう。\n> このため、 [Content Security Policy(CSP)に対応する](../../component/libraries/libraries-tag.md#tag-content-security-policy) の手順に従い外部スクリプトまたはnonce属性を指定したscript要素に追加の処理を実装を\n> 行うことを推奨する。\n\n実装例\nサブミット前に確認ダイアログを表示する。\n\nJavaScript\n```javascript\nfunction popUpConfirmation(event, element) {\n if (window.confirm(\"登録します。よろしいですか?\")) {\n // カスタムタグが出力するJavaScript関数を明示的に呼び出す。\n return nablarch_submit(event, element);\n } else {\n // キャンセル\n return false;\n }\n}\n```\nJSP\n```jsp\n\n```", + "content": "フォームのサブミットは、JavaScriptを使用してボタン/リンク毎のURIを組み立てることで実現している。\nカスタムタグは、グローバル領域にこのJavaScript関数を出力し、\nボタン/リンクのonclick属性にその関数呼び出しを設定した状態でHTMLを出力する。\n\nカスタムタグが出力するJavaScript関数のシグネチャ\n\n```javascript\n/**\n * @param event イベントオブジェクト\n * @param element イベント元の要素(ボタン又はリンク)。未指定の場合は第1引数のeventからcurrentTarget、targetプロパティの優先順位でイベント元の要素を取得する。\n * @return イベントを伝搬させないため常にfalse\n */\nfunction nablarch_submit(event, element)\n```\n\n出力例を以下に示す。\n\nJSP\n\n```jsp\n\n \n \n\n```\n\nHTML\n\n```html\n\n
\n \n \n\n```\n\nサブミット前に処理を追加したい場合は、onclick属性にアプリケーションで作成したJavaScript関数を指定する。\nカスタムタグは、onclick属性が指定された場合、サブミット用のJavaScript関数を呼び出さない。\nこの場合、アプリケーションで作成したJavaScriptで、カスタムタグが設定する [JavaScript関数](../../component/libraries/libraries-tag.md#tag-submit-function) を呼び出す必要がある。\n\n> **Important:**\n> Content Security Policy(CSP)に対応する場合は、onclick属性にインラインでJavaScriptを記述してしまうとCSPに対応しようとしているにも\n> 関わらず `unsafe-inline` を使いセキュリティレベルを低下させてしまう、 もしくは `unsafe-hashes` を利用することになってしまう。\n> このため、 [Content Security Policy(CSP)に対応する](../../component/libraries/libraries-tag.md#tag-content-security-policy) の手順に従い外部スクリプトまたはnonce属性を指定したscript要素に追加の処理を実装を\n> 行うことを推奨する。\n\n実装例\n\nサブミット前に確認ダイアログを表示する。\n\nJavaScript\n\n```javascript\nfunction popUpConfirmation(event, element) {\n if (window.confirm(\"登録します。よろしいですか?\")) {\n // カスタムタグが出力するJavaScript関数を明示的に呼び出す。\n return nablarch_submit(event, element);\n } else {\n // キャンセル\n return false;\n }\n}\n```\n\nJSP\n\n```jsp\n\n```", "level": 3 }, { "id": "s16", "title": "プルダウン変更などの画面操作でサブミットする", - "content": "カスタムタグは、サブミット制御にJavaScriptを使用しており、\nサブミット制御するJavaScript関数が、ボタンやリンクのイベントハンドラ(onclick属性)に指定されることを前提に動作する。\nJavaScriptの詳細については、 [サブミット前に処理を追加する](../../component/libraries/libraries-tag.md#tag-onclick-override) を参照。\n\nそのため、プルダウン変更などの画面操作でサブミットを行いたい場合は、サブミットさせたいボタンのクリックイベントを発生させる。\n\n> **Important:**\n> Content Security Policy(CSP)に対応する場合は、onclick属性にインラインでJavaScriptを記述してしまうとCSPに対応しようとしているにも\n> 関わらず `unsafe-inline` を使いセキュリティレベルを低下させてしまう、 もしくは `unsafe-hashes` を利用することになってしまう。\n> このためは、 [Content Security Policy(CSP)に対応する](../../component/libraries/libraries-tag.md#tag-content-security-policy) の手順に従い外部スクリプトまたはnonce属性を指定したscript要素に追加の処理を実装を\n> 行うことを推奨する。\n\nプルダウン変更でサブミットを行う場合の実装例を示す。\n\n実装例\n```jsp\n\n\n\n\n```\n\n> **Important:**\n> 上記の実装例では、説明がしやすいので、onchangeイベントハンドラに直接JavaScriptを記載しているが、\n> 実際のプロジェクトでは、オープンソースのJavaScriptライブラリを使うなどして、処理を動的にバインドすることを推奨する。", + "content": "カスタムタグは、サブミット制御にJavaScriptを使用しており、\nサブミット制御するJavaScript関数が、ボタンやリンクのイベントハンドラ(onclick属性)に指定されることを前提に動作する。\nJavaScriptの詳細については、 [サブミット前に処理を追加する](../../component/libraries/libraries-tag.md#tag-onclick-override) を参照。\n\nそのため、プルダウン変更などの画面操作でサブミットを行いたい場合は、サブミットさせたいボタンのクリックイベントを発生させる。\n\n> **Important:**\n> Content Security Policy(CSP)に対応する場合は、onclick属性にインラインでJavaScriptを記述してしまうとCSPに対応しようとしているにも\n> 関わらず `unsafe-inline` を使いセキュリティレベルを低下させてしまう、 もしくは `unsafe-hashes` を利用することになってしまう。\n> このためは、 [Content Security Policy(CSP)に対応する](../../component/libraries/libraries-tag.md#tag-content-security-policy) の手順に従い外部スクリプトまたはnonce属性を指定したscript要素に追加の処理を実装を\n> 行うことを推奨する。\n\nプルダウン変更でサブミットを行う場合の実装例を示す。\n\n実装例\n\n```jsp\n\n\n\n\n```\n\n> **Important:**\n> 上記の実装例では、説明がしやすいので、onchangeイベントハンドラに直接JavaScriptを記載しているが、\n> 実際のプロジェクトでは、オープンソースのJavaScriptライブラリを使うなどして、処理を動的にバインドすることを推奨する。", "level": 3 }, { "id": "s17", "title": "ボタン/リンク毎にパラメータを追加する", - "content": "更新機能などにおいて、一覧画面から詳細画面に遷移するケースでは、\n同じURLだけどパラメータが異なるリンクを表示したい場合がある。\n\nカスタムタグでは、フォームのボタンやリンク毎にパラメータを追加するためのカスタムタグを提供する。\n\n* [paramタグ](../../component/libraries/libraries-tag-reference.md#tag-param-tag) (サブミット時に追加するパラメータの指定)\n\n実装例\n検索結果から一覧画面でリンク毎にパラメータを追加する。\n\n```jsp\n\n
\n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n```\n\n> **Important:**\n> パラメータを追加する場合は、その数に応じてリクエストのデータ量は増大する。\n> そのため、一覧画面で詳細画面へのリンク毎にパラメータを追加する場合は、\n> パラメータをプライマリキーだけにするなど、必要最小限のパラメータのみ追加する。", + "content": "更新機能などにおいて、一覧画面から詳細画面に遷移するケースでは、\n同じURLだけどパラメータが異なるリンクを表示したい場合がある。\n\nカスタムタグでは、フォームのボタンやリンク毎にパラメータを追加するためのカスタムタグを提供する。\n\n* [paramタグ](../../component/libraries/libraries-tag-reference.md#tag-param-tag) (サブミット時に追加するパラメータの指定)\n\n実装例\n\n検索結果から一覧画面でリンク毎にパラメータを追加する。\n\n```jsp\n\n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n```\n\n> **Important:**\n> パラメータを追加する場合は、その数に応じてリクエストのデータ量は増大する。\n> そのため、一覧画面で詳細画面へのリンク毎にパラメータを追加する場合は、\n> パラメータをプライマリキーだけにするなど、必要最小限のパラメータのみ追加する。", "level": 3 }, { "id": "s18", "title": "認可チェック/サービス提供可否に応じてボタン/リンクの表示/非表示を切り替える", - "content": "[ハンドラによる認可チェック](../../component/libraries/libraries-authorization-permission-check.md#permission-check) と [サービス提供可否チェック](../../component/libraries/libraries-service-availability.md#service-availability) の結果に応じて、\n[フォームのサブミットを行うボタン/リンク](../../component/libraries/libraries-tag-reference.md#tag-reference-submit) の表示を切り替える機能を提供する。\nこれにより、ユーザが実際にボタン/リンクを選択する前に該当機能が使用可能かどうかが分かるため、ユーザビリティの向上につながる。\n\n[フォームのサブミットを行うボタン/リンク](../../component/libraries/libraries-tag-reference.md#tag-reference-submit)\nに指定されたリクエストIDに対して、 [ハンドラによる認可チェック](../../component/libraries/libraries-authorization-permission-check.md#permission-check) と [サービス提供可否チェック](../../component/libraries/libraries-service-availability.md#service-availability) を行い、\n`権限なし` または `サービス提供不可` の場合に表示切り替えを行う。\n\n切り替え時の表示方法には次の3パターンがある。\n\n非表示\nタグを出力しない。\n非活性\nタグを非活性にする。\nボタンの場合は、disabled属性を有効にする。\nリンクの場合は、ラベルのみ表示するか、非活性リンク描画用JSPをインクルードする。\nJSPインクルードを行うには、 [カスタムタグの設定](../../component/libraries/libraries-tag.md#tag-setting) で\nsubmitLinkDisabledJspプロパティ\nを指定する。\n通常表示\n通常どおりタグが出力される。\n表示方法の切り替えを行わない。\n\nデフォルトは、 `通常表示` である。\n[カスタムタグの設定](../../component/libraries/libraries-tag.md#tag-setting) で\ndisplayMethodプロパティ\nを指定することで、デフォルトを変更できる。\n\n個別に表示方法を変更したい場合は、displayMethod属性に指定する。\n\n実装例\n```jsp\n\n\n```\n\n> **Tip:**\n> アプリケーションで表示制御に使用する判定処理を変更したい場合は、\n> [ボタン/リンクの表示制御に使う判定処理を変更する](../../component/libraries/libraries-tag.md#tag-submit-display-control-change) を参照。", + "content": "[ハンドラによる認可チェック](../../component/libraries/libraries-authorization-permission-check.md#permission-check) と [サービス提供可否チェック](../../component/libraries/libraries-service-availability.md#service-availability) の結果に応じて、\n[フォームのサブミットを行うボタン/リンク](../../component/libraries/libraries-tag-reference.md#tag-reference-submit) の表示を切り替える機能を提供する。\nこれにより、ユーザが実際にボタン/リンクを選択する前に該当機能が使用可能かどうかが分かるため、ユーザビリティの向上につながる。\n\n[フォームのサブミットを行うボタン/リンク](../../component/libraries/libraries-tag-reference.md#tag-reference-submit)\nに指定されたリクエストIDに対して、 [ハンドラによる認可チェック](../../component/libraries/libraries-authorization-permission-check.md#permission-check) と [サービス提供可否チェック](../../component/libraries/libraries-service-availability.md#service-availability) を行い、\n`権限なし` または `サービス提供不可` の場合に表示切り替えを行う。\n\n切り替え時の表示方法には次の3パターンがある。\n\n非表示\n\nタグを出力しない。\n\n非活性\n\nタグを非活性にする。\nボタンの場合は、disabled属性を有効にする。\nリンクの場合は、ラベルのみ表示するか、非活性リンク描画用JSPをインクルードする。\nJSPインクルードを行うには、 [カスタムタグの設定](../../component/libraries/libraries-tag.md#tag-setting) で\nsubmitLinkDisabledJspプロパティ\nを指定する。\n\n通常表示\n\n通常どおりタグが出力される。\n表示方法の切り替えを行わない。\n\nデフォルトは、 `通常表示` である。\n[カスタムタグの設定](../../component/libraries/libraries-tag.md#tag-setting) で\ndisplayMethodプロパティ\nを指定することで、デフォルトを変更できる。\n\n個別に表示方法を変更したい場合は、displayMethod属性に指定する。\n\n実装例\n\n```jsp\n\n\n```\n\n> **Tip:**\n> アプリケーションで表示制御に使用する判定処理を変更したい場合は、\n> [ボタン/リンクの表示制御に使う判定処理を変更する](../../component/libraries/libraries-tag.md#tag-submit-display-control-change) を参照。", "level": 3 }, { "id": "s19", "title": "別ウィンドウ/タブを開くボタン/リンクを作る(ポップアップ)", - "content": "ユーザの操作性を向上させるために、複数ウィンドウを立ち上げたい場合がある。\n例えば、郵便番号の入力欄から住所検索など、検索画面を別ウィンドウで立ち上げ入力補助を行う場合がある。\n\nカスタムタグでは、複数ウィンドウの立ち上げをサポートするカスタムタグ(以降はポップアップタグと称す)を提供する。\n\n* [popupSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-submit-tag) (inputタグのボタン)\n* [popupButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-button-tag) (buttonタグのボタン)\n* [popupLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-link-tag) (リンク)\n\n> **Important:**\n> これらのタグは、以下の問題点があるため非推奨とする。\n\n> * > 外部サイトへのリンクやボタンを作成した場合、一部のブラウザで新しいウィンドウでページを開けない。(例えば、IEの保護モードを有効にした場合発生する)\n\n> [aタグ](../../component/libraries/libraries-tag-reference.md#tag-a-tag) やhtmlタグを使用することでこの問題を回避できる。\n> * > サブウィンドウを用いた画面遷移は利便性が低い。\n\n> ページ内にポップアップウィンドウを表示する方式が一般的であり、サブウィンドウを用いた検索などは今や時代遅れである。\n> ページ内でのポップアップウィンドウの表示処理は、オープンソースライブラリを用いることで対応出来る。\n\nポップアップタグは、画面内のフォームに対するサブミットを行うカスタムタグと以下の点が異なる。\n\n* 新しいウィンドウをオープンし、オープンしたウィンドウに対してサブミットを行う。\n* 入力項目のパラメータ名を変更できる。\n\nポップアップは、JavaScriptのwindow.open関数を使用して実現する。\n\n実装例\n指定したスタイルでウィンドウを開く検索ボタンを作成する。\n\n```jsp\n\n\n 検索\n\n```\n\npopupWindowName属性が指定されない場合、 [カスタムタグの設定](../../component/libraries/libraries-tag.md#tag-setting) で\npopupWindowNameプロパティ\nに指定したデフォルト値が使用される。\nデフォルト値が設定されていない場合、カスタムタグは、JavaScriptのDate関数から取得した現在時刻(ミリ秒)を新しいウィンドウの名前に使用する。\nデフォルト値の指定有無により、ポップアップのデフォルト動作が以下のとおり決まる。\n\nデフォルト値を指定した場合\n常に同じウィンドウ名を使用するため、オープンするウィンドウが1つとなる。\nデフォルト値を指定しなかった場合\n常に異なるウィンドウ名を使用するため、常に新しいウィンドウをオープンする。\n\nパラメータ名変更\nポップアップタグは、元画面のフォームに含まれる全てのinput要素を動的に追加してサブミットする。\nポップアップタグにより開いたウィンドウに対するアクションと、元画面のアクションでパラメータ名が一致するとは限らない。\nそのため、カスタムタグでは、元画面の入力項目のパラメータ名を変更するために以下のカスタムタグを提供する。\n\n* [changeParamNameタグ](../../component/libraries/libraries-tag-reference.md#tag-change-param-name-tag) (ポップアップ用のサブミット時にパラメータ名の変更)\n\n実装例\n画面イメージを以下に示す。\n\n![popup_postal_code.png](assets/libraries-tag/popup_postal_code.png)\n\n検索ボタンが選択されると、郵便番号欄に入力された番号に該当する住所を検索する別ウィンドウを開く。\n\n```jsp\n\n
\n \n \n \n 検索\n \n \n \n \n \n
\n
\n```\n\nオープンしたウィンドウへのアクセス方法\n別ウィンドウを開いた状態で元画面が遷移した場合、元画面が遷移するタイミングで不要となった別ウィンドウを全て閉じるなど、\nアプリケーションでオープンしたウィンドウにアクセスしたい場合がある。\nそのため、カスタムタグは、オープンしたウィンドウに対する参照をJavaScriptのグローバル変数に保持する。\nオープンしたウィンドウを保持する変数名を以下に示す。\n\n```javascript\n// keyはウィンドウ名\nvar nablarch_opened_windows = {};\n```\n\n元画面が遷移するタイミングで不要となった別ウィンドウを全て閉じる場合の実装例を以下に示す。\n\n```javascript\n// onunloadイベントハンドラにバインドする。\n// nablarch_opened_windows変数に保持されたWindowのclose関数を呼び出す。\nonunload = function() {\n for (var key in nablarch_opened_windows) {\n var openedWindow = nablarch_opened_windows[key];\n if (openedWindow && !openedWindow.closed) {\n openedWindow.close();\n }\n }\n return true;\n};\n```", + "content": "ユーザの操作性を向上させるために、複数ウィンドウを立ち上げたい場合がある。\n例えば、郵便番号の入力欄から住所検索など、検索画面を別ウィンドウで立ち上げ入力補助を行う場合がある。\n\nカスタムタグでは、複数ウィンドウの立ち上げをサポートするカスタムタグ(以降はポップアップタグと称す)を提供する。\n\n* [popupSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-submit-tag) (inputタグのボタン)\n* [popupButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-button-tag) (buttonタグのボタン)\n* [popupLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-popup-link-tag) (リンク)\n\n> **Important:**\n> これらのタグは、以下の問題点があるため非推奨とする。\n\n> * > 外部サイトへのリンクやボタンを作成した場合、一部のブラウザで新しいウィンドウでページを開けない。(例えば、IEの保護モードを有効にした場合発生する)\n\n> [aタグ](../../component/libraries/libraries-tag-reference.md#tag-a-tag) やhtmlタグを使用することでこの問題を回避できる。\n> * > サブウィンドウを用いた画面遷移は利便性が低い。\n\n> ページ内にポップアップウィンドウを表示する方式が一般的であり、サブウィンドウを用いた検索などは今や時代遅れである。\n> ページ内でのポップアップウィンドウの表示処理は、オープンソースライブラリを用いることで対応出来る。\n\nポップアップタグは、画面内のフォームに対するサブミットを行うカスタムタグと以下の点が異なる。\n\n* 新しいウィンドウをオープンし、オープンしたウィンドウに対してサブミットを行う。\n* 入力項目のパラメータ名を変更できる。\n\nポップアップは、JavaScriptのwindow.open関数を使用して実現する。\n\n実装例\n\n指定したスタイルでウィンドウを開く検索ボタンを作成する。\n\n```jsp\n\n\n 検索\n\n```\n\npopupWindowName属性が指定されない場合、 [カスタムタグの設定](../../component/libraries/libraries-tag.md#tag-setting) で\npopupWindowNameプロパティ\nに指定したデフォルト値が使用される。\nデフォルト値が設定されていない場合、カスタムタグは、JavaScriptのDate関数から取得した現在時刻(ミリ秒)を新しいウィンドウの名前に使用する。\nデフォルト値の指定有無により、ポップアップのデフォルト動作が以下のとおり決まる。\n\nデフォルト値を指定した場合\n\n常に同じウィンドウ名を使用するため、オープンするウィンドウが1つとなる。\n\nデフォルト値を指定しなかった場合\n\n常に異なるウィンドウ名を使用するため、常に新しいウィンドウをオープンする。\n\nパラメータ名変更\n\nポップアップタグは、元画面のフォームに含まれる全てのinput要素を動的に追加してサブミットする。\nポップアップタグにより開いたウィンドウに対するアクションと、元画面のアクションでパラメータ名が一致するとは限らない。\nそのため、カスタムタグでは、元画面の入力項目のパラメータ名を変更するために以下のカスタムタグを提供する。\n\n* [changeParamNameタグ](../../component/libraries/libraries-tag-reference.md#tag-change-param-name-tag) (ポップアップ用のサブミット時にパラメータ名の変更)\n\n実装例\n\n画面イメージを以下に示す。\n\n![popup_postal_code.png](assets/libraries-tag/popup_postal_code.png)\n\n検索ボタンが選択されると、郵便番号欄に入力された番号に該当する住所を検索する別ウィンドウを開く。\n\n```jsp\n\n
\n \n \n \n 検索\n \n \n \n \n \n
\n
\n```\n\nオープンしたウィンドウへのアクセス方法\n\n別ウィンドウを開いた状態で元画面が遷移した場合、元画面が遷移するタイミングで不要となった別ウィンドウを全て閉じるなど、\nアプリケーションでオープンしたウィンドウにアクセスしたい場合がある。\nそのため、カスタムタグは、オープンしたウィンドウに対する参照をJavaScriptのグローバル変数に保持する。\nオープンしたウィンドウを保持する変数名を以下に示す。\n\n```javascript\n// keyはウィンドウ名\nvar nablarch_opened_windows = {};\n```\n\n元画面が遷移するタイミングで不要となった別ウィンドウを全て閉じる場合の実装例を以下に示す。\n\n```javascript\n// onunloadイベントハンドラにバインドする。\n// nablarch_opened_windows変数に保持されたWindowのclose関数を呼び出す。\nonunload = function() {\n for (var key in nablarch_opened_windows) {\n var openedWindow = nablarch_opened_windows[key];\n if (openedWindow && !openedWindow.closed) {\n openedWindow.close();\n }\n }\n return true;\n};\n```", "level": 3 }, { "id": "s20", "title": "ファイルをダウンロードするボタン/リンクを作る", - "content": "ファイルをダウンロードするボタン/リンクを作るために、\nダウンロード専用のサブミットを行うカスタムタグ(以降はダウンロードタグと称す)と\nアクションの実装を容易にする HttpResponse\nのサブクラス(以降はダウンロードユーティリティと称す)を提供する。\n\nダウンロードタグ\n* [downloadSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-download-submit-tag) (inputタグのボタン)\n* [downloadButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-download-button-tag) (buttonタグのボタン)\n* [downloadLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-download-link-tag) (リンク)\nダウンロードユーティリティ\nStreamResponse\nストリームからHTTPレスポンスメッセージを生成するクラス。\nファイルシステム上のファイルやデータベースのBLOB型のカラムに格納したバイナリデータをダウンロードする場合に使用する。\nFile または Blob のダウンロードをサポートする。\nDataRecordResponse\nデータレコードからHTTPレスポンスメッセージを生成するクラス。\n検索結果など、アプリケーションで使用するデータをダウンロードする場合に使用する。\nダウンロードされるデータは [汎用データフォーマット](../../component/libraries/libraries-data-format.md#data-format) を使用してフォーマットされる。\nMap型データ( SqlRow など)のダウンロードをサポートする。\n\n> **Important:**\n> カスタムタグではフォームのサブミット制御にJavaScriptを使用しているため、\n> 画面内のフォームに対するサブミット( [submitタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-tag) など)でダウンロードすると、\n> 同じフォーム内の他のサブミットが機能しなくなる。\n> そこで、カスタムタグでは、画面内のフォームに影響を与えずにサブミットを行うダウンロードタグを提供する。\n> ダウンロードするボタンやリンクには必ずダウンロードタグを使用すること。\n\nダウンロードタグは、画面内のフォームに対するサブミットを行うカスタムタグと以下の点が異なる。\n\n* 新しいフォームを作成し、新規に作成したフォームに対してサブミットを行う。\n* 入力項目のパラメータ名を変更できる。\n\nパラメータ名の変更は、 [changeParamNameタグ](../../component/libraries/libraries-tag-reference.md#tag-change-param-name-tag) を使用して行う。\n[changeParamNameタグ](../../component/libraries/libraries-tag-reference.md#tag-change-param-name-tag) の使い方はポップアップタグと同じなので、\n[ポップアップ時のパラメータ名変更](../../component/libraries/libraries-tag.md#tag-submit-change-param-name) を参照。\n\nファイルのダウンロードの実装例\nボタンが押されたらサーバ上のファイルをダウンロードする。\n\nJSP\n```jsp\n\nダウンロード\n```\nアクション\n```java\npublic HttpResponse doTempFile(HttpRequest request, ExecutionContext context) {\n\n // ファイルを取得する処理はプロジェクトの実装方式に従う。\n File file = getTempFile();\n\n // Fileのダウンロードには、StreamResponseを使用する。\n // コンストラクタ引数にダウンロード対象のファイルと\n // リクエスト処理の終了時にファイルを削除する場合はtrue、削除しない場合はfalseを指定する。\n // ファイルの削除はフレームワークが行う。\n // 通常ダウンロード用のファイルはダウンロード後に不要となるためtrueを指定する。\n StreamResponse response = new StreamResponse(file, true);\n\n // Content-Typeヘッダ、Content-Dispositionヘッダを設定する。\n response.setContentType(\"application/pdf\");\n response.setContentDisposition(file.getName());\n\n return response;\n}\n```\nBLOB型カラムのダウンロードの実装例\nテーブルの行データ毎にリンクを表示し、\n選択されたリンクに対応するデータをダウンロードする。\n\nテーブル\n| カラム(論理名) | カラム(物理名) | データ型 | 補足 |\n|---|---|---|---|\n| ファイルID | FILE_ID | CHAR(3) | PK |\n| ファイル名 | FILE_NAME | NVARCHAR2(100) | |\n| ファイルデータ | FILE_DATA | BLOB | |\nJSP\n```jsp\n\n\n \n
\n \n \n ()\n \n \n \n
\n
\n```\nアクション\n```java\npublic HttpResponse tempFile(HttpRequest request, ExecutionContext context) {\n\n // fileIdパラメータを使用して選択されたリンクに対応する行データを取得する。\n SqlRow record = getRecord(request);\n\n // BlobのダウンロードにはStreamResponseクラスを使用する。\n StreamResponse response = new StreamResponse((Blob) record.get(\"FILE_DATA\"));\n\n // Content-Typeヘッダ、Content-Dispositionヘッダを設定する。*/\n response.setContentType(\"image/jpeg\");\n response.setContentDisposition(record.getString(\"FILE_NAME\"));\n return response;\n}\n```\nデータレコードのダウンロードの実装例\nテーブルの全データをCSV形式でダウンロードする。\n\nテーブル\n| カラム(論理名) | カラム(物理名) | データ型 | 補足 |\n|---|---|---|---|\n| メッセージID | MESSAGE_ID | CHAR(8) | PK |\n| 言語 | LANG | CHAR(2) | PK |\n| メッセージ | MESSAGE | NVARCHAR2(200) | |\nフォーマット定義\n```bash\n#-------------------------------------------------------------------------------\n# メッセージ一覧のCSVファイルフォーマット\n# N11AA001.fmtというファイル名でプロジェクトで規定された場所に配置する。\n#-------------------------------------------------------------------------------\nfile-type: \"Variable\"\ntext-encoding: \"Shift_JIS\" # 文字列型フィールドの文字エンコーディング\nrecord-separator: \"\\n\" # レコード区切り文字\nfield-separator: \",\" # フィールド区切り文字\n\n[header]\n1 messageId N \"メッセージID\"\n2 lang N \"言語\"\n3 message N \"メッセージ\"\n\n[data]\n1 messageId X # メッセージID\n2 lang X # 言語\n3 message N # メッセージ\n```\nJSP\n```jsp\n\n\n```\nアクション\n```java\npublic HttpResponse doCsvDataRecord(HttpRequest request, ExecutionContext context) {\n\n // レコードを取得する。\n SqlResultSet records = getRecords(request);\n\n // データレコードのダウンロードにはDataRecordResponseクラスを使用する。\n // コンストラクタ引数にフォーマット定義のベースパス論理名と\n // フォーマット定義のファイル名を指定する。\n DataRecordResponse response = new DataRecordResponse(\"format\", \"N11AA001\");\n\n // DataRecordResponse#writeメソッドを使用してヘッダを書き込む。\n // フォーマット定義に指定したデフォルトのヘッダ情報を使用するため、\n // 空のマップを指定する。\n response.write(\"header\", Collections.emptyMap());\n\n // DataRecordResponse#writeメソッドを使用してレコードを書き込む。\n for (SqlRow record : records) {\n\n // レコードを編集する場合はここで行う。\n\n response.write(\"data\", record);\n }\n\n // Content-Typeヘッダ、Content-Dispositionヘッダを設定する。*/\n response.setContentType(\"text/csv; charset=Shift_JIS\");\n response.setContentDisposition(\"メッセージ一覧.csv\");\n\n return response;\n}\n```", + "content": "ファイルをダウンロードするボタン/リンクを作るために、\nダウンロード専用のサブミットを行うカスタムタグ(以降はダウンロードタグと称す)と\nアクションの実装を容易にする HttpResponse\nのサブクラス(以降はダウンロードユーティリティと称す)を提供する。\n\nダウンロードタグ\n\n* [downloadSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-download-submit-tag) (inputタグのボタン)\n* [downloadButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-download-button-tag) (buttonタグのボタン)\n* [downloadLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-download-link-tag) (リンク)\n\nダウンロードユーティリティ\n\nStreamResponse\n\nストリームからHTTPレスポンスメッセージを生成するクラス。\nファイルシステム上のファイルやデータベースのBLOB型のカラムに格納したバイナリデータをダウンロードする場合に使用する。\nFile または Blob のダウンロードをサポートする。\n\nDataRecordResponse\n\nデータレコードからHTTPレスポンスメッセージを生成するクラス。\n検索結果など、アプリケーションで使用するデータをダウンロードする場合に使用する。\nダウンロードされるデータは [汎用データフォーマット](../../component/libraries/libraries-data-format.md#data-format) を使用してフォーマットされる。\nMap型データ( SqlRow など)のダウンロードをサポートする。\n\n> **Important:**\n> カスタムタグではフォームのサブミット制御にJavaScriptを使用しているため、\n> 画面内のフォームに対するサブミット( [submitタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-tag) など)でダウンロードすると、\n> 同じフォーム内の他のサブミットが機能しなくなる。\n> そこで、カスタムタグでは、画面内のフォームに影響を与えずにサブミットを行うダウンロードタグを提供する。\n> ダウンロードするボタンやリンクには必ずダウンロードタグを使用すること。\n\nダウンロードタグは、画面内のフォームに対するサブミットを行うカスタムタグと以下の点が異なる。\n\n* 新しいフォームを作成し、新規に作成したフォームに対してサブミットを行う。\n* 入力項目のパラメータ名を変更できる。\n\nパラメータ名の変更は、 [changeParamNameタグ](../../component/libraries/libraries-tag-reference.md#tag-change-param-name-tag) を使用して行う。\n[changeParamNameタグ](../../component/libraries/libraries-tag-reference.md#tag-change-param-name-tag) の使い方はポップアップタグと同じなので、\n[ポップアップ時のパラメータ名変更](../../component/libraries/libraries-tag.md#tag-submit-change-param-name) を参照。\n\nファイルのダウンロードの実装例\n\nボタンが押されたらサーバ上のファイルをダウンロードする。\n\nJSP\n\n```jsp\n\nダウンロード\n```\n\nアクション\n\n```java\npublic HttpResponse doTempFile(HttpRequest request, ExecutionContext context) {\n\n // ファイルを取得する処理はプロジェクトの実装方式に従う。\n File file = getTempFile();\n\n // Fileのダウンロードには、StreamResponseを使用する。\n // コンストラクタ引数にダウンロード対象のファイルと\n // リクエスト処理の終了時にファイルを削除する場合はtrue、削除しない場合はfalseを指定する。\n // ファイルの削除はフレームワークが行う。\n // 通常ダウンロード用のファイルはダウンロード後に不要となるためtrueを指定する。\n StreamResponse response = new StreamResponse(file, true);\n\n // Content-Typeヘッダ、Content-Dispositionヘッダを設定する。\n response.setContentType(\"application/pdf\");\n response.setContentDisposition(file.getName());\n\n return response;\n}\n```\n\nBLOB型カラムのダウンロードの実装例\n\nテーブルの行データ毎にリンクを表示し、\n選択されたリンクに対応するデータをダウンロードする。\n\nテーブル\n\n| カラム(論理名) | カラム(物理名) | データ型 | 補足 |\n|---|---|---|---|\n| ファイルID | FILE_ID | CHAR(3) | PK |\n| ファイル名 | FILE_NAME | NVARCHAR2(100) | |\n| ファイルデータ | FILE_DATA | BLOB | |\n\nJSP\n\n```jsp\n\n\n \n
\n \n \n ()\n \n \n \n
\n
\n```\n\nアクション\n\n```java\npublic HttpResponse tempFile(HttpRequest request, ExecutionContext context) {\n\n // fileIdパラメータを使用して選択されたリンクに対応する行データを取得する。\n SqlRow record = getRecord(request);\n\n // BlobのダウンロードにはStreamResponseクラスを使用する。\n StreamResponse response = new StreamResponse((Blob) record.get(\"FILE_DATA\"));\n\n // Content-Typeヘッダ、Content-Dispositionヘッダを設定する。*/\n response.setContentType(\"image/jpeg\");\n response.setContentDisposition(record.getString(\"FILE_NAME\"));\n return response;\n}\n```\n\nデータレコードのダウンロードの実装例\n\nテーブルの全データをCSV形式でダウンロードする。\n\nテーブル\n\n| カラム(論理名) | カラム(物理名) | データ型 | 補足 |\n|---|---|---|---|\n| メッセージID | MESSAGE_ID | CHAR(8) | PK |\n| 言語 | LANG | CHAR(2) | PK |\n| メッセージ | MESSAGE | NVARCHAR2(200) | |\n\nフォーマット定義\n\n```bash\n#-------------------------------------------------------------------------------\n# メッセージ一覧のCSVファイルフォーマット\n# N11AA001.fmtというファイル名でプロジェクトで規定された場所に配置する。\n#-------------------------------------------------------------------------------\nfile-type: \"Variable\"\ntext-encoding: \"Shift_JIS\" # 文字列型フィールドの文字エンコーディング\nrecord-separator: \"\\n\" # レコード区切り文字\nfield-separator: \",\" # フィールド区切り文字\n\n[header]\n1 messageId N \"メッセージID\"\n2 lang N \"言語\"\n3 message N \"メッセージ\"\n\n[data]\n1 messageId X # メッセージID\n2 lang X # 言語\n3 message N # メッセージ\n```\n\nJSP\n\n```jsp\n\n\n```\n\nアクション\n\n```java\npublic HttpResponse doCsvDataRecord(HttpRequest request, ExecutionContext context) {\n\n // レコードを取得する。\n SqlResultSet records = getRecords(request);\n\n // データレコードのダウンロードにはDataRecordResponseクラスを使用する。\n // コンストラクタ引数にフォーマット定義のベースパス論理名と\n // フォーマット定義のファイル名を指定する。\n DataRecordResponse response = new DataRecordResponse(\"format\", \"N11AA001\");\n\n // DataRecordResponse#writeメソッドを使用してヘッダを書き込む。\n // フォーマット定義に指定したデフォルトのヘッダ情報を使用するため、\n // 空のマップを指定する。\n response.write(\"header\", Collections.emptyMap());\n\n // DataRecordResponse#writeメソッドを使用してレコードを書き込む。\n for (SqlRow record : records) {\n\n // レコードを編集する場合はここで行う。\n\n response.write(\"data\", record);\n }\n\n // Content-Typeヘッダ、Content-Dispositionヘッダを設定する。*/\n response.setContentType(\"text/csv; charset=Shift_JIS\");\n response.setContentDisposition(\"メッセージ一覧.csv\");\n\n return response;\n}\n```", "level": 3 }, { "id": "s21", "title": "二重サブミットを防ぐ", - "content": "二重サブミットの防止は、データベースにコミットを伴う処理を要求する画面で使用する。\n二重サブミットの防止方法は、クライアント側とサーバ側の2つがあり、2つの防止方法を併用する。\n\nクライアント側では、ユーザが誤ってボタンをダブルクリックした場合や、\nリクエストを送信したがサーバからのレスポンスが返ってこないので再度ボタンをクリックした場合に、\nリクエストを2回以上送信するのを防止する。\n\n一方、サーバ側では、ブラウザの戻るボタンにより完了画面から確認画面に遷移し再度サブミットした場合など、\nアプリケーションが既に処理済みのリクエストを重複して処理しないように、処理済みリクエストの受け付けを防止する。\n\n> **Important:**\n> 二重サブミットを防止する画面では、どちらか一方のみ使用した場合は以下の懸念がある。\n\n> * > クライアント側のみ使用した場合は、リクエストを重複して処理する恐れがある。\n> * > サーバ側のみ使用した場合は、ボタンのダブルクリックにより2回リクエストが送信されると、\n> サーバ側の処理順によっては二重サブミットエラーが返されてしまい、ユーザに処理結果が返されない恐れがある。\n\nクライアント側の二重サブミット防止\nクライアント側では、JavaScriptを使用して実現する。\n1回目のサブミット時に対象要素のonclick属性を書き換え、2回目以降のサブミット要求はサーバ側に送信しないことで防止する。\nさらにボタンの場合は、disabled属性を設定し、画面上でボタンをクリックできない状態にする。\n\n次のカスタムタグが対応している。\n\nフォームのサブミット\n[submitタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-tag) (inputタグのボタン)\n[buttonタグ](../../component/libraries/libraries-tag-reference.md#tag-button-tag) (buttonタグのボタン)\n[submitLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-link-tag) (リンク)\nダウンロード用のサブミット\n[downloadSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-download-submit-tag) (inputタグのボタン)\n[downloadButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-download-button-tag) (buttonタグのボタン)\n[downloadLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-download-link-tag) (リンク)\n\n上記カスタムタグのallowDoubleSubmission属性に `false` を指定することで、\n特定のボタン及びリンクだけを対象に二重サブミットを防止する。\n\n実装例\n登録ボタンはデータベースにコミットを行うので、登録ボタンのみ二重サブミットを防止する。\n\n```jsp\n\n\n\n```\n\n> **Tip:**\n> クライアント側の二重サブミット防止を使用している画面では、\n> サブミット後にサーバ側からレスポンスが返ってこない(サーバ側の処理が重たいなど)ため、\n> ユーザがブラウザの中止ボタンを押した場合、\n> ボタンはクリックできない状態(disabled属性により非活性)が続くため、再度サブミットできなくなる。\n> この場合、ユーザは、サブミットに使用したボタン以外のボタン又はリンクを使用して処理を継続できる。\n\n> **Tip:**\n> アプリケーションで二重サブミット発生時の振る舞いを追加したい場合は、\n> [クライアント側の二重サブミット防止で、二重サブミット発生時の振る舞いを追加する](../../component/libraries/libraries-tag.md#tag-double-submission-client-side-change) を参照。\n\nサーバ側の二重サブミット防止\nサーバ側では、サーバ側で発行した一意なトークンをサーバ側(セッション)とクライアント側(hiddenタグ)に保持し、\nサーバ側で突合することで実現する。このトークンは、1回のチェックに限り有効である。\n\nサーバ側の二重サブミット防止では、トークンを設定するJSPまたはアクションと、トークンのチェックを行うアクションにおいて、\nそれぞれ作業が必要となる。\n\nJSPでトークンの設定を行う\n[formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) のuseToken属性を指定することで行う。\n\n実装例\n```jsp\n\n\n```\nアクションでトークンの設定を行う\nJSP以外のテンプレートエンジンを採用している場合はこちらの設定方法を使用する。\n[UseTokenインターセプタ](../../component/handlers/handlers-use-token.md#use-token-interceptor) で設定する。\n使用方法の詳細は、 [UseTokenインターセプタ](../../component/handlers/handlers-use-token.md#use-token-interceptor) を参照。\nトークンのチェック\nトークンのチェックは、 [OnDoubleSubmissionインターセプタ](../../component/handlers/handlers-on-double-submission.md#on-double-submission-interceptor) を使用する。\n使用方法の詳細は、 [OnDoubleSubmissionインターセプタ](../../component/handlers/handlers-on-double-submission.md#on-double-submission-interceptor) を参照。\nセッションスコープに保存するキーを変更する\n発行されたトークンはセッションスコープに\"/nablarch_session_token\"というキーで保存される。\nこのキーはコンポーネント設定ファイルで変更できる。\n\n設定例\n```xml\n\n \n \n\n```\nリクエストスコープに保存するキーを変更する\n発行されたトークンはThymeleafなどのテンプレートに埋め込むときに使用できるよう、リクエストスコープに\"nablarch_request_token\"というキーで保存される。\nこのキーはコンポーネント設定ファイルで変更できる。\n\n設定例\n```xml\n\n \n \n\n```\nhiddenに埋め込むときのname属性を変更する\nトークンをhiddenに埋め込むとき、name属性は\"nablarch_token\"という値を設定する。\nこのname属性値はコンポーネント設定ファイルで変更できる。\n\n設定例\n```xml\n\n \n \n\n```\n\n> **Important:**\n> サーバ側の二重サブミット防止では、トークンをサーバ側のセッションに格納しているため、\n> 同一ユーザの複数リクエストに対して、別々にトークンをチェックできない。\n\n> このため、同一ユーザにおいて、サーバ側の二重サブミットを防止する画面遷移\n> (登録確認→登録完了や更新確認→更新完了など)のみ、\n> 複数ウィンドウや複数タブを使用して並行で行うことができない。\n\n> これらの画面遷移を並行して行った場合は、後に確認画面に遷移した画面のみ処理を継続でき、\n> 先に確認画面に遷移した画面はトークンが古いため、二重サブミットエラーとなる。\n\n> **Tip:**\n> トークンの発行は、 UUIDV4TokenGenerator が行う。\n> UUIDV4TokenGenerator\n> では、36文字のランダムな文字列を生成する。\n> トークンの発行処理を変更したい場合は、[サーバ側の二重サブミット防止で、トークンの発行処理を変更する](../../component/libraries/libraries-tag.md#tag-double-submission-server-side-change) を参照。", + "content": "二重サブミットの防止は、データベースにコミットを伴う処理を要求する画面で使用する。\n二重サブミットの防止方法は、クライアント側とサーバ側の2つがあり、2つの防止方法を併用する。\n\nクライアント側では、ユーザが誤ってボタンをダブルクリックした場合や、\nリクエストを送信したがサーバからのレスポンスが返ってこないので再度ボタンをクリックした場合に、\nリクエストを2回以上送信するのを防止する。\n\n一方、サーバ側では、ブラウザの戻るボタンにより完了画面から確認画面に遷移し再度サブミットした場合など、\nアプリケーションが既に処理済みのリクエストを重複して処理しないように、処理済みリクエストの受け付けを防止する。\n\n> **Important:**\n> 二重サブミットを防止する画面では、どちらか一方のみ使用した場合は以下の懸念がある。\n\n> * > クライアント側のみ使用した場合は、リクエストを重複して処理する恐れがある。\n> * > サーバ側のみ使用した場合は、ボタンのダブルクリックにより2回リクエストが送信されると、\n> サーバ側の処理順によっては二重サブミットエラーが返されてしまい、ユーザに処理結果が返されない恐れがある。\n\nクライアント側の二重サブミット防止\n\nクライアント側では、JavaScriptを使用して実現する。\n1回目のサブミット時に対象要素のonclick属性を書き換え、2回目以降のサブミット要求はサーバ側に送信しないことで防止する。\nさらにボタンの場合は、disabled属性を設定し、画面上でボタンをクリックできない状態にする。\n\n次のカスタムタグが対応している。\n\nフォームのサブミット\n\n[submitタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-tag) (inputタグのボタン)\n[buttonタグ](../../component/libraries/libraries-tag-reference.md#tag-button-tag) (buttonタグのボタン)\n[submitLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-submit-link-tag) (リンク)\n\nダウンロード用のサブミット\n\n[downloadSubmitタグ](../../component/libraries/libraries-tag-reference.md#tag-download-submit-tag) (inputタグのボタン)\n[downloadButtonタグ](../../component/libraries/libraries-tag-reference.md#tag-download-button-tag) (buttonタグのボタン)\n[downloadLinkタグ](../../component/libraries/libraries-tag-reference.md#tag-download-link-tag) (リンク)\n\n上記カスタムタグのallowDoubleSubmission属性に `false` を指定することで、\n特定のボタン及びリンクだけを対象に二重サブミットを防止する。\n\n実装例\n\n登録ボタンはデータベースにコミットを行うので、登録ボタンのみ二重サブミットを防止する。\n\n```jsp\n\n\n\n```\n\n> **Tip:**\n> クライアント側の二重サブミット防止を使用している画面では、\n> サブミット後にサーバ側からレスポンスが返ってこない(サーバ側の処理が重たいなど)ため、\n> ユーザがブラウザの中止ボタンを押した場合、\n> ボタンはクリックできない状態(disabled属性により非活性)が続くため、再度サブミットできなくなる。\n> この場合、ユーザは、サブミットに使用したボタン以外のボタン又はリンクを使用して処理を継続できる。\n\n> **Tip:**\n> アプリケーションで二重サブミット発生時の振る舞いを追加したい場合は、\n> [クライアント側の二重サブミット防止で、二重サブミット発生時の振る舞いを追加する](../../component/libraries/libraries-tag.md#tag-double-submission-client-side-change) を参照。\n\nサーバ側の二重サブミット防止\n\nサーバ側では、サーバ側で発行した一意なトークンをサーバ側(セッション)とクライアント側(hiddenタグ)に保持し、\nサーバ側で突合することで実現する。このトークンは、1回のチェックに限り有効である。\n\nサーバ側の二重サブミット防止では、トークンを設定するJSPまたはアクションと、トークンのチェックを行うアクションにおいて、\nそれぞれ作業が必要となる。\n\nJSPでトークンの設定を行う\n\n[formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) のuseToken属性を指定することで行う。\n\n実装例\n\n```jsp\n\n\n```\n\nアクションでトークンの設定を行う\n\nJSP以外のテンプレートエンジンを採用している場合はこちらの設定方法を使用する。\n[UseTokenインターセプタ](../../component/handlers/handlers-use-token.md#use-token-interceptor) で設定する。\n使用方法の詳細は、 [UseTokenインターセプタ](../../component/handlers/handlers-use-token.md#use-token-interceptor) を参照。\n\nトークンのチェック\n\nトークンのチェックは、 [OnDoubleSubmissionインターセプタ](../../component/handlers/handlers-on-double-submission.md#on-double-submission-interceptor) を使用する。\n使用方法の詳細は、 [OnDoubleSubmissionインターセプタ](../../component/handlers/handlers-on-double-submission.md#on-double-submission-interceptor) を参照。\n\nセッションスコープに保存するキーを変更する\n\n発行されたトークンはセッションスコープに\"/nablarch_session_token\"というキーで保存される。\nこのキーはコンポーネント設定ファイルで変更できる。\n\n設定例\n\n```xml\n\n \n \n\n```\n\nリクエストスコープに保存するキーを変更する\n\n発行されたトークンはThymeleafなどのテンプレートに埋め込むときに使用できるよう、リクエストスコープに\"nablarch_request_token\"というキーで保存される。\nこのキーはコンポーネント設定ファイルで変更できる。\n\n設定例\n\n```xml\n\n \n \n\n```\n\nhiddenに埋め込むときのname属性を変更する\n\nトークンをhiddenに埋め込むとき、name属性は\"nablarch_token\"という値を設定する。\nこのname属性値はコンポーネント設定ファイルで変更できる。\n\n設定例\n\n```xml\n\n \n \n\n```\n\n> **Important:**\n> サーバ側の二重サブミット防止では、トークンをサーバ側のセッションに格納しているため、\n> 同一ユーザの複数リクエストに対して、別々にトークンをチェックできない。\n\n> このため、同一ユーザにおいて、サーバ側の二重サブミットを防止する画面遷移\n> (登録確認→登録完了や更新確認→更新完了など)のみ、\n> 複数ウィンドウや複数タブを使用して並行で行うことができない。\n\n> これらの画面遷移を並行して行った場合は、後に確認画面に遷移した画面のみ処理を継続でき、\n> 先に確認画面に遷移した画面はトークンが古いため、二重サブミットエラーとなる。\n\n> **Tip:**\n> トークンの発行は、 UUIDV4TokenGenerator が行う。\n> UUIDV4TokenGenerator\n> では、36文字のランダムな文字列を生成する。\n> トークンの発行処理を変更したい場合は、[サーバ側の二重サブミット防止で、トークンの発行処理を変更する](../../component/libraries/libraries-tag.md#tag-double-submission-server-side-change) を参照。", "level": 3 }, { @@ -139,55 +139,55 @@ { "id": "s23", "title": "入力画面と確認画面を共通化する", - "content": "[入力項目のカスタムタグ](../../component/libraries/libraries-tag-reference.md#tag-reference-input) は、\n入力画面と全く同じJSP記述のまま、確認画面用を出力できる。\n\n入力画面と確認画面の共通化は、以下のカスタムタグを使用する。\n\n[confirmationPageタグ](../../component/libraries/libraries-tag-reference.md#tag-confirmation-page-tag)\n確認画面のJSPで入力画面のJSPへのパスを指定して、入力画面と確認画面の共通化を行う。\n[forInputPageタグ](../../component/libraries/libraries-tag-reference.md#tag-for-input-page-tag)\n入力画面でのみ表示したい部分を指定する。\n[forConfirmationPageタグ](../../component/libraries/libraries-tag-reference.md#tag-for-confirmation-page-tag)\n確認画面でのみ表示したい部分を指定する。\n[ignoreConfirmationタグ](../../component/libraries/libraries-tag-reference.md#tag-ignore-confirmation-tag)\n確認画面で、確認画面向けの表示を無効化したい部分に指定する。\n例えば、チェックボックスを使用した項目で、確認画面でもチェック欄を表示したい場合などに使用する。\n\n> **Tip:**\n> 入力・確認画面の表示制御は入力系のタグが対象となる。\n> ただし、以下のタグに関しては異なる動作となる。\n\n> [plainHiddenタグ](../../component/libraries/libraries-tag-reference.md#tag-plain-hidden-tag)\n> 画面遷移の状態などを画面間で受け渡す目的で使用することを想定し、入力・確認画面ともに出力する。\n> [hiddenStoreタグ](../../component/libraries/libraries-tag-reference.md#tag-hidden-store-tag)\n> [セッションストア](../../component/libraries/libraries-session-store.md#session-store) に保存したデータを画面間で受け渡すために使用するため、入力・確認画面ともに出力する。\n\n実装例\n以下の画面を出力するJSPの実装例を示す。\n\n![make_common_input_confirm.png](assets/libraries-tag/make_common_input_confirm.png)\n\n入力画面のJSP\n```jsp\n\n \n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n
\n \n \n \n \n \n \n \n
\n
\n```\n確認画面のJSP\n```jsp\n\n\n```", + "content": "[入力項目のカスタムタグ](../../component/libraries/libraries-tag-reference.md#tag-reference-input) は、\n入力画面と全く同じJSP記述のまま、確認画面用を出力できる。\n\n入力画面と確認画面の共通化は、以下のカスタムタグを使用する。\n\n[confirmationPageタグ](../../component/libraries/libraries-tag-reference.md#tag-confirmation-page-tag)\n\n確認画面のJSPで入力画面のJSPへのパスを指定して、入力画面と確認画面の共通化を行う。\n\n[forInputPageタグ](../../component/libraries/libraries-tag-reference.md#tag-for-input-page-tag)\n\n入力画面でのみ表示したい部分を指定する。\n\n[forConfirmationPageタグ](../../component/libraries/libraries-tag-reference.md#tag-for-confirmation-page-tag)\n\n確認画面でのみ表示したい部分を指定する。\n\n[ignoreConfirmationタグ](../../component/libraries/libraries-tag-reference.md#tag-ignore-confirmation-tag)\n\n確認画面で、確認画面向けの表示を無効化したい部分に指定する。\n例えば、チェックボックスを使用した項目で、確認画面でもチェック欄を表示したい場合などに使用する。\n\n> **Tip:**\n> 入力・確認画面の表示制御は入力系のタグが対象となる。\n> ただし、以下のタグに関しては異なる動作となる。\n\n> [plainHiddenタグ](../../component/libraries/libraries-tag-reference.md#tag-plain-hidden-tag)\n\n> 画面遷移の状態などを画面間で受け渡す目的で使用することを想定し、入力・確認画面ともに出力する。\n\n> [hiddenStoreタグ](../../component/libraries/libraries-tag-reference.md#tag-hidden-store-tag)\n\n> [セッションストア](../../component/libraries/libraries-session-store.md#session-store) に保存したデータを画面間で受け渡すために使用するため、入力・確認画面ともに出力する。\n\n実装例\n\n以下の画面を出力するJSPの実装例を示す。\n\n![make_common_input_confirm.png](assets/libraries-tag/make_common_input_confirm.png)\n\n入力画面のJSP\n\n```jsp\n\n \n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n
\n \n \n \n \n \n \n \n
\n
\n```\n\n確認画面のJSP\n\n```jsp\n\n\n```", "level": 3 }, { "id": "s24", "title": "変数に値を設定する", - "content": "画面タイトルなど、ページ内の複数箇所に同じ内容で出力する値は、\nJSP上の変数に格納したものを参照することで、メンテナンス性を高められる。\n\nカスタムタグでは変数に値を設定する [setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) を提供する。\n\n実装例\n画面タイトルを変数に設定して使用する。\n\n```jsp\n\n\n\n \n <n:write name=\"title\" />\n\n\n

\n\n```\n\n> **Important:**\n> [setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) で設定した変数を使用して出力する場合、\n> [setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) ではHTMLエスケープ処理を実施しないため、実装例のように [writeタグ](../../component/libraries/libraries-tag-reference.md#tag-write-tag) を使用して出力すること。\n\n変数を格納するスコープを指定する\n変数を格納するスコープは、scope属性で指定する。\nscope属性には、リクエストスコープ(request)又はページスコープ(page)を指定する。\n\nscope属性の指定がない場合、変数はリクエストスコープに設定される。\n\nページスコープは、アプリケーション全体で使用されるUI部品を作成する場合に、他JSPの変数とのバッティングを防ぎたい場合に使用する。\n変数に配列やコレクションの値を設定する\n[setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) は、name属性が指定された場合、デフォルトで単一値として値を取得する。\n単一値での値取得では、name属性に対応する値が配列やコレクションの場合に先頭の要素を返す。\n\n多くのケースはデフォルトのままで問題ないが、共通で使用されるUI部品を作成する場合に、\n配列やコレクションをそのまま取得したい場合がある。\n\nこのようなケースでは、 [setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) のbySingleValue属性に `false` を指定することで、\n配列やコレクションをそのまま取得できる。", + "content": "画面タイトルなど、ページ内の複数箇所に同じ内容で出力する値は、\nJSP上の変数に格納したものを参照することで、メンテナンス性を高められる。\n\nカスタムタグでは変数に値を設定する [setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) を提供する。\n\n実装例\n\n画面タイトルを変数に設定して使用する。\n\n```jsp\n\n\n\n \n <n:write name=\"title\" />\n\n\n

\n\n```\n\n> **Important:**\n> [setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) で設定した変数を使用して出力する場合、\n> [setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) ではHTMLエスケープ処理を実施しないため、実装例のように [writeタグ](../../component/libraries/libraries-tag-reference.md#tag-write-tag) を使用して出力すること。\n\n変数を格納するスコープを指定する\n\n変数を格納するスコープは、scope属性で指定する。\nscope属性には、リクエストスコープ(request)又はページスコープ(page)を指定する。\n\nscope属性の指定がない場合、変数はリクエストスコープに設定される。\n\nページスコープは、アプリケーション全体で使用されるUI部品を作成する場合に、他JSPの変数とのバッティングを防ぎたい場合に使用する。\n\n変数に配列やコレクションの値を設定する\n\n[setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) は、name属性が指定された場合、デフォルトで単一値として値を取得する。\n単一値での値取得では、name属性に対応する値が配列やコレクションの場合に先頭の要素を返す。\n\n多くのケースはデフォルトのままで問題ないが、共通で使用されるUI部品を作成する場合に、\n配列やコレクションをそのまま取得したい場合がある。\n\nこのようなケースでは、 [setタグ](../../component/libraries/libraries-tag-reference.md#tag-set-tag) のbySingleValue属性に `false` を指定することで、\n配列やコレクションをそのまま取得できる。", "level": 3 }, { "id": "s25", "title": "GETリクエストを使用する", - "content": "検索エンジン等のクローラ対策、および利用者がブックマーク可能なURLとするために、GETリクエストの使用が必要となる場合がある。\n\nカスタムタグは、 [hidden暗号化](../../component/libraries/libraries-tag.md#tag-hidden-encryption) や\n[パラメータ追加](../../component/libraries/libraries-tag.md#tag-submit-change-parameter) といった機能を実現するため、\nhiddenパラメータを出力して使用している。\nそのため、 [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) を使用してGETリクエストを行おうとすると、業務機能として必要なパラメータに加えて、\nこのhiddenパラメータがURLに付与されてしまう。\nその結果、不要なパラメータが付くことに加えて、URLの長さ制限により正しくリクエストできない可能性がある。\n\nそこで、カスタムタグは、 [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) でGETが指定された場合、hiddenパラメータを出力しない。\nこれにより、 [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) でGETリクエストを使用しても上記問題が発生しないが、\nhiddenパラメータが出力されないことで、使用制限のあるカスタムタグや使用不可となるカスタムタグが出てくる。\nここでは、それらのカスタムタグについて対応方法を説明する。\n\n使用制限のあるカスタムタグ\n使用制限のあるカスタムタグを以下に示す。\n\n* [checkboxタグ](../../component/libraries/libraries-tag-reference.md#tag-checkbox-tag)\n* [codeCheckboxタグ](../../component/libraries/libraries-tag-reference.md#tag-code-checkbox-tag)\n\nこれらのカスタムタグは、 [チェックなしの場合にリクエストパラメータを設定する機能](../../component/libraries/libraries-tag.md#tag-checkbox-off-value) があるが、\n[hidden暗号化](../../component/libraries/libraries-tag.md#tag-hidden-encryption) を使用して処理を行っているため、GETリクエストでは使用できない。\n\n対応方法\nGETリクエストでチェックボックスを使用した場合のチェックなしの判定は、\n[バリデーション](../../component/libraries/libraries-validation.md#validation) 後に該当項目の値についてnull判定で行う。\nそして、null判定の結果でチェック有無を判断し、アクション側でチェックなしに対する値を設定する。\n使用不可となるカスタムタグ\n使用不可となるカスタムタグを以下に示す。\n\n* [hiddenタグ](../../component/libraries/libraries-tag.md#tag-using-get-hidden-tag)\n* [submitタグ](../../component/libraries/libraries-tag.md#tag-using-get-submit-tag)\n* [buttonタグ](../../component/libraries/libraries-tag.md#tag-using-get-button-tag)\n* [submitLinkタグ](../../component/libraries/libraries-tag.md#tag-using-get-submit-link-tag)\n* [popupSubmitタグ](../../component/libraries/libraries-tag.md#tag-using-get-popup-submit-tag)\n* [popupButtonタグ](../../component/libraries/libraries-tag.md#tag-using-get-popup-button-tag)\n* [popupLinkタグ](../../component/libraries/libraries-tag.md#tag-using-get-popup-link-tag)\n* [paramタグ](../../component/libraries/libraries-tag.md#tag-using-get-param-tag)\n* [changeParamNameタグ](../../component/libraries/libraries-tag.md#tag-using-get-change-param-name-tag)\n\n使用不可のタグに対する対応方法と実装例を以下に示す。\n\nhiddenタグ\n対応方法\n[plainHiddenタグ](../../component/libraries/libraries-tag-reference.md#tag-plain-hidden-tag) を使用する。\n実装例\n```jsp\n<%-- POSTの場合 --%>\n\n\n<%-- GETの場合 --%>\n\n```\n\nsubmitタグ\n対応方法\nHTMLのinputタグ(type=”submit”)を使用する。\nサブミット先のURIは [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) のaction属性に指定する。\n実装例\n```jsp\n<%-- POSTの場合 --%>\n\n \n\n\n<%-- GETの場合 --%>\n\n \n\n```\n\nbuttonタグ\n対応方法\nHTMLのbuttonタグ(type=”submit”)を使用する。\nサブミット先のURIは [formタグ](../../component/libraries/libraries-tag-reference.md#tag-form-tag) のaction属性に指定する。\n実装例\n```jsp\n<%-- POSTの場合 --%>\n\n \n\n\n<%-- GETの場合 --%>\n\n