---
schema_version: "1"
id: db88346ea37ae07b5c8e44ce4523703b3947d343cf377502aa6de922f0c9b5c6
title: APIkit ベースのアプリケーションの移行
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/mule-runtime/4.8/migration-example-complex.md
canonical_url: https://docs.mulesoft.com/jp/mule-runtime/4.8/migration-example-complex
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 73f832061cf8077b5cea0c02c188723ef2399986063637a71de90f6e3bdd3c46
description: MuleSoft Documentation Site
release: "4.8"
latest: false
---
# APIkit ベースのアプリケーションの移行

この例は、APIkit ベースのアプリケーションを Mule 3 から Mule 4 へ移行するために必要な手順を示しています。次の REST API は、MySQL データベースで CRUD (create、read、update、delete) 操作を実行します。

![HTTP、APIkit Router、Error handling などのコンポーネントが含まれるメイン API フローが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-main.png)

![HTTP、APIkit Console、Error handling が含まれるフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-console.png)

![api-config を使用して商品を取得する GET 要求が表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-get-products.png)

![API 設定とエラー処理を使用して ID で商品を取得するプロセスが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-get-product-id.png)

![エラー処理ステップが含まれる、新しい商品を投稿するフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-post-product.png)

![エラー処理が含まれる、ID で商品を削除するプロセスが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-delete-product.png)

![api-config を使用して JSON 形式で商品を更新する PUT 要求の API 設定](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-put-product.png)

![HTTP 状況コードやペイロードを設定するコンポーネントが含まれる、API グローバル例外処理が表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-globalexceptionmapping.png)

## [](#プロパティプレースホルダーの移行)プロパティプレースホルダーの移行

Mule 4 では、プロパティプレースホルダーは ​`.yaml`​ または ​`.properties`​ 設定ファイルのいずれかとしてサポートされています。

1. `/src/main/resources`​ プロジェクトディレクトリに ​`config`​ という名前のフォルダーを作成します。
2. 新しく作成した config フォルダー内に ​`configuration.yaml`​ という名前の設定ファイルを作成します。
3. プロパティプレースホルダーを ​`.properties`​ 形式から ​`.yaml`​ 形式に移行します。
    
    configuration.properties
    
    http.host=0.0.0.0
    http.port=8081
    
    mysql.password=pa$$w0rd
    mysql.port=3306
    mysql.user=admin
    mysql.database=products
    mysql.host=corp.services.com
    
    autodiscovery.api.version=1.0.0:1762946
    autodiscovery.api.name=groupId:com.mulesoft.retailer.manufacturingit.apis:assetId:product-api-database
    
    anypoint.platform.client\_id=1f702j71hu9z2x88v9vd19v7h248s589
    anypoint.platform.client\_secret=87v8V47668701Dd574B0531255d6287d
    
    configuration.yaml
    
    http:
      host: "0.0.0.0"
      port: "8081"
    
    mysql:
      password: "pa$$w0rd"
      port: "3306"
      user: "admin"
      database: "products"
      host: "corp.services.com"
    
    autodiscovery:
      api:
        name: "groupId:com.mulesoft.retailer.manufacturingit.apis:assetId:product-api-database"
        version: "1.0.0:1762946"
    
    anypoint:
      platform:
        client\_id: "1f702j71hu9z2x88v9vd19v7h248s589"
        client\_secret: "87v8V47668701Dd574B0531255d6287d"
4. 標準の Spring 要素 ​`<context:property-placeholder>`​ を新しいグローバル要素 ​`configuration-properties`​ に置き換えます。
    
    Studio 6 のプロパティプレースホルダーの設定 XML。
    
    ```xml
    <context:property-placeholder location="configuration.properties" />
    ```
    
    `file`​ 属性は、​`/src/main/resources/config`​ フォルダーにある YAML 形式の新しい設定ファイルを参照しています。
    
    Studio 7 のプロパティプレースホルダーの設定 XML。
    
    ```xml
    <configuration-properties file="config/configuration.yaml" doc:name="Configuration properties" />
    ```

## [](#グローバル-http-リスナー設定の移行)グローバル HTTP リスナー設定の移行

Studio 6 のグローバル HTTP リスナー設定の設定 XML。

```xml
<http:listener-config name="HTTP_Listener_Configuration" host="${http.host}" port="${http.port}" doc:name="HTTP Listener Configuration"/>
```

最小限の設定では、内側の ​`http:listener-connection`​ 要素で ​`host`​ と ​`port`​ を指定する必要があります。前のステップで定義したプレースホルダーを使用します。

Studio 7 のグローバル HTTP リスナー設定の設定 XML。

```xml
<http:listener-config name="httpListenerConfig">
  <http:listener-connection host="${http.host}" port="${http.port}" />
</http:listener-config>
```

## [](#mysql-グローバル設定の移行)MySQL グローバル設定の移行

Database Connector により、Mule アプリケーションで使用する ​_Derby_​、​_MySQL_​、​_Oracle_​ データベースのセットアップが容易になります。

1. \[Mule Palette (Mule パレット)\] で \[​`Add Module`​ (モジュールの追加)\] をクリックし、使用可能なモジュールから \[​`Database Connector`​\] を選択します。
2. \[​`Database Config`​ (データベース設定)\] グローバル設定要素を追加します。
3. \[Database Config (データベース設定)\] > \[Connection (接続)\] で、\[MySQL Connection (MySQL 接続)\] を選択します。
4. \[MySQL JDBC Driver (MySQL JDBC ドライバー)\] で \[Add Dependency (連動関係を追加)\] をクリックし、ドライバーの Maven 情報を設定します。
    
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>
5. 前に定義したプレースホルダーを使用して、​`host`​、​`port`​、​`user`​、​`password`​、​`database`​ を含む MySQL グローバル設定を完了します。
    
    Studio 6 の MySQL グローバル設定の設定 XML。
    
    ```xml
    <db:mysql-config name="MySQL_Configuration" host="${mysql.host}" port="${mysql.port}" user="${mysql.user}" password="${mysql.password}" database="${mysql.database}" doc:name="MySQL Configuration" />
    ```
    
    Studio 7 の MySQL グローバル設定の設定 XML。
    
    ```xml
    <db:config name="MySQL_Configuration" doc:name="Database Config">
      <db:my-sql-connection host="${mysql.host}" port="${mysql.port}" user="${mysql.user}" password="${mysql.password}" database="${mysql.database}" />
    </db:config>
    ```

## [](#api-自動検出設定の移行)API 自動検出設定の移行

Anypoint Platform で API を登録するには ​`api-platform-gw`​ グローバル要素が必要です。

Studio 6 の API 自動検出設定の設定 XML。

```xml
<api-platform-gw:api apiName="${autodiscovery.api.name}" version="${autodiscovery.api.version}" flowRef="api-main" create="true" doc:name="API Autodiscovery"/>
```

Mule Runtime 4.x では、​`apiName`​、​`version`​、​`create`​ 属性が削除されました。必要なのは ​`apiId`​ 属性と ​`flowRef`​ 属性のみです。 API Manager によって ​`apiId`​ が生成され、API インスタンスダッシュボードに表示されます。

Mule Runtime 4.x の API 自動検出設定の場合は、次のようになります。

1. 以下の名前空間をスキーマの ​`global.xml`​ 設定ファイルに追加します。
    
    xmlns:api-gateway="http://www.mulesoft.org/schema/mule/api-gateway"
    http://www.mulesoft.org/schema/mule/api-gateway http://www.mulesoft.org/schema/mule/api-gateway/current/mule-api-gateway.xsd
