FlowからApex呼び出し

  • 2019.07.19

概要 宣言的型の開発(UIベースでの実装)であるFlowからApex(プログラムベースでの実装)を呼び出して実行するプログラムの実装方法を記載します。特にApexの呼び出しで複数のパラメータを引数として渡したいパターンについて整理します。 InvocableMethod アノテーション まず、Flowから呼び出すApexクラスのメソッドには、InvocableMethodアノテーションをつけて、staticでpublicまたはglobalで宣言します。InvocableMethodアノテーションをつけたメソッドは、クラスに1つのみが宣言可能となります。 InvocableVariable アノテーション InvocableMethodのメソッドで入力もしくは出力のクラス変数のパラメータを定義する際には、InvocableVariable アノテーションを使用します。なので、InvocableMethodのメソッドで複数のパラメータを渡したい場合等には、入力用のクラスを宣言して、そのクラス変数としてInvocableVariableアノテーションをつけます。 サンプル サンプルでは、複数の取引先と親ケースのIDと件名をFlow等から呼び出しの引数として渡して、それらに紐付けたケースを一括作成するような処理を行なっています。 参考 InvocableMethod アノテーションhttps://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_InvocableMethod.htm InvocableVariable アノテーションhttps://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_InvocableVariable.htm

【JavaScript】関数スコープとブロックスコープ

  • 2019.06.12

概要 ES6以前は、JavaScriptの変数はvarで宣言することのみが可能でした。ES6以降はletとconstを加えて、3種類で変数を宣言することが可能となりました。本記事では、これらを使って宣言した変数が関数スコープとブロックスコープでどのような違いがあるかを記載します。 関数スコープ 関数内でvarを使用して宣言した変数は、関数外で使用するとエラーとなります。 ブロックスコープ ifやfor等のブロック内でvarを使用して宣言した変数は、ブロック外で使用してもエラーとならず、そのまま使用することができてしまいます。 letやconstを使用した場合 ES6以降で登場したletやconstを使用することで上記のような関数スコープとブロックスコープの差をなくすことができます。※ 本記事ではletとconstの違いは触れません。簡単にいうと上書きできるかできないかです。 関数スコープ ブロックスコープ 参考 The Difference Between Function and Block Scope in JavaScripthttps://medium.com/@josephcardillo/the-difference-between-function-and-block-scope-in-javascript-4296b2322abe

Salesforce CLIを整理してみた

  • 2019.06.02

