Nablarch（RESTfulウェブサービス）で、データベースを使わないプロジェクトを作る

# What's？

Nablarchを使ってサンプルを作ろうと思う時に、動作確認などでデータベースを使わなくても済む程度の簡易なものを作るには？という話で。

[Nablarch アプリケーションフレームワーク](https://fintan.jp/?p=304)

ブランクプロジェクトから、データベースに依存するコンポーネントを切り離すまでをまとめてみます。


# 対象

Nablarchは`5u18`を使います。また、ブランクプロジェクトはRESTfulウェブサービスのアーキタイプを選びます。

[RESTfulウェブサービスプロジェクトの初期セットアップ](https://nablarch.github.io/docs/5u18/doc/application_framework/application_framework/blank_project/setup_blankProject/setup_WebService.html)

[RESTfulウェブサービス編](https://nablarch.github.io/docs/5u18/doc/application_framework/application_framework/web_service/rest/index.html)

こちらを使ってプロジェクトを作成し、データベースに依存するコンポーネントを外し、新しくアクションクラスを作って動くところを確認するまでをゴールにしましょう。


# 環境

今回の環境は、こちらです。

```shell
$ java --version
openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 11.0.9.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-64-generic", arch: "amd64", family: "unix"
```


# プロジェクトの作成

まずは、プロジェクトを作成します。

```shell
mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
  -DinteractiveMode=false \
  -DarchetypeGroupId=com.nablarch.archetype \
  -DarchetypeArtifactId=nablarch-jaxrs-archetype \
  -DarchetypeVersion=5u18 \
  -DgroupId=com.example \
  -DartifactId=hello-jaxrs \
  -Dversion=0.0.1-SNAPSHOT \
  -Dpackage=com.example.jaxrs
```

コマンドは、こちらを使いました。

[Maven Archetype Pluginを直接使って、Nablarchのブランクプロジェクトを作成する](https://qiita.com/charon/items/772a2317392874761e04)

作成したプロジェクト内に移動。

```shell
$ cd hello-jaxrs
```


# Java 11に対応させる

とりあえず、なにも考えずに1度ビルドしてみましょう。

```shell
$ mvn package -DskipTests=true
```

コンパイルエラーになります。

```shell
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /path/to/hello-jaxrs/src/main/java/com/example/jaxrs/dto/SampleUserListDto.java:[6,33] パッケージjavax.xml.bind.annotationは存在しません
[ERROR] /path/to/hello-jaxrs/src/main/java/com/example/jaxrs/dto/SampleUserListDto.java:[7,33] パッケージjavax.xml.bind.annotationは存在しません
[ERROR] /path/to/hello-jaxrs/src/main/java/com/example/jaxrs/dto/SampleUserListDto.java:[8,33] パッケージjavax.xml.bind.annotationは存在しません
[ERROR] /path/to/hello-jaxrs/src/main/java/com/example/jaxrs/dto/SampleUserListDto.java:[9,33] パッケージjavax.xml.bind.annotationは存在しません
[ERROR] /path/to/hello-jaxrs/src/main/java/com/example/jaxrs/dto/SampleUserListDto.java:[18,2] シンボルを見つけられません
  シンボル: クラス XmlRootElement
[ERROR] /path/to/hello-jaxrs/src/main/java/com/example/jaxrs/dto/SampleUserListDto.java:[19,2] シンボルを見つけられません
  シンボル: クラス XmlAccessorType
[ERROR] /path/to/hello-jaxrs/src/main/java/com/example/jaxrs/dto/SampleUserListDto.java:[19,18] シンボルを見つけられません
  シンボル: 変数 XmlAccessType
[ERROR] /path/to/hello-jaxrs/src/main/java/com/example/jaxrs/dto/SampleUserListDto.java:[22,6] シンボルを見つけられません
  シンボル:   クラス XmlElement
  場所: クラス com.example.jaxrs.dto.SampleUserListDto
[INFO] 8 errors 
[INFO] -------------------------------------------------------------
```

Java 8前提になっているようなので、Java 11に変更しましょう。…今回のお題の本筋ではないですけど。

[Java11で使用する場合のセットアップ方法](https://nablarch.github.io/docs/5u18/doc/application_framework/application_framework/blank_project/setup_blankProject/setup_Java11.html)

コンパイラーの指定と

```xml
    <!-- ソース及びclassファイルが準拠するJavaのバージョン-->
    <java.version>11</java.version>
```

Maven依存関係を追加。

```xml
  <dependency>
    <groupId>com.sun.activation</groupId>
    <artifactId>javax.activation</artifactId>
    <version>1.2.0</version>
  </dependency>
  <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
  </dependency>
  <dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
  </dependency>
  <dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
  </dependency>
  <dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
  </dependency>
```

これで、ビルドが通るようになります。

```shell
$ mvn package -DskipTests=true
```


# H2への依存関係を削除する

`development`プロファイルのみですが、`pom.xml`にデータベースに関する依存関係が含まれているので明示的に削除しておきます。

```xml:pom.xml
    <profile>
      <id>development</id>
```

こちらですね。

```xml:pom.xml
        <!-- TODO: プロジェクトで使用するDB製品にあわせたJDBCドライバに修正してください。 -->
        <!--
        <dependency>
          <groupId>com.h2database</groupId>
          <artifactId>h2</artifactId>
          <version>1.3.176</version>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>com.zaxxer</groupId>
          <artifactId>HikariCP</artifactId>
          <version>3.3.1</version>
          <scope>runtime</scope>
        </dependency>
        -->
```

入ったままでもいい気はしますが、こういう時は削除した状態で確認するのが筋でしょう。


# データベースに関連するコンポーネントを削除する

次に、`src/main/resources/rest-component-configuration.xml`からデータベースに依存するコンポーネントを削除していきます。

まずは、このあたりに関する内容を削除。

[コード管理](https://nablarch.github.io/docs/5u18/doc/application_framework/application_framework/libraries/code.html)

[デフォルト設定一覧](https://nablarch.github.io/docs/5u18/doc/application_framework/application_framework/configuration/index.html)

```xml:src/main/resources/rest-component-configuration.xml
  <!-- テーブル定義 -->
  <!--
  <import file="nablarch/schema-config.xml" />
  -->

  <!-- コード機能 -->
  <!--
  <import file="nablarch/common/code.xml"/>
  -->
```

```xml:src/main/resources/rest-component-configuration.xml
  <!-- データベース設定 -->
  <!--
  下記設定ファイルを使用することで、JNDIを用いてコネクションがルックアップされる
  ルックアップに使用する名前は、configファイル中で、「nablarch.connectionFactory.jndiResourceName」というプレースホルダーに設定する。

  ローカルのデータソースからコネクションを取得したい場合は、アーキタイプから生成した直後のプロジェクトに含まれるdb-for-webui_dev.xmlを参考に設定すること。
  -->
  <!--
  <import file="nablarch/webui/db-for-webui.xml"/>
  -->
```

ハンドラキューも、データベース接続やトランザクションに関するものを削除します。

[データベース接続管理ハンドラ](https://nablarch.github.io/docs/5u18/doc/application_framework/application_framework/handlers/common/database_connection_management_handler.html)

[トランザクション制御ハンドラ](https://nablarch.github.io/docs/5u18/doc/application_framework/application_framework/handlers/common/transaction_management_handler.html)

```xml:src/main/resources/rest-component-configuration.xml
  <!-- ハンドラキュー構成 -->
  <component name="webFrontController" class="nablarch.fw.web.servlet.WebFrontController">
    <property name="handlerQueue">
```

```xml
        <!--
        <component-ref name="dbConnectionManagementHandler"/>

        <component-ref name="transactionManagementHandler"/>
        -->
```

初期化部分からも削除。

[システムリポジトリ](https://nablarch.github.io/docs/5u18/doc/application_framework/application_framework/libraries/repository.html)

```xml:src/main/resources/rest-component-configuration.xml
  <!-- 初期化が必要なコンポーネント -->
  <component name="initializer" class="nablarch.core.repository.initialization.BasicApplicationInitializer">
    <property name="initializeList">
```

```xml
        <!-- コードのローダ -->
        <!--
        <component-ref name="codeLoader" />
        -->
        <!-- コードのキャッシュ -->
        <!--
        <component-ref name="codeCache" />
        -->
```

`development`プロファイルのみになりますが、`src/env/dev/resources/rest-boot.xml`から環境ごとのコンポーネント上書き設定を削除します。

[処理方式、環境に依存する設定の管理方法](https://nablarch.github.io/docs/5u18/doc/application_framework/application_framework/setting_guide/ManagingEnvironmentalConfiguration/index.html)

```xml:src/env/dev/resources/rest-boot.xml
  <!-- 単体試験用の設定 -->
  <!--
  <import file="override_dev.xml"/>
  -->
```

ここに含まれているものは、ほぼデータベース系のコンポーネントなので。


# データベースを使わないアクションクラスを追加

デフォルトで生成される`src/main/java/com/example/jaxrs/SampleAction.java`はデータベースを使用するアクション（`UniversalDao`を使用する）ので、動作確認には使えません。

新しく簡単なアクションクラスを追加しましょう。

こんな感じで作成。

```java:src/main/java/com/example/jaxrs/HelloAction.java
package com.example.jaxrs;

import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloAction {
    @GET
    @Path("/message")
    @Produces(MediaType.APPLICATION_JSON)
    public Map<String, String> message() {
        return Map.of("message", "Hello World!!");
    }
}
```

これで、準備は完了です。


# 動作確認

`development`プロファイル、`prod`プロファイルそれぞれでパッケーングして、Tomcatにデプロイして確認します。

```shell
# developmentプロファイル
$ mvn package -DskipTests=true

# prodプロファイル
$ mvn package -DskipTests=true -P prod
```

作成されるWARファイルは、それぞれ`target/hello-jaxrs-0.0.1-SNAPSHOT-dev.war`と`target/hello-jaxrs-0.0.1-SNAPSHOT-prod.war`です。

デプロイする手順は省略します。

最後に動作確認。

```shell
$ curl localhost:8080/hello/message
{"message":"Hello World!!"}
```

OKです。

これで、データベースを使わない構成にできました、と。


# 変更差分

最後に、変更したファイルの差分を載せておきます。

Java 11分は余計かもしれませんが…。あと、動作確認用のアクションクラスは含めていません。

```xml
--- pom.xml.org	2021-01-24 21:10:47.299682196 +0900
+++ pom.xml	2021-01-24 21:25:57.915153517 +0900
@@ -16,7 +16,7 @@
 
   <properties>
     <!-- ソース及びclassファイルが準拠するJavaのバージョン-->
-    <java.version>1.8</java.version>
+    <java.version>11</java.version>
 
     <!-- 環境ごとのリソースディレクトリ(プロファイルにより切り替わる) -->
     <env.resources>${project.basedir}/src/env/${env.dir}/resources</env.resources>
@@ -54,6 +54,7 @@
           <artifactId>nablarch-fw-web-hotdeploy</artifactId>
         </dependency>
         <!-- TODO: プロジェクトで使用するDB製品にあわせたJDBCドライバに修正してください。 -->
+        <!--
         <dependency>
           <groupId>com.h2database</groupId>
           <artifactId>h2</artifactId>
@@ -66,6 +67,7 @@
           <version>3.3.1</version>
           <scope>runtime</scope>
         </dependency>
+        -->
         <dependency>
           <groupId>com.nablarch.integration</groupId>
           <artifactId>slf4j-nablarch-adaptor</artifactId>
@@ -319,6 +321,32 @@
       <scope>runtime</scope>
     </dependency>
 
+    <dependency>
+      <groupId>com.sun.activation</groupId>
+      <artifactId>javax.activation</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.xml.bind</groupId>
+      <artifactId>jaxb-api</artifactId>
+      <version>2.3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.xml.bind</groupId>
+      <artifactId>jaxb-core</artifactId>
+      <version>2.3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.xml.bind</groupId>
+      <artifactId>jaxb-impl</artifactId>
+      <version>2.3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.annotation</groupId>
+      <artifactId>javax.annotation-api</artifactId>
+      <version>1.3.2</version>
+    </dependency>
+
     <!-- Nablarchのテスティングフレームワークを実行するために必要なライブラリ -->
     <dependency>
       <groupId>com.nablarch.framework</groupId>
```

```xml
--- src/main/resources/rest-component-configuration.xml.org	2021-01-24 21:03:41.101000000 +0900
+++ src/main/resources/rest-component-configuration.xml	2021-01-24 21:27:45.076393445 +0900
@@ -5,10 +5,14 @@
     xsi:schemaLocation="http://tis.co.jp/nablarch/component-configuration  https://nablarch.github.io/schema/component-configuration.xsd">
 
   <!-- テーブル定義 -->
+  <!--
   <import file="nablarch/schema-config.xml" />
+  -->
 
   <!-- コード機能 -->
+  <!--
   <import file="nablarch/common/code.xml"/>
+  -->
 
   <!-- 精査に使用する文字集合定義 -->
   <import file="nablarch/core/validation/charset-definition.xml" />
@@ -30,7 +34,9 @@
 
   ローカルのデータソースからコネクションを取得したい場合は、アーキタイプから生成した直後のプロジェクトに含まれるdb-for-webui_dev.xmlを参考に設定すること。
   -->
+  <!--
   <import file="nablarch/webui/db-for-webui.xml"/>
+  -->
 
   <!-- スレッドコンテキストハンドラ -->
   <import file="nablarch/webui/threadcontext-for-webui.xml"/>
@@ -55,7 +61,9 @@
 
   <!-- ダイアレクト設定 -->
   <!-- TODO:使用するDBに合わせてダイアレクトを設定すること -->
+  <!--
   <component name="dialect" class="nablarch.core.db.dialect.H2Dialect" />
+  -->
 
 
   <!-- ハンドラキュー構成 -->
@@ -92,9 +100,11 @@
 
         <component class="nablarch.common.web.handler.HttpAccessLogHandler"/>
 
+        <!--
         <component-ref name="dbConnectionManagementHandler"/>
 
         <component-ref name="transactionManagementHandler"/>
+        -->
 
         <component-ref name="packageMapping"/>
       </list>
@@ -108,9 +118,13 @@
         <!-- パッケージマッピング -->
         <component-ref name="packageMapping" />
         <!-- コードのローダ -->
+        <!--
         <component-ref name="codeLoader" />
+        -->
         <!-- コードのキャッシュ -->
+        <!--
         <component-ref name="codeCache" />
+        -->
       </list>
     </property>
   </component>
```

```xml
--- src/env/dev/resources/rest-boot.xml.org	2021-01-24 21:03:41.121000000 +0900
+++ src/env/dev/resources/rest-boot.xml	2021-01-24 21:32:34.519697487 +0900
@@ -8,5 +8,7 @@
   <import file="rest-component-configuration.xml"/>
 
   <!-- 単体試験用の設定 -->
+  <!--
   <import file="override_dev.xml"/>
+  -->
 </component-configuration>
```