2. 必要な自動検出連動関係情報をプロジェクトの ​`pom.xml`​ ファイルに追加します。
    
    <dependency>
      <groupId>com.mulesoft.anypoint</groupId>
      <artifactId>mule-module-autodiscovery</artifactId>
      <version>4.0.0</version>
    </dependency>
    
    Studio 7 の API 自動検出設定の設定 XML。
    
    ```xml
    <api-gateway:autodiscovery apiId="${autodiscovery.api.id}" flowRef="api-product-main" doc:name="API Autodiscovery"/>
    ```

## [](#グローバル検証設定の移行)グローバル検証設定の移行

Studio 6 のグローバル検証設定の設定 XML。

```xml
<validation:config name="Validation_Configuration" doc:name="Validation Configuration"/>
```

Mule Runtime 3.x とは逆に、設定を行うには、\[Mule Palette (Mule パレット)\] に Validation Module を追加する必要があります。

1. \[Mule Palette (Mule パレット)\] で \[​`Add Module`​ (モジュールの追加)\] をクリックし、使用可能なモジュールから \[​`Validation Module`​\] を選択します。
2. \[​`Validation Config`​ (データベース設定)\] グローバル設定要素を追加します。

Studio 7 のグローバル検証設定の設定 XML。

```xml
<validation:config name="Validation_Config" doc:name="Validation Config" />
```

## [](#get-products-flow-の移行)_get-products-flow_​ の移行

`get-products-flow`​ は ​`Product Category`​ または ​`Product Name`​ あるいはその両方で絞り込み、データベースから商品を返します。また ​`offset`​ および ​`maxResults`​ パラメーターを使用するページ分割クエリもサポートされています。

![Source、Transform Message、Error handling などのコンポーネントが含まれる、商品を取得する GET 要求が表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-get-products-flow.png)

Figure 1. Studio 6 の get-products-flow

Studio 6 の get-products-flow の設定 XML。

```xml
<flow name="get-products-flow">
  <message-properties-transformer doc:name="Get Query Params" scope="invocation">
    <add-message-property key="queryOffset" value="#[Integer.valueOf(message.inboundProperties.'http.query.params'.offset)]" />
    <add-message-property key="queryLimit" value="#[Integer.valueOf(message.inboundProperties.'http.query.params'.maxResults)]" />
    <add-message-property key="queryName" value="#[ (message.inboundProperties.'http.query.params'.name != null) ? ('%'+message.inboundProperties.'http.query.params'.name+'%') : '%%']" />
    <add-message-property key="queryCategory" value="#[ (message.inboundProperties.'http.query.params'.category != null) ? ('%'+message.inboundProperties.'http.query.params'.category+'%') : '%%']" />
  </message-properties-transformer>
  <db:select config-ref="MySQL_Configuration" doc:name="Query Products">
    <db:parameterized-query><![CDATA[SELECT  p.id, p.name, p.description, p.product_number, p.manufactured, p.colors, p.categories, p.stock, p.safety_stock_level, p.standard_cost, p.list_price, p.size, p.size_unit_measure_code, p.weight, p.weight_unit_measure_code, p.days_to_manufacture, p.images,  p.modified_date, p.created_date
FROM product p
WHERE LOWER(p.name) like #[flowVars.queryName.toLowerCase()] AND LOWER(p.categories) like #[flowVars.queryCategory.toLowerCase()]
LIMIT #[flowVars.queryLimit]
OFFSET #[flowVars.queryOffset]]]>
    </db:parameterized-query>
  </db:select>
  <dw:transform-message doc:name="Products to JSON">
    <dw:set-payload resource="classpath:mappings/get-products-response.dwl"/>
  </dw:transform-message>
</flow>
```

1. `get-products-flow`​ の定義に関する変更はありません。
    
    ```xml
    <flow name="get-products-flow">
    ```
2. `src/main/resources`​ フォルダーに ​`variables`​ という名前のパッケージを作成します。
3. `src/main/resources/variables`​ フォルダーに ​`set-queryCategory-variable.dwl`​ ファイルを作成し、​`queryCategory`​ フロー変数を設定する DW スクリプトを記述します。
    
    %dw 2.0
    output application/java
    var queryCategory = attributes.queryParams.category
    ---
    if (queryCategory != null)
    	queryCategory
    else
    	'%%'
4. `src/main/resources/variables`​ フォルダーに ​`set-queryLimit-variable.dwl`​ ファイルを作成し、​`queryLimit`​ フロー変数を設定する DW スクリプトを記述します。
    
    %dw 2.0
    output application/java
    ---
    attributes.queryParams.maxResults as Number
5. `src/main/resources/variables`​ フォルダーに ​`set-queryName-variable.dwl`​ ファイルを作成し、​`queryName`​ フロー変数を設定する DW スクリプトを記述します。
    
    %dw 2.0
    output application/java
    var queryName = attributes.queryParams.name
    ---
    if (queryName != null)
    	queryName
    else
    	'%%'
6. `src/main/resources/variables`​ フォルダーに ​`set-queryOffset-variable.dwl`​ ファイルを作成し、​`queryOffset`​ フロー変数を設定する DW スクリプトを記述します。
    
    %dw 2.0
    output application/java
    ---
    attributes.queryParams.offset as Number
7. `Transform component`​ を追加し、​`message-properties-transformer`​ の内側のロジックを置き換えて、その DW スクリプトを参照する変数 ​`queryOffset`​、​`queryLimit`​、​`queryName`​、​`queryCategory`​ を設定します。
    
    ```xml
    <flow name="get-products-flow">
      <ee:transform doc:name="Get Query Params" doc:id="ab756164-e1df-4fc5-8fbe-8f4f8cafc2f6">
        <ee:message />
        <ee:variables>
         <ee:set-variable variableName="queryOffset" resource="variables/set-queryOffset-variable.dwl" />
         <ee:set-variable variableName="queryLimit" resource="variables/set-queryLimit-variable.dwl" />
         <ee:set-variable variableName="queryName" resource="variables/set-queryName-variable.dwl" />
         <ee:set-variable variableName="queryCategory" resource="variables/set-queryCategory-variable.dwl" />
       </ee:variables>
     </ee:transform>
    </flow>
    ```
8. `db:select`​ 要素を追加し、MySQL グローバル設定を参照します。パラメーター化クエリにはコロン (:) 構文を使用します。パラメーターは、​`db:input-parameters`​ 要素内のキー - 値ペアとして指定する必要があります。
    
    ```xml
    <db:select config-ref="MySQL_Configuration" doc:name="Query Products">
      <db:sql >SELECT  p.id, p.name, p.description, p.product_number, p.manufactured, p.colors, p.categories, p.stock, p.safety_stock_level, p.standard_cost, p.list_price, p.size, p.size_unit_measure_code, p.weight, p.weight_unit_measure_code, p.days_to_manufacture, p.images,  p.modified_date, p.created_date
    FROM product p
    WHERE LOWER(p.name) like :name AND LOWER(p.categories) like :category
    LIMIT :limit
    OFFSET :offset</db:sql>
      <db:input-parameters ><![CDATA[#[{'name' : lower(vars.queryName), 'category': lower(vars.queryCategory), 'limit': vars.queryLimit, 'offset': vars.queryOffset}]]]></db:input-parameters>
    </db:select>
    ```