概要 本記事は、Salesforce CLIで使用可能なコマンドを整理したものとなります。筆者が気になったコマンドついては、個別に実行してどのような結果となるかを試してみました。ただし、これらのコマンドは毎リリースで仕様が更新されているので最新情報は下記のURLで確認してください。https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference.htmなお、本記事に記載の情報は、summer’19(Ver46)時点のものとなります。 コマンド整理 alias Commands alias:list CLIのコマンドで使用できる別名をリスト表示 alias:set CLIのコマンドで使用できる別名を設定 sfdx force:alias:listローカルで使用しているユーザIDに対する別名をリストで確認することができます。sfdx force:alias:set YourAlias=username@example.com別名を設定することもできます。 apex Commands apex:class:create Apexクラスの作成 apex:execute Apexクラスの実行 apex:log:get 最後のデバックログを取得 apex:log:list デバックログIDのリストを表示 apex:log:tail ターミナルでデバックログのテイルを有効化 apex:test:report 特定のテストを実行した結果を表示 apex:test:run Apexのテストを実行 apex:trigger:create Apexトリガーの作成 sfdx force:apex:class:create -n sfdxCliApexTest -d ./classes/クラス名とローカルのディレクトリを指定してApexクラスを作成します。 sfdx force:apex:execute -f ./classes/sfdxCliApexTest.clsローカルのApexクラスをファイルを実行することができます。 sfdx force:apex:log:list auth Commands auth:jwt:grant JWTフローで組織へ認証 auth:list 認証済の接続情報をリストで表示 auth:logout 認証済みの組織からログアウト auth:sfdxurl:store SFDXの認証URLを使用して組織へ認証 auth:web:login ブラウザのログイン画面経由で認証 sfdx force:auth:web:login -a <別名> -r <インスタンスURL>通常のWEBのログイン画面でユーザID、パスワードで認証できます。 sfdx force:auth:listローカルでSalesforce組織に対して認証済の接続情報をリストで表示します。 config Commands config:get デフォルトのスクラッチ組織/DebHub/インスタンスURLの設定を取得 config:list CLIのための設定変数をリストで表示 config:set CLIのためのLocalとGlobalの設定変数を更新 sfdx force:config:listローカルでCLIのための設定変数をリストで表示します。 data Commands data:bulk:delete CSVファイルのレコードリストをバッチで削除 data:bulk:status BulkAPIのJob/バッチステータスをポーリング data:bulk:upsert BulkAPIによるUPSERTのJobかバッチを作成 data:record:create レコードをINSERT data:record:delete 単一レコードをDELETE data:record:get 単一レコードを表示 data:record:update 単一レコードをUPDATE data:soql:query SOQLを実行 data:tree:export sObjectとツリーフォーマット(json)で組織からデータをエクスポート data:tree:import sObjectとツリーフォーマット(json)で組織へデータをインポート sfdx force:data:record:update -s Account -i 0017F00000ezMN3QAM -v “Name=GenePoint-Update”-sでオブジェクト名、-iでID、-vで更新カラムと値を引数で渡すことでUPDATEできる sfdx force:data:record:update -s Account -w “Name=’GenePoint'” -v “Name=’GenePoint-Update'”-wでWHERE句のように条件を指定することもできる sfdx force:data:soql:query -q “SELECT Id, Name FROM Account”SOQLを実行して結果を表示する sfdx force:data:tree:export -q “SELECT Id, Name FROM Account”SOQLを実行してjson形式でデータをエクスポートする doc Commands doc:commands:display コマンドのヘルプを表示 doc:commands:list コマンドのリスト表示 sfdx force:doc:commands:listforce名前空間のCLIコマンドを全て一覧で表示 lightning Commands lightning:app:create Lightningアプリケーションを作成 lightning:component:create AuraコンポーネントかLWCの枠を作成 lightning:event:create Lightningイベントの枠を作成 lightning:interface:create Lightningインターフェースの枠を作成 lightning:lint Auraコンポーネントコードに対して静的解析、または「lint」ツールを実行 lightning:test:create Lightningテストを作成 lightning:test:install Lightning Testing Serviceに非管理パッケージを組織にインストール lightning:test:run Auraコンポーネントのテストを実行 limits Commands limits:api:display APIコールやイベントの制限について最大数と残数を表示 sfdx force:limits:api:display mdapi Commands mdapi:convert メタデータAPIで取得したメタデータをDXプロジェクトで利用できるソース形式に変換 mdapi:deploy 作成、更新したコンポーネントを組織にデプロイ mdapi:deploy:cancel 非同期のデプロイをキャンセル mdapi:deploy:report 非同期のメタデータのデプロイ状況をチェック mdapi:describemetadata 組織で有効なメタデータタイプを表示 mdapi:listmetadata 特定のメタデータタイプのプロパティを表示 mdapi:retrieve 対象の組織からメタデータをxmlファイルのZipを取得 mdapi:retrieve:report 非同期のメタデータの取得状況をチェック sfdx force:mdapi:describemetadata sfdx force:mdapi:listmetadata -m CustomObject org Commands org:clone (Beta) 設定ファイルかkey-valueのペアで指定された値を使ってSandbox組織をクローン org:create 設定ファイルかkey-valueのペアで指定された値を使ってSandbox組織かスクラッチ組織を作成 org:delete スクラッチ組織を削除 org:display 対象の組織の説明を表示 org:list CLIで作成したもしくは、認証した組織をリスト表示 org:open ブラウザで組織を表示 org:shape:create […]

SOQLの基礎

  • 2019.05.26

概要 本記事では、SOQLの基礎的な事項を実行のサンプルコードをベースにして整理しております。まずSOQLとは、Salesforce Object Query Languageの略であり、データベース(オブジェクト)から必要となるデータを取得する際に利用するものとなります。一般的なSQLとの違いは、いくつかありますが一つはSQLでは複数のテーブルを自由に条件指定することで結合してデータを抽出することができますが、SOQLではオブジェクト同士にリレーションがある場合にのみ結合することができます。また、SQLの’UPDATE’や’DELETE’のようなDMLはSOQLでは使用できないので、Apexで実行する必要があります。 Apexの中でSOQLを実行する2つの方法(静的SOQL、動的SOQL)から紹介します。 静的SOQL(インラインSOQL) Apexでは[ ]句によって、静的なSOQLを記載することができます。[ ]句の中では、 下記のようにバインド変数を使用することで条件を指定できます。 動的SOQL Apexの処理の中で実行するSOQLを動的に編集することができます。実行するSOQL文をStringでDatabase.queryに渡すことができます。SOQLの中で一つのレコードの取得に限定しているのであれば、sObjectで受けることができます。 複数件以上のレコードを取得するのであれば、sObjectのリストで受けます。 サンプルは下記の通りとなります。 また、バインド変数を使用しない例では下記のようにSOQL文を組み立てることもできます。 SOQLの構文(演算子) SOQLで使用することができる各構文(演算子)を記載していきます。 =(等号) >,<,>=,<=(不等号) INCLUDES/EXCLUDES 複数選択リストでの条件を指定する際に使用します。下記の例では、PassportおよびAadhar Card、もしくはPAN Cardのレコードを抽出する条件となります。 LIKE SQLで使用するのと同じように部分一致の検索を行う際に使用します。% と _ がワイルドカードしてサポートされています。%は、0文字もしくは複数の文字列を表します。_は、1文字を表します。 IN SQLで使用するのと同じように複数の項目をOR条件で一致する値を指定する際に使用します。 NOT IN SQLで使用するのと同じように複数の項目をOR条件で一致しない値を指定する際に使用します。 SUBQUERY IN句/NOT IN句には、リレーションがある子オブジェクト、または親オブジェクト条件で指定することができます。 子オブジェクトを条件に指定 親オブジェクトを条件に指定 LIMIT 取得するレコードの上限を指定できます。 OFFSET 取得するレコードの開始行を指定することができます。 GROUP BY ある項目で集計することでCOUNT/SUM/MAX/MIN関数を使用することが集計単位ごとの値を算出できます。 GROUP BY ROLLUP GROUP BYにの機能に加えて、実行結果に小計行を出力されることができます。 [実行結果イメージ] [実行結果イメージ] HAVING GROUP BYで集計した結果に対して、取得するレコードの条件を付与します。 リレーションを使用した値の取得、および条件指定 子から親へのアクセス 子オブジェクトから親オブジェクトをSOQLで使用したい場合は、対象の子オブジェクトで定義されている主従関係もしくは参照関係の項目により辿って親オブジェクトの所定の項目を指定できます。 カスタムオブジェクトの場合には、項目のAPI参照名の__cの部分を__rに変換して記載することになります。 親から子へのアクセス 親オブジェクトから子オブジェクトをSOQLで使用したい場合は、対象の子オブジェクトで定義されている主従関係もしくは参照関係の項目の子リレーション名により辿って子オブジェクトの所定の項目を指定できます。contactsが子リレーション名になります。 カスタムオブジェクトの場合には、子リレーション名に__rを付与して記載することになります。 参考 動的SOQLhttps://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_dynamic_soql.htm複数選択リストのクエリhttps://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_querying_multiselect_picklists.htm

【JavaScript】==と===の違いおよび型のチェック方法

  • 2019.05.20

概要 本記事では、JavaScriptにおける比較演算子の==と===の違い、および変数の型をチェックする方法を記載します。 ==と===の違い ==と===の違いとしては、簡単に言うと===の方が値だけでなく型まで含めて等しいかをチェックするのに対して、==では暗黙的な型変換により型を合わせた上で等しいかをチェックするという部分になります。下記に具体例を記載します。 また、別の記事で記載しておりますがJavaScriptの暗黙的な型変換は少し特殊な変換がなされるため、==を使用した場合には想定外にtrueに判定される時があります。 暗黙的な型変換についての詳細はこちらを参照。 したがって、JavaScriptのロジックにおける比較演算子は===を使用して厳格にすることが推奨されます。ただし、上記のような仕様を理解して上で==を使用するのは全く問題ないと思います。 型のチェック方法 JavaScriptの型をチェックする1つの方法は、typeofを使用することで、変数の型を返すのでそれを元にチェックすることができます。もう1つは、instanceofを使用することで、変数が指定する型と等しいかをチェックすることができます。それ以外にも型によって使えるものがあったり、typeofとinstanceofが使えるかも異なるので下記を参考にしてください。 String Number Array Function Object Nullとundefined Boolean Error Date Symbol まとめ 今回は、==と===の違いや変数の型チェックという基礎的ですが理解していないと予期せぬエラーの原因となる部分を整理しました。特に型チェックの方法は癖がありそうなので、注意したいところです。 参考 JavaScript — Double Equals vs. Triple Equalshttps://codeburst.io/javascript-double-equals-vs-triple-equals-61d4ce5a121a How to better check data types in javascripthttps://webbjocke.com/javascript-check-data-types/

Spring’19の認定資格を更新

  • 2019.05.19