9. `src/main/resources`​ フォルダーに ​`mappings`​ という名前のパッケージを作成します。
10. `src/main/resources/mappings`​ フォルダーに ​`get-products-response.dwl`​ ファイルを作成します。
11. `get-products-response.dwl`​ DW 1.0 スクリプトを DW 2.0 に移行します。
    
    DW 1.0 の get-products-response の変換。
    
    %dw 1.0
    %output application/json
    ---
    payload map {
    	id: $.id,
    	categories: ($.categories default "") splitBy ",",
    	colors: ($.colors default "") splitBy ",",
    	images: ($.images default "") splitBy ",",
    	createdDate: $.created\_date as :string {format: "yyyy-MM-dd"},
    	modifiedDate: $.modified\_date as :string {format: "yyyy-MM-dd"},
    	safetyStockLevel: $.safety\_stock\_level as :number,
    	stock: $.stock as :number,
    	daysToManufacture: $.days\_to\_manufacture,
    	name: $.name,
    	description: $.description,
    	listPrice: $.list\_price,
    	manufactured: $.manufactured,
    	productNumber: $.product\_number,
    	size: $.size,
    	sizeUnitMeasureCode: $.size\_unit\_measure\_code,
    	standardCost: $.standard\_cost,
    	weightUnitMeasureCode: $.weight\_unit\_measure\_code,
    	weight: $.weight
    }
    
    DW 2.0 の get-products-response の変換。
    
    %dw 2.0
    output application/json
    ---
    payload map {
    	id: $.id,
    	categories: ($.categories default "") splitBy ",",
    	colors: ($.colors default "") splitBy ",",
    	images: ($.images default "") splitBy ",",
    	createdDate: $.created\_date as String {format: "yyyy-MM-dd"},
    	modifiedDate: $.modified\_date as String {format: "yyyy-MM-dd"},
    	safetyStockLevel: $.safety\_stock\_level as Number,
    	stock: $.stock as Number,
    	daysToManufacture: $.days\_to\_manufacture,
    	name: $.name,
    	description: $.description,
    	listPrice: $.list\_price,
    	manufactured: $.manufactured,
    	productNumber: $.product\_number,
    	size: $.size,
    	sizeUnitMeasureCode: $.size\_unit\_measure\_code,
    	standardCost: $.standard\_cost,
    	weightUnitMeasureCode: $.weight\_unit\_measure\_code,
    	weight: $.weight
    }
12. 最後に、DW 2.0 変換を使用して、ペイロードを設定する ​`Transform component`​ を追加します。
    
    ```xml
    <flow name="get-products-flow">
    	<!-- more logic here -->
    	<ee:transform doc:name="Products to JSON">
    		<ee:message>
    			<ee:set-payload resource="mappings/get-products-response.dwl" />
    		</ee:message>
    	</ee:transform>
    </flow>
    ```

Studio 7 の get-products-flow の設定 XML。

```xml
<flow name="get-products-flow">
  <ee:transform doc:name="Get Query Params" doc:id="ab756164-e1df-4fc5-8fbe-8f4f8cafc2f6">
    <ee:message />
    <ee:variables>
      <ee:set-variable variableName="queryOffset" resource="variables/set-queryOffset-variable.dwl" />
      <ee:set-variable variableName="queryLimit" resource="variables/set-queryLimit-variable.dwl" />
      <ee:set-variable variableName="queryName" resource="variables/set-queryName-variable.dwl" />
      <ee:set-variable variableName="queryCategory" resource="variables/set-queryCategory-variable.dwl" />
    </ee:variables>
  </ee:transform>
  <db:select config-ref="MySQL_Configuration" doc:name="Query Products">
    <db:sql>SELECT p.id, p.name, p.description, p.product_number,
				p.manufactured, p.colors, p.categories, p.stock,
				p.safety_stock_level, p.standard_cost, p.list_price, p.size,
				p.size_unit_measure_code, p.weight, p.weight_unit_measure_code,
				p.days_to_manufacture, p.images, p.modified_date, p.created_date
				FROM product p
				WHERE LOWER(p.name) like :name AND LOWER(p.categories) like :category
				LIMIT :limit
				OFFSET :offset</db:sql>
    <db:input-parameters><![CDATA[#[{'name' : lower(vars.queryName), 'category': lower(vars.queryCategory), 'limit': vars.queryLimit, 'offset': vars.queryOffset}]]]></db:input-parameters>
  </db:select>
  <ee:transform doc:name="Products to JSON">
    <ee:message>
      <ee:set-payload resource="mappings/get-products-response.dwl" />
    </ee:message>
  </ee:transform>
</flow>
```

![Source、Transform Message、Error handling などのコンポーネントが含まれる、商品を取得するプロセスが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m4-apikit-based-example-get-products-flow.png)

Figure 2. Studio 7 の get-products-flow

## [](#get-product-by-id-flow-の移行)_get-product-by-id-flow_​ の移行

`get-product-by-id-flow`​ は、​`id`​ で絞り込んでデータベースから商品を返します。 必要な ID を持つ商品がない場合は、​`HTTP 404 Not Found`​ エラーが返されます。

![検証や JSON 変換が含まれる、ID で商品を取得するプロセスが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-get-product-by-id-flow.png)

Figure 3. Studio 6 の get-product-by-id-flow

Studio 6 の get-product-by-id-flow の設定 XML。

```xml
<flow name="get-product-by-id-flow">
  <db:select config-ref="MySQL_Configuration" doc:name="Get by Id">
    <db:parameterized-query><![CDATA[SELECT p.id, p.name, p.description, p.product_number, p.manufactured, p.colors, p.categories, p.stock, p.safety_stock_level, p.standard_cost, p.list_price, p.size, p.size_unit_measure_code, p.weight, p.weight_unit_measure_code, p.days_to_manufacture, p.images,  p.modified_date, p.created_date FROM product p where p.id = #[id]]]></db:parameterized-query>
  </db:select>
  <validation:is-true config-ref="Validation_Configuration" doc:name="Is Not Empty" exceptionClass="org.mule.module.apikit.exception.NotFoundException" expression="#[payload.size() &gt; 0]"/>
  <dw:transform-message doc:name="Product to JSON">
    <dw:set-payload resource="classpath:mappings/get-product-by-id-response.dwl"/>
  </dw:transform-message>
</flow>
```

1. `get-product-by-id-flow`​ の定義に関する変更はありません。
    
    ```xml
    <flow name="get-product-by-id-flow" />
    ```
2. `src/main/resources/variables`​ フォルダーに ​`set-productId-variable.dwl`​ ファイルを作成します。​`uriParams`​ から ​`id`​ を取得する次のロジックを追加します。
    
    %dw 2.0
    output application/java
    ---
    attributes.uriParams.id
3. `productId`​ 値を ​`URI parameter`​ として受け取る変数を設定する DW スクリプトを参照する ​`Transform component`​ を追加します。
    
    ```xml
    <flow name="get-product-by-id-flow">
      <ee:transform doc:name="Get Uri Params">
        <ee:message />
        <ee:variables>
          <ee:set-variable variableName="id" resource="variables/set-productId-variable.dwl" />
        </ee:variables>
      </ee:transform>
    </flow>
    ```