概要 本記事は、Salesforceに置けるSpring’19のリリース内容について各種認定資格を更新するためのTrailheadで学習したもののサマリとなります。なお、更新を行ったのは、下記の3つの認定資格となります。アドミニストレーター認定資格の更新 (Spring’19)https://trailhead.salesforce.com/ja/content/learn/modules/administrator-maintenance-spring19Platform アプリケーションビルダー認定資格の更新 (Spring ’19)https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-maintenance-spring19Platform デベロッパー資格の更新 (Spring ’19) https://trailhead.salesforce.com/ja/content/learn/modules/platform-developer1-maintenance-spring19 アドミニストレーター セールスプロセス全体のカスタマイズ リードと商談のフェーズをカスタマイズできるため、リードがどこでどのように商談に変更されたかを確認できる。 Lightning Experience の結合レポート 最大 5 つのブロックを含めた結合レポートを使用して、さまざまな種類の情報を 1 つのレポートに表示できる。各ブロックには、1 つの標準レポートタイプまたはカスタムレポートタイプからデータを表示できる。結合レポートは、複数のレポートタイプをまたがって Salesforce データを分析するのに適している。1つのオブジェクトの複数のビューを同時に取得することもできる。 Lightning Experience での取引先チームの削除取引先チームのメンバーを一括で削除することができる。 パートナー取引先のリレーションとデータ共有ルールの作成 パートナー取引先間のデータ共有において、取引先データリレーショナル共有ルールを作成して、取引先リレーションで対象レコードと関連づけることで実現できる。取引先リレーションデータ共有ルールは、取引先、取引先責任者、キャンペーン、ケース、リード、商談、注文、カスタムオブジェクトに適用できる。 マクロでの相対日付を使用した正確な日時の設定マクロで設定する 日付で具体的な日付ではなく、実行日から特定の日数が経過した相対日付を指定することできる。 Lightning ページから別のテンプレートへの切り替え Lightning アプリケーションビルダーで Lightning ページのプロパティを表示するときに、[テンプレート] 項目の横にある [変更] からできる。 アプリケーションビルダー Flow Builder を使用したより直感的なフローの作成 クラウドフローデザイナから大幅にUIが改善されたFlowビルダーで作成できるようになった。Flowビルダーでは、Adobe Flashをインストールする必要がない。 Lightning Web コンポーネントの作成 Lightning Web コンポーネントと Aura コンポーネント (元のモデル) の 2 つのプログラミングモデルを使用して、Lightning コンポーネントを作成できるようになった。Lightning Web コンポーネントは、HTML と最新の JavaScript を使用して作成されたカスタム HTML 要素である。Lightning Web コンポーネントと Aura コンポーネントは 1 つのページで共存および相互運用できる。どちらも Lightning コンポーネントとしてシステム管理者やエンドユーザに表示されます。現時点では、開発者コンソールで作成、編集することはできず、Salesforce CLIによりデプロイする必要がある。 VSCodeのExtensionを使うと良い。 リッチテキストコンポーネントは Quill テキストエディタを使用 リッチテキストコンポーネントは Quill テキストエディタを使用リッチテキストコンポーネントが Lightning Locker とスムーズに連携するように、テキストエディタを CKEditor から Quill に変更となった。CKEditor・・・WYSIWYG※1の一種で、ワードのような操作でHTMLが記述できるツールである。※1What You See Is What You Get(見たままが得られる)Quill・・・オープンソースのWYSIWYGエディタで、JavaScriptで作られていて、Webサイト上で手軽にWYSIWYG対応のテキスト編集機能を提供することができる。 標準およびカスタムユーザ権限に基づくコンポーネントの表示の設定ページを表示する ユーザの権限を基にコンポーネントの表示条件を設定して、Lightning ページをより動的にすることができるようになった。 デベロッパー Auth.VerificationResultクラスSystem.UserManagement.verifySelfRegistration メソッドの結果を保存する。このメソッドは、独自の検証ページを作成したときに呼び出す検証の結果を返す。ユーザが正常に作成された場合、検証状況とセッション ID が含まれる。 System.OrgLimitクラスインスタンスの名前、現在の値、および最大制限を返すメソッドが含まれます。getName() – 制限の名前を返す。getValue() – 使用制限値を返す。getLimit() – 制限の最大値を返す。 System.OrgLimits クラスすべての組織制限のリスト、またはすべての組織制限の名前と値の対応付けが含まれる。getAll() – OrgLimit インスタンスのリストを返す。getMap() – すべての OrgLimit インスタンスと制限名の対応付けをキーとして返す。 AppLauncher.LoginFormController クラスloginGetPageRefUrl(username, password, startUrl)メソッドこのメソッドは、特定のユーザ名とパスワードを使用してユーザをログインする。Lightning 環境でログインに成功した場合、ユーザは startUrl で指定されたページにリダイレクトされます。非 Lightning 環境では、メソッドによって返される startUrl を使用してリダイレクトをプログラムする。ログインに失敗すると、エラー文字列が返される。 Auth.AuthConfiguration クラスgetCertificateLoginEnabled(domainUrl)メソッド証明書ベースの認証が [私のドメイン] の URL で有効になっている場合、true を返す。getCertificateLoginUrl(domainUrl, startUrl)メソッド組織で証明書ベースの認証が有効になっている場合、[私のドメイン] の URL の証明書ベースの認証エンドポイントを返す。 Auth.SessionManagement クラスfinishLoginDiscovery(method, userId)メソッド[私のドメイン] のログイン検出ログインプロセスを完了する。 System.SObject クラスisSet(fieldName)メソッドクエリ対象の sObject 項目に関する情報を返す。sObject 項目が直接割り当てか SOQL クエリへの追加によって入力されている場合、true を返す。sObject 項目が設定されていない場合、false を返します。無効な項目が指定されている場合、SObjectException が発生する。isSet(field)メソッドクエリ対象の sObject 項目に関する情報を返す。sObject 項目が直接割り当てか SOQL クエリへの追加によって入力されている場合、true を返す。sObject 項目が設定されていない場合、false を返します。無効な項目が指定されている場合、SObjectException が発生する。 System.UserManagement クラスinitSelfRegistration(method, user)メソッドコミュニティセルフ登録用の独自の検証ページを作成するときに、このメソッドを使用して検証を呼び出す。sendAsyncEmailConfirmation(userId, emailTemplateId, networkId, startUrl)メソッドユーザのメールアドレスに検証用のメールメッセージを送信する。このメッセージには、ユーザが後でメールアドレスを検証するためにクリックする検証リンク (URL) が含まれます。メール検証を一括で送信できる。verifySelfRegistration(method, identifier, code, startUrl)メソッドコミュニティセルフ登録用の独自の検証ページを作成するときに、このメソッドを使用して検証を完了する。登録を行っている人が検証コードを正常に入力すると、ユーザが作成されてログインされる。 System.Test クラスstopTest()メソッドレコード変更プロセスとイベントプロセス (プロセスビルダーで作成) のスケジュール済みアクションを実行し、時間ベースの再開イベントを待機しているフローを再開します。 System.String クラスformat(stringToFormat, formattingArguments)メソッドformattingArguments パラメータ種別は、パラメータとして非文字列オブジェクトを許可するために List<String> の代わりに List<Object> を使用するようになった。第 1 引数をパターンとして扱い、第 2 引数を置換および形式設定に使用して文字列を返す。この置換および形式設定は、apex:outputText および Java MessageFormat クラスと同じ方法である。第 2 引数の List の非文字列型は、その型に存在する […]

VSCodeでSalesforceのPackage.xmlを作成

  • 2019.05.17

概要 本記事では、VSCodeのExtensionを使うことでSalesforceの対象組織のメタデータを抽出するのに必要となるPackage.xmlを作成する方法を記載します。 Extension 使用するExtensionは下記になります。なので、まずはこれをVSCodeにインストールします。Salesforce Package.xml Generator Extension for VS Codehttps://marketplace.visualstudio.com/items?itemName=VignaeshRamA.sfdx-package-xml-generator Usage SFDXのプロジェクトを作成 コマンドパレット(Cmd+Shift+P)を開き、 SFDX: Create Project with Manifestを実行します。下記のように空のプロジェクトが作成されます。 SFDXで対象の組織を認証 コマンドパレット(Cmd+Shift+P)を開き、 SFDX: Authorize an Orgを実行します。ProductionかSandboxかを選択するとログイン画面遷移するので、ログインIDとパスワードでログインを実施します。下記のOAuthの認可画面で許可することで、VSCodeから組織の情報にアクセスできるようになります。 package.xmlを作成 コマンドパレット(Cmd+Shift+P)を開き、SFDX Package.xml Generator: Choose Metadata Componentsを実行します。Eclipse Force.com IDEと同じような感じの下記の画面が表示されるので必要なメタデータを選択して、Update Package.xmlを押下することでpackage.xmlが更新されます。 package.xmlを元にメタデータを取得 コマンドパレット(Cmd+Shift+P)を開き、SFDX: Retrieve Source in Manifest from Orgを実行します。 まとめ Force.com IDEと同じようにPackage.xmlを作成することがVSCodeでできるようになったのはとても良いと思いました。ただ、公式ではないので実務での使用には注意が必要そうです。 参考 Org Development Model with VS Codehttps://forcedotcom.github.io/salesforcedx-vscode/articles/user-guide/org-development-model Github(vignaesh01/sfdx-package-generator)https://github.com/vignaesh01/sfdx-package-generator

【JavaScript】暗黙的、明示的な型変換

  • 2019.05.12