4. `db:select`​ 要素を追加し、MySQL グローバル設定を参照します。パラメーター化クエリにはコロン (:) 構文を使用します。パラメーターは、​`db:input-parameters`​ 要素内のキー - 値ペアとして指定する必要があります。
    
    ```xml
    <db:select config-ref="MySQL_Configuration" doc:name="Get by Id">
      <db:sql>SELECT p.id, p.name, p.description, p.product_number, p.manufactured, p.colors, p.categories, p.stock, p.safety_stock_level, p.standard_cost, p.list_price, p.size, p.size_unit_measure_code, p.weight, p.weight_unit_measure_code, p.days_to_manufacture, p.images,  p.modified_date, p.created_date
    FROM product p
    where p.id = :id</db:sql>
      <db:input-parameters><![CDATA[#[{'id' : vars.id}]]]></db:input-parameters>
    </db:select>
    ```
5. `db:select`​ の後に、クエリから結果が返されたかどうかをチェックする ​`validation:is-true`​ 要素を追加します。返されなかった場合は ​`APP:NOT_FOUND`​ エラーをスローします。デフォルトの式言語として ​`MEL`​ が ​`DataWeave`​ に置き換わり、​`[payload.size() > 0]`​ は ​`[sizeOf(payload) > 0]`​ として書き換えられています。
    
    ```xml
    <validation:is-true doc:name="Is Not Empty" config-ref="Validation_Config" expression="#[sizeOf(payload) &gt; 0]">
      <error-mapping sourceType="VALIDATION:INVALID_BOOLEAN" targetType="APP:NOT_FOUND" />
    </validation:is-true>
    ```
6. `src/main/resources/mappings`​ フォルダーに ​`get-product-by-id-response.dwl`​ ファイルを作成し、JSON 応答を構築する DataWeave スクリプトを 1.0 から 2.0 に移行します。
    
    DW 1.0 の get-product-by-id-response の変換。
    
    %dw 1.0
    %output application/json
    %var product = payload\[0\]
    ---
    {
    	id: product.id,
    	name: product.name,
    	description: product.description,
    	manufactured: product.manufactured,
    	productNumber: product.product\_number,
    	colors: (product.colors default "") splitBy "," ,
    	categories:(product.categories default "") splitBy "," ,
    	safetyStockLevel: product.safety\_socket\_level,
    	standardCost: (product.standard\_cost default "0.0") as :string {format: "##.##"} as :number,
    	listPrice: (product.list\_price default "0.0") as :string {format: "##.##"} as :number,
    	stock: product.stock,
    	safetyStockLevel: product.safety\_stock\_level,
    	daysToManufacture: product.days\_to\_manufacture,
    	size: product.size,
    	sizeUnitMeasureCode: product.size\_unit\_measure\_code,
    	weight: product.weight,
    	weightUnitMeasureCode: product.weight\_unit\_measure\_code,
    	daysToManufacture: product.days\_to\_manufacture,
    	images: (product.images splitBy "," default null),
    	modifiedDate: (product.modified\_date default "") as :date {format: "yyyy-MM-dd"},
    	createdDate: (product.created\_date default "") as :date {format: "yyyy-MM-dd"}
    
    }
    
    DW 2.0 の get-product-by-id-response.dwl の変換。
    
    %dw 2.0
    output application/json
    var product = payload\[0\]
    ---
    {
    	id: product.id,
    	name: product.name,
    	description: product.description,
    	manufactured: product.manufactured,
    	productNumber: product.product\_number,
    	colors: (product.colors default "") splitBy "," ,
    	categories:(product.categories default "") splitBy "," ,
    	safetyStockLevel: product.safety\_socket\_level,
    	standardCost: (product.standard\_cost default "0.0") as String {format: "##.##"} as Number,
    	listPrice: (product.list\_price default "0.0") as String {format: "##.##"} as Number,
    	stock: product.stock,
    	safetyStockLevel: product.safety\_stock\_level,
    	daysToManufacture: product.days\_to\_manufacture,
    	size: product.size,
    	sizeUnitMeasureCode: product.size\_unit\_measure\_code,
    	weight: product.weight,
    	weightUnitMeasureCode: product.weight\_unit\_measure\_code,
    	daysToManufacture: product.days\_to\_manufacture,
    	images: (product.images splitBy "," default null),
    	modifiedDate: (product.modified\_date default "") as Date {format: "yyyy-MM-dd"},
    	createdDate: (product.created\_date default "") as Date {format: "yyyy-MM-dd"}
    }
7. 最後に、DW 2.0 変換を使用して、ペイロードを設定する ​`Transform component`​ を追加します。
    
    ```xml
    <ee:transform doc:name="Product to JSON">
      <ee:message>
        <ee:set-payload resource="mappings/get-product-by-id-response.dwl" />
      </ee:message>
    </ee:transform>
    ```

Studio 7 の get-product-by-id-flow の設定 XML。

```xml
<flow name="get-product-by-id-flow">
  <ee:transform doc:name="Get Uri Params">
    <ee:message />
    <ee:variables>
      <ee:set-variable variableName="id" resource="variables/set-productId-variable.dwl" />
    </ee:variables>
  </ee:transform>
  <db:select config-ref="MySQL_Configuration" doc:name="Get by Id">
    <db:sql>SELECT p.id, p.name, p.description, p.product_number, p.manufactured, p.colors, p.categories, p.stock, p.safety_stock_level, p.standard_cost, p.list_price, p.size, p.size_unit_measure_code, p.weight, p.weight_unit_measure_code, p.days_to_manufacture, p.images,  p.modified_date, p.created_date
FROM product p
where p.id = :id</db:sql>
    <db:input-parameters><![CDATA[#[{'id' : vars.id}]]]></db:input-parameters>
  </db:select>
  <validation:is-true doc:name="Is Not Empty" config-ref="Validation_Config" expression="#[sizeOf(payload) &gt; 0]">
    <error-mapping sourceType="VALIDATION:INVALID_BOOLEAN" targetType="APP:NOT_FOUND" />
  </validation:is-true>
  <ee:transform doc:name="Product to JSON">
    <ee:message>
      <ee:set-payload resource="mappings/get-product-by-id-response.dwl" />
    </ee:message>
  </ee:transform>
</flow>
```

![Source、Transform Message、Error handling などのコンポーネントが含まれる、ID による GET 要求が表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m4-apikit-based-example-get-product-by-id-flow.png)

Figure 4. Studio 7 の get-product-by-id-flow

## [](#post-product-flow-の移行)_post-product-flow_​ の移行

`post-product-flow`​ はデータベースに商品を挿入します。

![Source、Transactional、Error handling などのコンポーネントが含まれる、商品を投稿するプロセスが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-post-product-flow.png)

Figure 5. Studio 6 の post-product-flow

Studio 6 の post-product-flow の設定 XML。