概要 JavaScriptの型変換には、暗黙的と明示的があります。具体的には、Number(value)のような関数が明示的な変換にあたります。暗黙的な変換は、異なる型をオペランドでつなぐ処理でどちらかの型に合わせるように変換するようなものとなります。例えば、Stringは数値を期待されるような場合にはNumber型に変換されます。なので、JavaScriptでは型の不正による予期せぬエラーはほとんどの場合で回避されます。 ===と==の違い ===を使って比較すると、暗黙的な変換はせずに型も含めた比較になります。逆に==の比較では、必要に応じて暗黙的な変換をした上で比較を行います。実際に比較をしてどのようになるかは、下記のテーブル表が参考になります。https://dorey.github.io/JavaScript-Equality-Table/ StringとNumber オペランドによりStringからNumberに暗黙的に変換される処理は、Number関数で変換するのと同じプロセスになります。Number関数は、数字を含むStringであれば正しく変換されますが、数字ではない文字列である場合は、NaN(not a number)を返します。Stringに明示的に変換する場合にはString関数を使用します。 オペランドが-, *, /, %の場合には、Stringは暗黙的にNumberに変換されますが、+の場合にはNumberがStringに変換されるような挙動となります。 Boolean型と空文字列をNumberに変換すると下記のようになります。 Boolean Booean型の変換では、下記の値がJavaScriptではfalseとなります。ちなみに、ifやelse ifの比較や||,&&の演算子があると必要に応じて暗黙的の変換が行われます。 逆に下記がtrueに変換されるものとなります。 Object(Array含む) Object型は、暗黙的な変換では[object Object]という文字列に変換されます。Object型はtoString()を継承しており、暗黙的な変換ではこれが呼び出されます。なので、ObjectのtoString関数を上書きすることで、適切な文字列を返すようにすることができます。また、数値への変換の場合には、valueOf()を継承することで変換時に呼び出されるようにもできます。 Array型は、暗黙的な変換では、,(カンマ)区切りに連結した文字列に変換されます。 まとめ JavaScirptの暗黙的、明示的な型変換について整理してみましたが、非常に便利な機能である反面で想定外の動きをする原因にもなったりするので、しっかり理解して実装する必要があると改めて実感しました。 参考 What you need to know about Javascript’s Implicit Coercionhttps://dev.to/promhize/what-you-need-to-know-about-javascripts-implicit-coercion-e23 JavaScript type coercion explainedhttps://medium.freecodecamp.org/js-type-coercion-explained-27ba3d9a2839

Spring Boot 2の基礎

  • 2019.05.06