```xml
<flow name="post-product-flow">
  <set-variable variableName="originalPayload" value="#[payload:java.lang.String]" doc:name="Set Original Payload" />
  <dw:transform-message doc:name="Json to Map">
    <dw:set-payload resource="classpath:mappings/json-product-to-java.dwl"/>
  </dw:transform-message>
  <transactional action="ALWAYS_BEGIN" doc:name="Transactional">
    <db:insert config-ref="MySQL_Configuration" doc:name="Insert Product" autoGeneratedKeys="true" autoGeneratedKeysColumnNames="id" target="#[payload]">
      <db:parameterized-query><![CDATA[insert into product(name, description, product_number, manufactured, colors, categories, stock, safety_stock_level, standard_cost, list_price, size, size_unit_measure_code, weight, weight_unit_measure_code, days_to_manufacture, images, modified_date, created_date) values(#[payload.name],#[payload.description], #[payload.productNumber], #[payload.manufactured], #[payload.colors],  #[payload.categories], #[payload.stock], #[payload.safetyStockLevel], #[payload.standardCost], #[payload.listPrice], #[payload.size], #[payload.sizeUnitMeasureCode], #[payload.weight], #[payload.weightUnitMeasureCode], #[payload.daysToManufacture], #[payload.images], CURDATE(), CURDATE() );]]></db:parameterized-query>
    </db:insert>
  </transactional>
  <dw:transform-message doc:name="Database to Json">
    <dw:input-variable doc:sample="json.json" mimeType="application/json" variableName="originalPayload" />
    <dw:set-payload resource="classpath:mappings/post-product-response.dwl"/>
  </dw:transform-message>
</flow>
```

1. `post-product-flow`​ の定義に関する変更はありません。
    
    ```xml
    <flow name="post-product-flow" />
    ```
2. JSON 要求を JAVA マップに変換するために、​`src/main/resources/mappings`​ フォルダーに ​`json-to-java.dwl`​ ファイルを作成します。
    
    %dw 2.0
    output application/java
    ---
    payload
3. `src/main/resources/mappings`​ に ​`json-product-to-java.dwl`​ ファイルを作成し、元のスクリプトを DW 1.0 から 2.0 に移行します。
    
    DW 1.0 の json-product-to-java.dwl の変換。
    
    %dw 1.0
    %output application/java
    ---
    {
    	categories: payload.categories joinBy ",",
    	colors: payload.colors joinBy ",",
    	daysToManufacture: payload.daysToManufacture,
    	description: payload.description,
    	images: payload.images joinBy ",",
    	listPrice: payload.listPrice,
    	(manufactured: 1) when payload.manufactured == true,
    	(manufactured: 0) when payload.manufactured == false,
    	name: payload.name,
    	productNumber: payload.productNumber,
    	safetyStockLevel: payload.safetyStockLevel,
    	size: payload.size,
    	sizeUnitMeasureCode: payload.sizeUnitMeasureCode,
    	standardCost: payload.standardCost,
    	stock: payload.stock,
    	weight: payload.weight,
    	weightUnitMeasureCode: payload.weightUnitMeasureCode
    }
    
    DW 2.0 の json-product-to-java.dwl の変換。
    
    %dw 2.0
    output application/java
    fun getManufacturedCode(value) =
    	if (value == true) 1
    	else 0
    ---
    {
    	categories: payload.categories joinBy ",",
    	colors: payload.colors joinBy ",",
    	daysToManufacture: payload.daysToManufacture,
    	description: payload.description,
    	images: payload.images joinBy ",",
    	listPrice: payload.listPrice,
    	manufactured: getManufacturedCode(payload.manufactured),
    	name: payload.name,
    	productNumber: payload.productNumber,
    	safetyStockLevel: payload.safetyStockLevel,
    	size: payload.size,
    	sizeUnitMeasureCode: payload.sizeUnitMeasureCode,
    	standardCost: payload.standardCost,
    	stock: payload.stock,
    	weight: payload.weight,
    	weightUnitMeasureCode: payload.weightUnitMeasureCode
    }
4. 前に作成した DataWeave 変換を使用して ​`originalPayload`​ と ​`newPayload`​ を設定する ​`Transform component`​ を追加します。
    
    ```xml
    <flow name="post-product-flow">
      <ee:transform doc:name="Json to Map">
        <ee:message />
        <ee:variables>
          <ee:set-variable variableName="originalPayload" resource="mappings/json-to-java.dwl" />
          <ee:set-variable variableName="newPayload" resource="mappings/json-product-to-java.dwl" />
        </ee:variables>
      </ee:transform>
    </flow>
    ```
5. トランザクションの詳細を設定するために、Mule 3.x の ​`transactional`​ スコープを新しい ​`try`​ スコープに置き換え、​`transactionalAction`​ 属性を ​`ALWAYS_BEGIN`​ に設定します。
    
    ```xml
    <try doc:name="Try" transactionalAction="ALWAYS_BEGIN">
    </try>
    ```
6. `Try scope`​ に ​`db:insert`​ 要素を追加し、MySQL グローバル設定を参照します。パラメーターは、​`db:input-parameters`​ 要素内のキー - 値ペアとして指定する必要があります。データベースエンジンによって自動生成された ​`ID`​ を持つペイロードを設定する ​`db:auto-generated-keys-column-name`​ タグも含まれています。
    
    ```xml
    <try transactionalAction="ALWAYS_BEGIN" doc:name="Try">
      <db:insert config-ref="MySQL_Configuration" doc:name="Insert Product" autoGenerateKeys="true">
        <db:sql>insert into product(name, description, product_number,
    					manufactured, colors, categories, stock, safety_stock_level,
    					standard_cost, list_price, size, size_unit_measure_code, weight,
    					weight_unit_measure_code, days_to_manufacture, images,
    					modified_date, created_date)
    					values(:name, :description,
    					:product_number, :manufactured, :colors,
    					:categories, :stock,
    					:safety_stock_level, :standard_cost,
    					:list_price, :size,
    					:size_unit_measure_code, :weight,
    					:weight_unit_measure_code,
    					:days_to_manufacture, :images,
    					CURDATE(), CURDATE());
    				</db:sql>
        <db:input-parameters><![CDATA[#[{'name': vars.newPayload.name, 'description': vars.newPayload.description, 'product_number': vars.newPayload.productNumber, 'manufactured': vars.newPayload.manufactured, 'colors': vars.newPayload.colors, 'categories': vars.newPayload.categories, 'stock': vars.newPayload.stock, 'safety_stock_level': vars.newPayload.safetyStockLevel, 'standard_cost': vars.newPayload.standardCost, 'list_price': vars.newPayload.listPrice, 'size': vars.newPayload.size, 'size_unit_measure_code': vars.newPayload.sizeUnitMeasureCode, 'weight': vars.newPayload.weight, 'weight_unit_measure_code': vars.newPayload.weightUnitMeasureCode, 'days_to_manufacture': vars.newPayload.daysToManufacture, 'images': vars.newPayload.images}]]]></db:input-parameters>
        <db:auto-generated-keys-column-names>
          <db:auto-generated-keys-column-name value="id" />
        </db:auto-generated-keys-column-names>
      </db:insert>
    </try>
    ```
7. `src/main/resources/mappings`​ に ​`post-product-response.dwl`​ ファイルを作成し、応答変換を DataWeave 1.0 から 2.0 に移行します。式 ​`payload.generatedKeys.GENERATED_KEY`​ を使用してペイロードから生成された ​`id`​ を取得するという違いがあります。
    
    DW 1.0 の post-product-response.dwl の変換。
    
    %dw 1.0
    %output application/json
    ---
    flowVars.originalPayload ++
    id: payload\[0\].GENERATED\_KEY
    
    DW 2.0 の post-product-response.dwl の変換。
    
    %dw 2.0
    output application/json
    ---
    vars.originalPayload ++
    id: payload.generatedKeys.GENERATED\_KEY
8. `Transform component`​ を追加し、ペイロードを DataWeave スクリプトで設定します。
    
    ```xml
    <ee:transform doc:name="Database to Json">
      <ee:message>
        <ee:set-payload resource="mappings/post-product-response.dwl" />
      </ee:message>
    </ee:transform>
    ```