概要 本記事は、下記の本を読んでSpring Boot2(その他諸々)について学んだことを簡単に整理したものとなります。整理している内容としては、概念的な部分から細かいTipsまでをピックアップしております。大体、本の目次ごとに整理しております。 Spring Bootとは Spring Frameworkの本体をベースに「Spring MVC」「Spring Roo」「Spring Boot」で構成されている。 「Spring MVC」は、WebアプリのベースでありModel-View-Controllerで構成されいる。 「Spring Roo」は、各種コードの自動生成機能ライブラリ(RubyでいうRailsのようなイメージ)である。 つまり、「Spring Boot」は、「Spring MVC」を土台にして「Spring Roo」を組み合わせて全体をシンプルに使えるように統合したものである。 「Spring Boot」での開発は、正確には「Spring MVCをベースにしたSpring Bootによる開発」と言える。なお、Spring Frameworkの「DI」「AOP」が基本思想となる。だたし、Spring Frameworkは、WEB開発専用ではない。(「Spring MVC」、「Spring Boot」はWEB専用である。 Spring Bootは、従来の「XMLによる設定だらけ」のJavaEEの開発から「アノテーションにより設定を使わない」開発へシフトするような思想である。 Spring FrameworkとSpring BootでWEBアプリを開発した場合の違いとして、Spring Frameworkは、Warファイルを作成してサーバーにデプロイする必要がある。Spring Bootは、サーブレットコンテナが内臓されており、そのサーバーにデプロイしてアプリケーションを実行するので「サーバーへのデプロイ」が不要となる。 Spring開発のツール 「Spring Tool Suite(STS)」は、フレームワークが提供する専用の開発ツールである。https://spring.io/tools Eclipse,VSCode,AtomのIDEに対応したアドインがある。 「Spring Tool Suite(STS)」自体は、EclipseがベースになったIDEである。 Groovyについて Groovyは、Java仮想マシン上で動作するスクリプト言語で、本格開発の前のプロトタイピング等で使用される Groovyアプリは、「Javaで開発するSpring Bootアプリの基本部分を簡単に作れるようにした簡易版Spring Bootアプリである」 Spring Boot CLIを下記のコマンドによりインストールする GroovyのHello Worldは下記のように実装する JavaによるSpring Boot開発の基本 MavenとGradle Mavenは、セントラルリポジトリの考え方でJavaのほとんどのライブラリがMaven経由でビルドすることができる Gradleは、ビルドの情報や処理をGroovyによるスクリプトによって記述できる Mavenhttp://maven.apache.org/ pom.xmlの継承は、<parent>タグで記載する <build>タグは、プログラムのビルド時に使用される <plugins>タグは、ビルド時に使うプラグインが記載される Gradle https://gradle.org/ Spring Bootの基礎 @SpringBootApplicationは、Spring Bootのアプリケーションであることを示す。 @PathVariableは、@RequestMapping(“/”{num})のような記載をした場合に変数を受け取ることができる。 RestControllerは、JavaのインスタンスをJSON型式のテキストの形に変換して出力できる。 @Controllerを使って、通常のWebページは実装する。 @Controllerで返される文字列でテンプレート(resource/templatesフォルダ)を検索する。 Modelクラスは、@Controllerアノテーションのメソッドの引数で受け取ることができる。 Webページで利用するデータを管理するためのクラスModelクラスとModeAndViewクラスの違いは、テンプレートの名前をインスタンスに設定できる。 @RequestParamは、フォーム送信された値を指定するためのアノテーションである。 @RequestParamは、value(htmlのIDを指定する値)とrequired(必須か否か)のパラメータを設定する。 ページの移動は、@Controllerのreturで”redirect:/XX”か”forward:/XX”でurlを指定する。 テンプレートエンジン(Thymeleafについて) Tymeleaf(タイムリーフ)は、基本がHTMLの形式であり、動的に変える部分を${{XX}}(変数式という)という形で記載する。 変数式の中は、OGNL(Object-Graph Navigation Language)式というJavaの値にアクセスするための言語で記載する。 「#名前」でユーティリティオブジェクトを指定することができる例)${#data.format(new java.util.Date(), ‘dd/MMM/yyyy HH:mm’)} メッセージ式で、あらかじめ用意したプロパティファイルを読み込むことができる。Htmlでは、#{ 値の指定 }と記載する。 リンク式は、@{ アドレス }で記載する。 選択オブジェクトの記載は、th:object=”${オブジェクト}”とth:text=”*{プロパティ}”とセットで指定する。なお、オブジェクトは、@Controllerからreturnに設定する。 リテラル置換は、”| テキストの内容 |”でもできる。もしくは”(ダブルコート)と'(シングルコート)の組み合わせ テンプレートエンジンとして、なぜJSPが、Spring Bootに向いていないか?「JSPは、JAR形式では動作せず、WARファイルとしてデプロイする必要があるため」「既にJSP自体がサーバーサイドJavaで使われなくなっている」「スクリプトレットでJavaのソースをJSPの中に記載できるのが、逆にロジックの分散に繋がってしまう」 モデルとデータベース Spring BootのModelは、Javaの「JPA」(Java Persistence API)の機能を使用して実装される。「オブジェクトなどのデータを保存して常に利用できるようにすること」 エンティティクラスが、テーブルとして自動で用意されて保存されるイメージである。@Entityをクラスに対してつけることで作成できる。 @Table(name=”myData”)でテーブル名を指定し、@Idはプライマリキーの項目につける。 @GeneratedValue(strategy = GenerationType.Auto)で、自動採番の項目とする。 @Columnは、カラムに対してつける。 「リポジトリ」機能によりEntityManagerでデータベースアクセスのクラスを作成する。 @Repositoryアノテーションをつけて、JpaRepositoryクラスを継承する @Autowiredで、Spring MVCにより自動でオブジェクトが生成されてアプリケーションで利用できるようになる「@Repositoryを指定したインターフェースクラス(EntityManager)を用意する」「@Autowiredを指定したリポジトリインターフェースのフィールドを用意する」 フレームワークでは、Spring MVCが、@Repositoryがついたインターフェースの実装クラスのインスタンスを自動で生成してアプリケーションに自動でBeanとして登録した後に、コントローラーなどのクラスで@Autowiredの変数があるとBeanからから同じクラスのものを探し、自動的にフィールドに割り当てる。 @ModelAttributeは、エンティティクラスのインスタンスを自動的に用意するものである。 @Transactionalは、データベースを利用する一連の処理を一括して実行するための仕組みである。 @PostConstructは、コンストラクタによりインスタンスが生成された後に呼び出される処理である。 Optionalクラス(Java8で登場したクラス)は、nullかもしれないオブジェクトをラップするためのクラスである。 @SuppressWarnings(“unchecked”)は、ビルド時に警告が出ないようにする。 @PersistenceContextは、Beanを取得して設定する。 JPQLというクエリ言語をJPAがSQLクエリに変換してDBに投入する。 Spring Bootの構成 ドメイン層にあるものは、コントローラーやモデルのビジネスロジックから呼び出される。 @Serviceは、サービスとして登録するもの。 @AutoWiredで利用するコンポーネントとは、アプリケーション内で自動生成されるBeanのことである。 サービスもコンポーネントの一種であり、@Componentのとして登録するもの。 @Componentのクラスでは、@Autowiredコンストラクタによってインスタンスが生成される。 その他 MongoDBは、NoSQLのDBで「ドキュメント指向データベース」でありデータは一つの巨大なテキストファイルとして保存される保管されるデータは、JSON形式で書かれたコレクションのような形となっている。 サンプルアプリ 本の中のソースを一部カスタマイズして、Herokuにサンプルアプリをデプロイしておりますので、下記のURLから動作確認できます。https://spring-boot-sample-yhayash30.herokuapp.com/ サンプルコード サンプルコードは下記に格納しております。https://github.com/yhayashi30/spring-boot-sample-app 最後に Spring Bootは、Webアプリに非常に最適化されておりJavaで実装するのであれば有力な選択肢となると感じました。また、本としても初学者でもわかりやすいように整理された内容に感じたのでおすすめです。

JavaのアプリからSalesforceのREST APIをコールする方法

API
  • 2019.04.30

概要 Javaのアプリケーション等の外部システムからSalesforceのREST APIをコールするには、事前にSalesforceの対象組織に対してログイン認証をする必要があります。本記事ではその部分をJavaのSpring Bootのフレームワークでどのように実装するかについて、サンプルコードを交えて整理しております。また、そのアプリでSalesforceとのOAuthでの認証を実現する方法、Herokuへのデプロイする方法も簡単に記載しております。 構成 今回は下記のような構成で外部システムにあたる部分を実装します。 アプリ:Spring Boot(Java) 基盤:Heroku Javaアプリの作成 最初にSpring Initializr(https://start.spring.io/)からスケルトンを作成します。今回は、ビルドツールはMavenを使用します。 pom.xmlファイルの作成 今回使用するライブラリをpom.xmlファイルに定義します。 ポイントは下記を使用する点となります。spring-security-oauth2・・・SpringにおいてOAuthの認証を実現するために使用します。spring-security-oauth2-autoconfigure・・・Spring Security OAuth2の設定をシンプルに実現するために使用します。 SSOでのOAuth認証を実装 OAuth2 コンシューマがアクセストークンを取得するためには、OAuth2 コンシューマが動作するアプリケーションを利用するユーザーによる OAuth2 プロバイダ認証がとおる必要があります。そのため、取得したアクセストークンで OAuth2 プロバイダのリソースサーバから確かにユーザーの情報が取得できることを確認することを、現在 OAuth2 コンシューマが動作するアプリケーションを利用しているユーザーの Sign On 処理に代えることができます。ユーザーは OAuth2 コンシューマが動作するアプリケーションではログイン処理を行わず、OAuth2 プロバイダでのみログイン認証を行えばよいため、これは Single Sign On の実現方法のひとつです。この Single Sign On を実現するために OAuth2 コンシューマとして必要な処理は、Spring Security OAuth の@EnableOAuth2Sso アノテーション設定で実現できます。 設定ファイルを読み込みREST APIをコール application.propertiesに定義した設定を読み込み、SalesforceのREST APIをコールします。コンシューマ鍵とコンシューマの秘密鍵はHerokuの環境変数で設定するようにします。 REST APIのレスポンスを変換 REST APIのレスポンスのJSON文字列を変換するために下記のクラスを定義しておきます。 Salesforceで接続アプリケーションを作成 設定メニューのクイック検索で”アプリケーションマネージャ”を検索します。※”接続アプリケーションを管理する”のメニューからは新規での作成ができないので注意が必要です。 接続アプリケーション名、API参照名、メールアドレスを入力します。 OAuthを有効化して、スコープとコールバックURLを入力します。なお、コールバックURLには、Herokuにデプロイ後に決まる下記のURLを設定します。https://YOUR_HEROKU_APP_NAME.herokuapp.com/login これでコンシューマ鍵とコンシューマの秘密が発番されるので、後ほどHerokuの環境変数に設定します。 Herokuへアプリをデプロイ まずはHerokuでアプリケーションを作成します。ここで入力したアプリ名がデフォルトのURLに含まれます。 アプリケーションを作成すると下記のようなHeroku Gitが作成されるので、こちらにアプリをPushします。https://git.heroku.com/YOUR_HEROKU_APP_NAME.git デモ アプリケーションのURLへアクセス→Salesforceのログイン画面へ遷移→OAuthの認可→REST APIのコール結果を表示となります。 参考 Spring Boot and OAuth2https://spring.io/guides/tutorials/spring-boot-oauth2/ Deploying Spring Boot Applications to Herokuhttps://devcenter.heroku.com/articles/deploying-spring-boot-apps-to-heroku 最後に 今回のサンプルコードは、下記にありますのでよかったら確認してください。こちらから直接Herokuへデプロイすることもできます。https://github.com/yhayashi30/restapi-salesforce-sso

1 3 7