Studio 7 の post-product-flow の設定 XML。

```xml
<flow name="post-product-flow">
  <ee:transform doc:name="Json to Map">
    <ee:message />
    <ee:variables>
      <ee:set-variable variableName="originalPayload" resource="mappings/json-to-java.dwl" />
      <ee:set-variable variableName="newPayload" resource="mappings/json-product-to-java.dwl" />
    </ee:variables>
  </ee:transform>
  <try transactionalAction="ALWAYS_BEGIN" doc:name="Try">
    <db:insert config-ref="MySQL_Configuration" doc:name="Insert Product" autoGenerateKeys="true">
      <db:sql>insert into product(name, description, product_number,
					manufactured, colors, categories, stock, safety_stock_level,
					standard_cost, list_price, size, size_unit_measure_code, weight,
					weight_unit_measure_code, days_to_manufacture, images,
					modified_date, created_date)
					values(:name, :description,
					:product_number, :manufactured, :colors,
					:categories, :stock,
					:safety_stock_level, :standard_cost,
					:list_price, :size,
					:size_unit_measure_code, :weight,
					:weight_unit_measure_code,
					:days_to_manufacture, :images,
					CURDATE(), CURDATE());
				</db:sql>
      <db:input-parameters><![CDATA[#[{'name': vars.newPayload.name, 'description': vars.newPayload.description, 'product_number': vars.newPayload.productNumber, 'manufactured': vars.newPayload.manufactured, 'colors': vars.newPayload.colors, 'categories': vars.newPayload.categories, 'stock': vars.newPayload.stock, 'safety_stock_level': vars.newPayload.safetyStockLevel, 'standard_cost': vars.newPayload.standardCost, 'list_price': vars.newPayload.listPrice, 'size': vars.newPayload.size, 'size_unit_measure_code': vars.newPayload.sizeUnitMeasureCode, 'weight': vars.newPayload.weight, 'weight_unit_measure_code': vars.newPayload.weightUnitMeasureCode, 'days_to_manufacture': vars.newPayload.daysToManufacture, 'images': vars.newPayload.images}]]]></db:input-parameters>
      <db:auto-generated-keys-column-names>
        <db:auto-generated-keys-column-name value="id" />
      </db:auto-generated-keys-column-names>
    </db:insert>
  </try>
  <ee:transform doc:name="Database to Json">
    <ee:message>
      <ee:set-payload resource="mappings/post-product-response.dwl" />
    </ee:message>
  </ee:transform>
</flow>
```

![JSON 変換やデータベース操作が含まれる、新しい商品を投稿するプロセスが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m4-apikit-based-example-post-product-flow.png)

Figure 6. Studio 7 の post-product-flow

## [](#put-product-flow-の移行)_put-product-flow_​ の移行

`put-product-flow`​ は指定された ​`id`​ に基づいてデータベース内の商品を更新します。

![トランザクションエラー処理や状況の更新が含まれる、商品を更新するフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-put-product-flow.png)

Figure 7. Studio 6 の put-product-flow

Studio 6 の put-product-flow の設定 XML。

```xml
<flow name="put-product-flow">
  <dw:transform-message doc:name="JSon to Product">
    <dw:set-payload resource="classpath:mappings/put-json-product-to-java.dwl"/>
  </dw:transform-message>
  <transactional action="ALWAYS_BEGIN" doc:name="Transactional">
    <db:update config-ref="MySQL_Configuration" doc:name="Update Product">
      <db:parameterized-query><![CDATA[update product set name = #[payload.name], description = #[payload.description], product_number = #[payload.productNumber], manufactured = #[payload.manufactured], colors = #[payload.colors], categories= #[payload.categories], stock = #[payload.stock], safety_stock_level = #[payload.safetyStockLevel], standard_cost = #[payload.standardCost], list_price = #[payload.listPrice], size = #[payload.size], size_unit_measure_code = #[payload.sizeUnitMeasureCode], weight = #[payload.weight], weight_unit_measure_code = #[payload.weightUnitMeasureCode], days_to_manufacture = #[payload.daysToManufacture], images = #[payload.images],  modified_date = CURDATE() where id = #[id]]]></db:parameterized-query>
    </db:update>
  </transactional>
  <set-payload value="#[NullPayload.getInstance()]" doc:name="Set Payload" />
  <set-property propertyName="http.status" value="204" doc:name="Set Status" />
</flow>
```

1. `put-product-flow`​ の定義に関する変更はありません。
    
    ```xml
    <flow name="put-product-flow" />
    ```
2. `src/main/resources/mappings`​ フォルダーに ​`put-json-product-to-java.dwl`​ ファイルを作成し、元のスクリプトを DW 1.0 から 2.0 に移行します。
    
    DW 1.0 の put-json-product-to-java.dwl の変換。
    
    %dw 1.0
    %output application/java
    ---
    {
    	categories: payload.categories joinBy ",",
    	colors: payload.colors joinBy ",",
    	daysToManufacture: payload.daysToManufacture,
    	description: payload.description,
    	images: payload.images joinBy ",",
    	listPrice: payload.listPrice,
    	manufactured: payload.manufactured,
    	name: payload.name,
    	productNumber: payload.productNumber,
    	safetyStockLevel: payload.safetyStockLevel,
    	size: payload.size,
    	sizeUnitMeasureCode: payload.sizeUnitMeasureCode,
    	standardCost: payload.standardCost,
    	stock: payload.stock,
    	weight: payload.weight,
    	weightUnitMeasureCode: payload.weightUnitMeasureCode
    }
    
    DW 2.0 の put-json-product-to-java.dwl の変換。
    
    %dw 2.0
    output application/java
    ---
    {
    	categories: payload.categories joinBy ",",
    	colors: payload.colors joinBy ",",
    	daysToManufacture: payload.daysToManufacture,
    	description: payload.description,
    	images: payload.images joinBy ",",
    	listPrice: payload.listPrice,
    	manufactured: payload.manufactured,
    	name: payload.name,
    	productNumber: payload.productNumber,
    	safetyStockLevel: payload.safetyStockLevel,
    	size: payload.size,
    	sizeUnitMeasureCode: payload.sizeUnitMeasureCode,
    	standardCost: payload.standardCost,
    	stock: payload.stock,
    	weight: payload.weight,
    	weightUnitMeasureCode: payload.weightUnitMeasureCode
    }
3. 前に作成した DataWeave 変換を使用する ​`updatePayload`​ と、​`variables/set-productId-variable.dwl`​ スクリプトを使用する ​`id`​ を設定する ​`Transform component`​ を追加します。
    
    ```xml
    <flow name="put-product-flow">
      <ee:transform doc:name="JSon to Product">
        <ee:message />
        <ee:variables >
          <ee:set-variable variableName="updatePayload" resource="mappings/put-json-product-to-java.dwl" />
          <ee:set-variable variableName="id" resource="variables/set-productId-variable.dwl" />
        </ee:variables>
      </ee:transform>
    </flow>
    ```
4. トランザクションの詳細を設定するために、Mule 3.x の ​`transactional`​ スコープを新しい ​`try`​ スコープに置き換え、​`transactionalAction`​ 属性を ​`ALWAYS_BEGIN`​ に設定します。
    
    ```xml
    <try doc:name="Try" transactionalAction="ALWAYS_BEGIN">
    </try>
    ```
5. `Try scope`​ に ​`db:update`​ 要素を追加し、MySQL グローバル設定を参照します。パラメーターは、​`db:input-parameters`​ 要素内のキー - 値ペアとして指定する必要があります。
    
    ```xml
    <try doc:name="Try" transactionalAction="ALWAYS_BEGIN">
      <db:update config-ref="MySQL_Configuration" doc:name="Update Product">
        <db:sql >update product
    set name = :name, description = :description, product_number = :product_number, manufactured = :manufactured, colors = :colors, categories= :categories, stock = :stock, safety_stock_level = :safety_stock_level, standard_cost = :standard_cost, list_price = :list_price, size = :size, size_unit_measure_code = :size_unit_measure_code, weight = :weight, weight_unit_measure_code = :weight_unit_measure_code, days_to_manufacture = :days_to_manufacture, images = :images,  modified_date = CURDATE()
    where id = :id</db:sql>
        <db:input-parameters ><![CDATA[#[{'name': vars.updatePayload.name, 'description': vars.updatePayload.description, 'product_number': vars.updatePayload.productNumber, 'manufactured': vars.updatePayload.manufactured, 'colors': vars.updatePayload.colors, 'categories': vars.updatePayload.categories, 'stock': vars.updatePayload.stock, 'safety_stock_level': vars.updatePayload.safetyStockLevel, 'standard_cost': vars.updatePayload.standardCost, 'list_price': vars.updatePayload.listPrice, 'size': vars.updatePayload.size, 'size_unit_measure_code': vars.updatePayload.sizeUnitMeasureCode, 'weight': vars.updatePayload.weight, 'weight_unit_measure_code': vars.updatePayload.weightUnitMeasureCode, 'days_to_manufacture': vars.updatePayload.daysToManufacture, 'images': vars.updatePayload.images, 'id': vars.id}]]]></db:input-parameters>
      </db:update>
    </try>
    ```
6. `Transform component`​ を追加し、​`src/main/resources/variables`​ にある ​`set-httpStatus-with-204.dwl`​ ファイルを使用して ​`httpStatus`​ 変数に ​`204`​ を設定します。
    
    ```xml
    <ee:transform doc:name="Set Status">
      <ee:message />
      <ee:variables >
        <ee:set-variable variableName="httpStatus" resource="variables/set-httpStatus-with-204.dwl" />
      </ee:variables>
    </ee:transform>
    ```

Studio 7 の put-product-flow の設定 XML。

```xml
<flow name="put-product-flow">
  <ee:transform doc:name="JSon to Product">
    <ee:message />
    <ee:variables >
      <ee:set-variable variableName="updatePayload" resource="mappings/put-json-product-to-java.dwl" />
      <ee:set-variable variableName="id" resource="variables/set-productId-variable.dwl" />
    </ee:variables>
  </ee:transform>
  <try doc:name="Try" transactionalAction="ALWAYS_BEGIN">
    <db:update config-ref="MySQL_Configuration" doc:name="Update Product">
      <db:sql >update product
set name = :name, description = :description, product_number = :product_number, manufactured = :manufactured, colors = :colors, categories= :categories, stock = :stock, safety_stock_level = :safety_stock_level, standard_cost = :standard_cost, list_price = :list_price, size = :size, size_unit_measure_code = :size_unit_measure_code, weight = :weight, weight_unit_measure_code = :weight_unit_measure_code, days_to_manufacture = :days_to_manufacture, images = :images,  modified_date = CURDATE()
where id = :id</db:sql>
      <db:input-parameters ><![CDATA[#[{'name': vars.updatePayload.name, 'description': vars.updatePayload.description, 'product_number': vars.updatePayload.productNumber, 'manufactured': vars.updatePayload.manufactured, 'colors': vars.updatePayload.colors, 'categories': vars.updatePayload.categories, 'stock': vars.updatePayload.stock, 'safety_stock_level': vars.updatePayload.safetyStockLevel, 'standard_cost': vars.updatePayload.standardCost, 'list_price': vars.updatePayload.listPrice, 'size': vars.updatePayload.size, 'size_unit_measure_code': vars.updatePayload.sizeUnitMeasureCode, 'weight': vars.updatePayload.weight, 'weight_unit_measure_code': vars.updatePayload.weightUnitMeasureCode, 'days_to_manufacture': vars.updatePayload.daysToManufacture, 'images': vars.updatePayload.images, 'id': vars.id}]]]></db:input-parameters>
    </db:update>
  </try>
  <ee:transform doc:name="Set Status">
    <ee:message />
    <ee:variables >
      <ee:set-variable variableName="httpStatus" resource="variables/set-httpStatus-with-204.dwl" />
    </ee:variables>
  </ee:transform>
</flow>
```

![JSON 変換や状況の設定が含まれる、商品を更新するプロセスが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m4-apikit-based-example-put-product-flow.png)

Figure 8. Studio 7 の put-product-flow

## [](#delete-product-flow-の移行)_delete-product-flow_​ の移行

`delete-product-flow`​ は ​`URI parameter`​ として指定された ​`id`​ を持つ商品レコードを MySQL データベースから削除し、HTTP 204 状況コードを返します。

![Source、Transactional、Error handling などのコンポーネントが含まれる、商品を削除するプロセスが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m3-apikit-based-example-delete-product-flow.png)

Figure 9. Studio 6 の delete-product-flow

Studio 6 の delete-product-flow の設定 XML。

```xml
<flow name="delete-product-flow">
  <transactional action="ALWAYS_BEGIN" doc:name="Transactional">
    <db:delete config-ref="MySQL_Configuration" doc:name="Delete Product">
      <db:parameterized-query><![CDATA[delete from product where id=#[id]]]></db:parameterized-query>
    </db:delete>
  </transactional>
  <set-payload value="#[NullPayload.getInstance()]" doc:name="Set Payload"/>
  <set-property propertyName="http.status" value="204" doc:name="Set Status"/>
</flow>
```

1. `delete-product-flow`​ の定義に関する変更はありません。
    
    ```xml
    <flow name="delete-product-flow" />
    ```
2. `productId`​ 値を ​`URI parameter`​ として受け取る変数を設定する DW スクリプトを参照する ​`Transform component`​ を追加します。
    
    ```xml
    <flow name="delete-product-flow">
      <ee:transform doc:name="Set productId variable">
        <ee:message />
        <ee:variables>
          <ee:set-variable variableName="productId" resource="variables/set-productId-variable.dwl" />
        </ee:variables>
      </ee:transform>
    </flow>
    ```
3. トランザクションの詳細を設定するために、Mule 3.x の ​`transactional`​ スコープを新しい ​`try`​ スコープに置き換え、​`transactionalAction`​ 属性を ​`ALWAYS_BEGIN`​ に設定します。
    
    ```xml
    <try doc:name="Try" transactionalAction="ALWAYS_BEGIN">
    </try>
    ```
4. `Try scope`​ に ​`db:delete`​ 要素を追加し、MySQL グローバル設定を参照します。パラメーターは、​`db:input-parameters`​ 要素内のキー - 値ペアとして指定する必要があります。Mule 3.x とは逆に、前に定義した ​`productId`​ フロー変数には、​`flowVars.productId`​ ではなく ​`vars.productId`​ としてアクセスする必要があります。
    
    ```xml
    <try doc:name="Try" transactionalAction="ALWAYS_BEGIN">
      <db:delete config-ref="MySQL_Configuration" doc:name="Delete Product">
        <db:sql>delete from product where id=:productId</db:sql>
        <db:input-parameters><![CDATA[#[{'productId' : vars.productId}]]]></db:input-parameters>
      </db:delete>
    </try>
    ```
5. 次のように ​`src/main/resources/variables`​ に ​`set-httpStatus-with-204.dwl`​ ファイルを作成します。
    
    %dw 2.0
    output application/java
    ---
    204
6. `NO CONTENT`​ 応答コードを定義するために、​`Transform Component`​ を使用して値 ​`204`​ を持つ ​`httpStatus`​ 変数を設定します。
    
    ```xml
    <ee:transform doc:name="Set 204 HTTP Status code">
      <ee:message />
      <ee:variables>
        <ee:set-variable variableName="httpStatus" resource="variables/set-httpStatus-with-204.dwl" />
      </ee:variables>
    </ee:transform>
    ```

特定の HTTP 状況コードを返すには、​`http.status`​ プロパティを設定する代わりに、Mule 4 の APIkit で ​`httpStatus`​ という名前の変数を設定する必要があります。

Studio 7 の delete-product-flow の設定 XML。

```xml
<flow name="delete-product-flow">
  <ee:transform doc:name="Set productId variable">
    <ee:message />
    <ee:variables>
      <ee:set-variable variableName="productId" resource="variables/set-productId-variable.dwl" />
    </ee:variables>
  </ee:transform>
  <try doc:name="Try" transactionalAction="ALWAYS_BEGIN">
    <db:delete config-ref="MySQL_Configuration" doc:name="Delete Product">
      <db:sql>delete from product where id=:productId</db:sql>
      <db:input-parameters><![CDATA[#[{'productId' : vars.productId}]]]></db:input-parameters>
    </db:delete>
  </try>
  <ee:transform doc:name="Set 204 HTTP Status code">
    <ee:message />
    <ee:variables>
      <ee:set-variable variableName="httpStatus" resource="variables/set-httpStatus-with-204.dwl" />
    </ee:variables>
  </ee:transform>
</flow>
```

![エラー処理や HTTP 状況の設定が含まれる、商品を削除するプロセスが表示されているフロー](/mulesoft/current/ja-jp/mule-runtime/4.8/_images/m4-apikit-based-example-delete-product-flow.png)

Figure 10. Studio 7 の delete-product-flow

## [](#バックエンドフローの移行)バックエンドフローの移行

バックエンドフローの移行方法

APIkit によって生成された各バックエンドフローの実装に ​`flow-ref`​ を追加します。

\+ .Studio 6 のバックエンドフローの設定 XML。

```xml
<flow name="get:/product:api-config">
  <flow-ref name="get-products-flow" doc:name="get-products-flow" />
</flow>
<flow name="get:/product/{id}:api-config">
  <flow-ref name="get-product-by-id-flow" doc:name="get-product-by-id-flow" />
</flow>
<flow name="post:/product:application/json:api-config">
  <flow-ref name="post-product-flow" doc:name="post-product-flow" />
</flow>
<flow name="delete:/product/{id}:api-config">
  <flow-ref name="delete-product-flow" doc:name="delete-product-flow" />
</flow>
<flow name="put:/product/{id}:application/json:api-config">
  <flow-ref name="put-product-flow" doc:name="put-product-flow" />
</flow>
```

+

\+ .Studio 7 のバックエンドフローの設定 XML。

```xml
<flow name="get:\product:api-product-config">
  <flow-ref name="get-products-flow" doc:name="get-products-flow" />
</flow>
<flow name="get:\product\(id):api-product-config">
  <flow-ref doc:name="get-product-by-id-flow" name="get-product-by-id-flow"/>
</flow>
<flow name="post:\product:application\json:api-product-config">
  <flow-ref name="post-product-flow" doc:name="post-product-flow" />
</flow>
<flow name="delete:\product\(id):application\json:api-product-config">
  <flow-ref doc:name="delete-product-flow" doc:id="38894873-9a01-4e59-8362-5eefce5ea043" name="delete-product-flow"/>
</flow>
<flow name="put:\product\(id):application\json:api-product-config">
  <flow-ref doc:name="put-product-flow" doc:id="e64cf378-26a2-4435-8d0d-269c50282b3c" name="put-product-flow"/>
</flow>
```

## [](#デフォルトの-apikit-グローバル例外戦略の拡張)デフォルトの APIkit グローバル例外戦略の拡張

1. `APP:NOT_FOUND`​ 例外種別を ApiKit で生成された 404 マッピングに追加し、​`get-product-by-id-flow`​ の ​`validation:is-true`​ 要素によってスローされた例外を処理します。特定の状況コードにマップするその他のエラーに対してこのプロセスを繰り返すことができます。
    
    Studio 6 の ApiKit による 404 へのマッピングの設定 XML。
    
    ```xml
    <apikit:mapping statusCode="404">
      <apikit:exception value="org.mule.module.apikit.exception.NotFoundException" />
      <set-property propertyName="Content-Type" value="application/json" doc:name="Property" />
      <set-payload value="{ &quot;message&quot;: &quot;Resource not found&quot; }" doc:name="Set Payload" />
    </apikit:mapping>
    ```
    
    Studio 7 の ApiKit による 404 へのマッピングの設定 XML。
    
    ```xml
    <on-error-propagate type="APIKIT:NOT_FOUND, APP:NOT_FOUND" doc:name="On Error Propagate" enableNotifications="true" logException="true">
      <ee:transform xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd" doc:id="70f893cb-6106-42d9-9a95-e201e9349159">
        <ee:message>
          <ee:set-payload><![CDATA[%dw 2.0
    output application/json
    ---
    {message: "Resource not found"}]]></ee:set-payload>
        </ee:message>
        <ee:variables>
          <ee:set-variable variableName="httpStatus"><![CDATA[404]]></ee:set-variable>
        </ee:variables>
      </ee:transform>
    </on-error-propagate>
    ```
2. まだ管理されていないすべての例外に、汎用の ApiKit による 500 へのマッピングを追加します。
    
    Studio 6 の汎用の ApiKit による 500 へのマッピングの設定 XML。
    
    ```xml
    <apikit:mapping-exception-strategy name="api-apiKitGlobalExceptionMapping">
      <!-- other exception strategies here -->
      <apikit:mapping statusCode="500">
        <apikit:exception value="java.lang.Exception" />
        <set-property propertyName="Content-Type" value="application/json" doc:name="Property" />
        <set-payload value="{ &quot;message&quot;: &quot;Internal Server Error&quot; }" doc:name="Set Payload" />
      </apikit:mapping>
    </apikit:mapping-exception-strategy>
    ```
    
    Studio 7 の汎用の ApiKit による 500 へのマッピングの設定 XML。
    
    ```xml
    <error-handler>
      <!-- other exception strategies here -->
      <on-error-propagate doc:name="On Error Propagate" enableNotifications="true" logException="true">
        <ee:transform xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd" doc:id="7e8049ff-cae6-4937-8569-c36bb7f06dad">
          <ee:message>
            <ee:set-payload><![CDATA[%dw 2.0
    output application/json
    ---
    {message: "Internal Server Error"}]]></ee:set-payload>
          </ee:message>
          <ee:variables>
            <ee:set-variable variableName="httpStatus"><![CDATA[500]]></ee:set-variable>
          </ee:variables>
        </ee:transform>
      </on-error-propagate>
    </error-handler>
    ```