20210501のJavaに関する記事は9件です。

Vert.xのWebアプリケーションをAzure App Serviceで動かす

これまで、いくつかのJava製WebフレームワークをAzure上で動かしてきました。 - Spring Boot on Azure - Helidon on Azure - Quarkus on Azure 今日はVert.xを試してみます。 プロジェクトはVert.x Starterで作りました。 Dependenciesは何も選択しませんでした。 ローカル環境での実行 HelidonやQuarkusを試したときと同じ環境を使いました。 Docker Visual Studio Code Visual Studio Code Remote - Containers Docker for Visual Studio Code Java Extension Pack Starterを解凍するとMainVerticle.javaが入っています。コードはそのまま使います。 package com.example.starter; import io.vertx.core.AbstractVerticle; import io.vertx.core.Promise; public class MainVerticle extends AbstractVerticle { @Override public void start(Promise<Void> startPromise) throws Exception { vertx.createHttpServer().requestHandler(req -> { req.response() .putHeader("content-type", "text/plain") .end("Hello from Vert.x!"); }).listen(8888, http -> { if (http.succeeded()) { startPromise.complete(); System.out.println("HTTP server started on port 8888"); } else { startPromise.fail(http.cause()); } }); } } ビルドします。 mvn clean package 実行します。 java -jar target/*.jar localhostにアクセスして以下表示になればOKです。 Azureでの実行 続いてAzureにデプロイするための準備です。最初にAzure CLIでログインしておきます。 az login 次にpom.xmlのbuildセクションに以下を追加します。 <plugin> <groupId>com.microsoft.azure</groupId> <artifactId>azure-webapp-maven-plugin</artifactId> <version>1.14.0</version> </plugin> 以下コマンドを実行します。 mvn com.microsoft.azure:azure-webapp-maven-plugin:1.14.0:config 対話式に構成を聞かれるので、linux、Java 8を選びました。 続いて手動でappSettingsを追加します。ポートはVert.xのコードにある通り8888にしました。 <plugins> <plugin> <groupId>com.microsoft.azure</groupId> <artifactId>azure-webapp-maven-plugin</artifactId> <version>1.14.0</version> <configuration> <schemaVersion>v2</schemaVersion> <subscriptionId>xxxxx</subscriptionId> <resourceGroup>demo-xxxxxxxxxxx-rg</resourceGroup> <appName>demo-xxxxxxxxxx</appName> <pricingTier>P1v2</pricingTier> <region>westeurope</region> <runtime> <os>Linux</os> <javaVersion>Java 8</javaVersion> <webContainer>Java SE</webContainer> </runtime> <appSettings> <property> <name>PORT</name> <value>8888</value> </property> <property> <name>WEBSITES_PORT</name> <value>8888</value> </property> <property> <name>WEBSITES_CONTAINER_START_TIME_LIMIT</name> <value>900</value> </property> </appSettings> <deployment> <resources> <resource> <directory>${project.basedir}/target</directory> <includes> <include>*.jar</include> </includes> </resource> </resources> </deployment> </configuration> </plugin> </plugins> ビルドしてデプロイします。 mvn clean package mvn azure-webapp:deploy 問題なく表示されました。この感じだとどんなWebフレームワークでもAzure App Service上で動きそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

FileMaker DataAPIでのJavaでのREST操作

FileMaker DataAPI をJavaから使っています FileMaker DataAPIはRestAPIです。 結果はJSONで返ってきますが、 みなさんはどうやって、RESTを扱っていますか? Jacksonというライブラリが一番有名なようですが、私は使った事がありません。 私は、minimal-jsonというライブラリを、 使って、DataAPIから帰ってきたRESTを操作しています。 このライブラリは、Javaのソースが、たったの15ファイルしかありません。 プロジェクトにjarを使うのではなく、ソースをそのままプロジェクトに入れて しまった方が、学習が楽だと思いました。 JavaのObjectに相当するのが、JsonValueです。 JavaのMapに相当するのが、JsonObjectです。 この2つを頭に叩き込めば、なんとか使えるようになると思います。 (私は最初にJavaのObjectに相当するのがJsonObjectと勘違いしてしまったので   いつも頭が混乱してプログラムを書いていました) 私が使った限りでは、FileMaker DataAPIから、true, false, nullが 返ってくることはありませんでした。 FileMaker のDBのデータタイプには論理型はないので、true, falseがないのは納得できます。 しかしFileMakerのフィールドに値が入っていない時に "" 空文字列が返ってくるのは 少し違和感がありました。 これが、DataAPI (RESTに変換する時)の問題なのか、それともFileMakerのDB自体の 問題なのかは、わかっておりません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

prepareStatementのSQL文以外の引数について

実はprepareStatementでSQL以外のものを渡すことができる prepareStatement(String sql)以外の指定があります。 ということに最近弊プロダクトのコードを見ていて気づいたので、色々みた結果をまとめます。 Javaのバージョン Javaのバージョン1.8.0_20で確認しています。 prepareStatementに渡せる最大引数について 最大は以下の引数指定かと思います。 PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) 渡すSQL以外に指定する値について、見ていきます。 ResultSetTypeについて resultSetTypeは指定可能なものが3つあります。 * @param resultSetType one of the following <code>ResultSet</code> * constants: * <code>ResultSet.TYPE_FORWARD_ONLY</code>, * <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>, or * <code>ResultSet.TYPE_SCROLL_SENSITIVE</code> TYPE_FORWARD_ONLY:カーソルを前方にのみ移動が可能 TYPE_SCROLL_INSENSITIVE:スクロール可能ですが、変更は反映されません TYPE_SCROLL_SENSITIVE:スクロール可能、且つ、他による変更も反映されます resultSetConcurrencyについて resultSetConcurrencyは指定可能なものが2つあります。 * @param resultSetConcurrency one of the following <code>ResultSet</code> * constants: * <code>ResultSet.CONCUR_READ_ONLY</code> or * <code>ResultSet.CONCUR_UPDATABLE</code> CONCUR_READ_ONLY:ResultSetはデータの読み出しのみ CONCUR_UPDATABLE:ResultSetは変更可能で、カーソルを動かして挿入や変更、削除ができる ※ResultSetの更新機能を利用してデータを更新することができます(参考リンク) resultSetHoldabilityについて resultSetHoldabilityは指定可能なものが2つあります。 * @param resultSetHoldability one of the following <code>ResultSet</code> * constants: * <code>ResultSet.HOLD_CURSORS_OVER_COMMIT</code> or * <code>ResultSet.CLOSE_CURSORS_AT_COMMIT</code> HOLD_CURSORS_OVER_COMMIT:トランザクションがコミットされたタイミングでResultSetはオープンしたままになります CLOSE_CURSORS_AT_COMMIT:トランザクションがコミットされたタイミングでオープンしているResultSetオブジェクトはクローズします まとめ つまり ・ResultSetType:カーソルを前後に動かせるか、カーソルを動かしたときにResultSetの変更を参照するか ・resultSetConcurrency:ResultSetが変更可能であるか ・resultSetHoldability:ResultSetのクローズのタイミング ということですね。 参照: https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Statement.html https://docs.oracle.com/javase/jp/8/docs/api/java/sql/ResultSet.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaでFizzBuzz問題を解く

Javaの学習記録兼個人的なメモです。 今回はJavaで繰り返し処理を学習したため、FizzBuzz問題を解いていきます。 FizzBuzz問題とは、「1から100までの数字を画面に表示する。ただし、3の倍数のときは数字の代わりにFizzと表示し、5の倍数のときは数字の代わりにBuzzと表示し、15の倍数のときは数字の代わりにFizzBuzzと表示する」といった簡単なプログラミングの基礎力を試す問題です。 while を使った場合 MyApp.java public class MyApp { public static void main(String[] args) { int i = 0; while (i < 100) { i++; if (i % 15 == 0) { System.out.println("FizzBuzz"); } else if (i % 5 == 0) { System.out.println("Buzz"); } else if (i % 3 == 0) { System.out.println("Fizz"); } else { System.out.println(i); } } } } do while を使った場合 whileとは条件式の判定位置が異なります。 MyApp.java public class MyApp { public static void main(String[] args) { int i = 0; do { i++; if (i % 15 == 0) { System.out.println("FizzBuzz"); } else if (i % 5 == 0) { System.out.println("Buzz"); } else if (i % 3 == 0) { System.out.println("Fizz"); } else { System.out.println(i); } } while (i < 100); } } for を使った場合 MyApp.java public class MyApp { public static void main(String[] args) { for (int i = 1; i <= 100; i++) { if (i % 15 == 0) { System.out.println("FizzBuzz"); } else if (i % 5 == 0) { System.out.println("Buzz"); } else if (i % 3 == 0) { System.out.println("Fizz"); } else { System.out.println(i); } } } } 【出力結果】 % javac MyApp.java % java MyApp 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz 以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【JAVA】文字列のn番目を変換する

はじめに String型でn番目の文字を1文字変換する方法としてはSubstringを活用して文字列を分解して再度結合を行うことで実装できるが、いつも第一引数と第二引数で何を入ればよいか混乱するので他の方法を探したところ,StringBuilderのsetChartAt() を活用する方法があったのでまとめる。 サンプルコード import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //変換する元の文字列 String first_row = "ABCDEFGHIJK"; //変換するn番目の数値を受け取る。 int num = 6; //setCharAtではchar型を第二引数として与える必要がある。 char change_char = 'X'; //String Builderに型変換 StringBuilder newString = new StringBuilder(first_row); //setCharAt(変換する文字のインデックス,変換後のchar) newString.setCharAt(num,change_char); //ABCDEFXHIJK System.out.println(newString); } } 最後に setCharAtは引数としてあまりなじみのないchar型を使用しないといけないが、Substringを使用するよりも直感的に使いやすいと感じた。 プログラミングコンテストで使うにはStringBuilderを活用することは利点が多そうなので今後は活用していこうと思う。 参考 StringBuilderクラスについて
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】MySQLの操作方法(Windows) その1:DB準備編

はじめに Javaでのデータベースの操作方法をまとめました。 当方、初心者ですが、困っている人の助けになればと思います。 本記事では、テスト用のデータベースの準備を行います。 参考サイト:Javaコード入門 次回記事 →【Java】MySQLの操作方法(Windows) その2:Javaでの操作 前提 ・Windowsを使用 ・MySQLをインストール済み (Pathを通したり、JDBCドライバもインストール済み) ・Eclipseもインストール済み なお、動作環境は下記の通りです。 項目 情報 備考 Java バージョン 14.0.2 コマンドプロンプトにて java -version で確認 MySQL バージョン 8.0.24 コマンドプロンプトにて mysql --version で確認 C:\>java -version java version "14.0.2" 2020-07-14 Java(TM) SE Runtime Environment (build 14.0.2+12-46) Java HotSpot(TM) 64-Bit Server VM (build 14.0.2+12-46, mixed mode, sharing) C:\>mysql --version mysql Ver 8.0.24 for Win64 on x86_64 (MySQL Community Server - GPL) 準備(データベース) テストで使用するデータベースとテーブルは下記のSQLファイルを実行する事で、 作成していきます。(作り直しをすぐに出来る様にするため) ※※ 注意 ※※ 下記のsqlにはデータベースの削除が含まれています。 sampleという名のデータベースが削除されますので、ご注意ください。 sampleCreate.sql /* テストで作り直しが発生しても良いように、すでにsampleという名のデータベースがあればDROP */ DROP Database IF EXISTS sample; CREATE Database sample; CREATE table sample.members ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `sex` char(1) DEFAULT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; USE sample; INSERT INTO `members` VALUES (001,'テストタロウ','男',12), (002,'うわさの太郎','男',99), (003,'かわいいあの子','女',20), (004,'いい感じのあの子','女',25); 上記のSQLファイルを適当なパスに配置します。 (今回はC:\TEMP\java_sql_testディレクトリ内に配置) コマンドプロンプトを起動し、下記のように、SQLへログインします。 Microsoft Windows [Version 10.0.19041.928] (c) Microsoft Corporation. All rights reserved. C:\TEMP\java_sql_test>mysql -u root -p Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 8.0.24 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SQLへログイン後、sourceコマンドにてSQLファイルを指定して、実行します。 mysql> source sampleCreate.sql Query OK, 1 row affected (0.05 sec) Query OK, 1 row affected (0.01 sec) Query OK, 0 rows affected, 3 warnings (0.03 sec) Database changed Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> 結果を確認してみます。 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | sakila | | sample | ←sampleというデータベースが作成されている | sys | | world | +--------------------+ 8 rows in set (0.03 sec) mysql> use sample Database changed mysql> show tables; +------------------+ | Tables_in_sample | +------------------+ | members | ←membersというテーブルが作成されている +------------------+ 1 row in set (0.01 sec) mysql> select * from members; ←格納されているデータを確認 +----+--------------------------+------+-----+ | id | name | sex | age | +----+--------------------------+------+-----+ | 1 | テストタロウ | 男 | 12 | ←SQLファイルにて準備したデータが入っている | 2 | うわさの太郎 | 男 | 99 | | 3 | かわいいあの子 | 女 | 20 | | 4 | いい感じのあの子 | 女 | 25 | +----+--------------------------+------+-----+ 4 rows in set (0.00 sec) mysql> これで、テスト用のデータベースの準備が完了しました。 次回、実際に準備したデータベースをJavaを用いて操作していきます。 番外編 sourceコマンドを使用してテスト用のDB作成中に下記のようなエラーが発生する場合、 ERROR 1366 (HY000): Incorrect string value: '\xE3\x82\xBF\xE3\x82\xA4...' 日本語のデータをテーブルにINSERTする際にエラーになっているようです。 (文字コードの問題) MySQLへログインし、statusコマンドを実行し、確認します。 mysql> status -------------- mysql Ver 8.0.24 for Win64 on x86_64 (MySQL Community Server - GPL) ~~ Server characterset: utf8mb3 Db characterset: utf8mb3 Client characterset: utf8mb3 Conn. characterset: utf8mb3 ~~ -------------- utf8ではなく、chcp932(?)などになっている場合、変更が必要です。 変更方法はMySQLの設定ファイルに設定を追加します。 設定ファイルのひな型は"C:\ProgramData\MySQL\MySQL Server 8.0"内に、my.iniがあります。 インストールパスを変更している場合は、異なると思われます。 (なお、programDataフォルダは隠しフォルダなので、表示オプションにて隠しフォルダを表示するに設定してください) my.iniにて、下記のように設定を変更します。 my.ini # CLIENT SECTION # ---------------------------------------------------------------------- # # The following options will be read by MySQL client applications. ~~ default-character-set=utf8 ←clientセクションにて、文字コードをutf8に設定 ~~ # SERVER SECTION # ---------------------------------------------------------------------- # # The following options will be read by the MySQL Server. Make sure that ~~ character-set-server=utf8 ←serverセクションにて、文字コードをutf8に設定 ~~ 変更したファイルはMySQLが起動時に読み込む場所に配置する必要があります。 今回は、"C:\Program Files\MySQL\MySQL Server 8.0\my.ini" に配置しました。 (インストールパスを変更している場合は適切な場所に変更してください。) 参考:MySQLの文字コードについて(https://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a) 参考:my.iniの場所と配置先(https://www.dbonline.jp/mysql/install/index3.html) MySQLのサービスを再起動することで、設定が変更されます。 再度、MySQLへログインし、sourceコマンドにてSQLファイルを指定し、 データベースの作成を行うと、データのインポートが完了しました。 次回記事 →【Java】MySQLの操作方法(Windows) その2:Javaでの操作
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

とりあえずHeroku + Spring Boot デプロイ

Heroku上にSpring Bootをデプロイしてみた。 自分用メモ。 環境 Mac BigSur 11.1 Eclipse/maven Java 1.8 Heroku Heroku cliインストール brew tap heroku/brew && brew install heroku git/commit git init git add xxxxxx git commit -m "first commit." heroku app Herokuアプリ作成 ログインを問われるのでHerokuにログイン heroku create <appname> Spring Boot Eclipseにてプロジェクト作成 file構成はこんな感じ Procfile [app-name]は、pom.xml記載の下記部分。[artifactId]-[version].jarになる web: java -Dserver.port=$PORT -jar target/[app-name].jar pom.xml <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> system.properties 使用するruntimeバージョン system.properties java.runtime.version=1.8 pom.xml Webapp Runner をダウンロードするための Maven の設定 Webapp Runner を使用するために必須ではありませんが、アプリケーションでの実行が必要になるため、ビルドツールに自動的に Webapp Runner をダウンロードさせることをお勧めします maven-compiler-pluginは、java実行環境バージョンを合わせるための記載 pom.xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>com.heroku</groupId> <artifactId>webapp-runner</artifactId> <version>9.0.30.0</version> <destFileName>webapp-runner.jar</destFileName> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> </plugins> </build> Herokuへデプロイ git push heroku master
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaでメソッドを動的に呼び出す(リファクタリング)

概要 Java書いてる時に、『メソッド名が連続してナンバリングされている場面』 にでくわすことってないですか?ありますよね?わたしはあります。 たとえばこんな感じで、Getterを使ってデータをセットしないといけないときです。 public class Hoge private int column001; private int column002; private int column003; private int column004; private int column005; public void getColumn001(int value){ this.column001 = value; } public void getColumn002(int value){ this.column002 = value; } public void getColumn003(int value){ this.column003 = value; } // 以下略 データベースや外的要因でどうしてもこういう形で保持しないといけないとき、Getter/Setterの数が例のようにこれくらいならいいんですが、100個現れたら面倒です。 そこで、実装の時に「リフレクション(Reflection)」を使うと、メソッドを動的に呼び出すことができるのでとても便利です。 リフレクションってなんぞ リフレクション(Reflection)とは、プログラムの実行過程の中で、プログラム自身の情報や構造を読み取ったり書き換えたりする技術のことをいいます。 リフレクションを使うと、あるクラスの情報…例えば変数や定数、メソッド名などを取得することができます。 また、取得できる情報の中には、privateなメンバも含まれています。 これを応用することでメソッドを動的に呼び出すことができます。 リフレクションを使おう リフレクションはいろんな言語でサポートされていますが、この記事ではJavaのリフレクション呼び出し方法を記載します。 サンプルソース Hoge.java import java.lang.System.*; /** * 呼び出されるクラス **/ public class Hoge{ private int id; private String dataString; public void setId(int id){ this.id = id; System.out.println("Hoge.setIdに" + String.valueOf(id) + "が渡されました。"); } public void setDataString(String str){ this.dataString = str; System.out.println("Hoge.setDataStringに" + str + "が渡されました。"); } public int getId(){ System.out.println("Hoge.getIdが呼び出されました。"); return this.id; } public String getDataString(){ System.out.println("Hoge.getDataStringが呼び出されました。"); return this.dataString; } // コンストラクタ public Hoge(){ } } Main.java package sample; import java.lang.reflect.Method; /** * 呼び出されるクラス **/ public class Main { public static void main(String[] args) throws NoSuchMethodException, Exception { Method method; Hoge hoge = new Hoge(); // setId を呼び出す method = hoge.getClass().getMethod("setId",new Class[]{int.class}); method.invoke(hoge, 39); // setDataString を呼び出す method = hoge.getClass().getMethod("setDataString",new Class[]{String.class}); method.invoke(hoge, "fuga"); // getId を呼び出す method = hoge.getClass().getMethod("getId"); int id = Integer.parseInt(String.valueOf(method.invoke(hoge))); System.out.println(id); // getDataString を呼び出す method = hoge.getClass().getMethod("getDataString"); String str = String.valueOf(method.invoke(hoge)); System.out.println(str); } } 実行結果 Hoge.setIdに39が渡されました。 Hoge.setDataStringにfugaが渡されました。 Hoge.getIdが呼び出されました。 39 Hoge.getDataStringが呼び出されました。 fuga ちゅうい 例外 メソッド名と引数はすべて合致している必要があります。 メソッド名が違うとNoSuchMethodExceptionで怒られますので、リフレクションを使う際には、try-catch か、throws で NoSuchMethodException を当てるようにしましょう。 ※Exceptionでもよいのですが、わかりやすさの意味だとNoSuchMethodExceptionのほうが良い気がします。 メソッド名と引数 Main.java で Hoge.setId を呼び出す際にこんな処理を入れています。 method = hoge.getClass().getMethod("setId",new Class[]{int.class}); この、 getMethod の第2引数に注意してください。 上記の場合だと、Hogeクラスに int型引数のあるgetIdメソッドがなければNoSuchMethodExceptionになります。 このため、下記のように書くと実行時エラーとなります。 // 引数指定する際の型が int ではなく Integer である method = hoge.getClass().getMethod("setId",new Class[]{Integer.class}); プリミティブ型で宣言されていると、そのメソッドを呼び出す際もプリミティブ型.classとする必要がありますのでご注意ください。 Method.invoke の戻り値 実際にメソッドを実行する時に呼び出す Method.invoke は、実行した戻り値をすべて Object 型で戻します。 そのため、場合によってはパースする必要があります。 応用 メソッド名を別で保管しておいて動的に呼び出す メソッド名をデータベースや application.properties などに格納し、それを読み出して動的にメソッドを実行したいときにはこの小技が使えます。 以下の例は、List<String> に実行したいメソッド名を格納し、拡張forで連続実行するサンプルです。 Hoge hoge = new Hoge(); List<String> methodList = new ArrayList<>(); methodList.add("sampleMethod1"); methodList.add("sampleMethod2"); for(String str : methodList){ method = hoge.getClass().getMethod(str); method.invoke(hoge); } メソッド名が連続してナンバリングされている場面で動的に呼び出す 今回の冒頭で示したような場面ではこれが強強になります。 とはいえ、たとえば private int column001; private int column002; private int column003; //private int column004; // 何らかの改修で一部のフィールドがコメントアウトされてる場合 とか、 private int column001; private int column002; private int column003; ... private int column09; // なんかよくわからないけど突然数字部分が0埋め2桁になった とかされている場合があるかもしれません。 もしこういう形でソースと対峙した場合は、全てを察した顔で中指を立てたあとにおとなしく1つずつメソッドを呼びましょう。 あ、応用1も使えるかもしれませんね?! 以下の例は、Lombokを用いて、getter/setterが自動生成されるモデルクラスのgetterを順番に実行している例です。 ちょっと汚いソースですが、大目に見てやってください… Lombokってなんぞ?って方は下記の記事を参照すると良いかもしれません。 → Lombok 使い方メモ dataForDb.java @Data public class DataForDb{ String id; String name; String column001; String column002; String column003; String column004; String column005; String column006; ... main.java ... DataForDb dataForDb = new DataForDb(); Method method; StringBuilder sb = new StringBuilder(); for(i=1;i++;i<6){ //i=1 のとき、callMethod は "getColumn001" String callMethod = sb.append("getColumn").append(String.format("%3d", i)).toString(); dataForDb.getClass().getMethod(callMethod); String retValue = String.valueOf(method.invoke(dataForDb)); } ... それはそれとして 応用2で紹介した書き方ができるのはいいですが、もしこういうデータ構造で保持しているのだとしたら、モデルクラスのデータ定義そのものを見直したほうが良いかもしれませんね!!!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Microsoft Graph API を利用した Azure AD B2C のユーザー操作(更新編)

Microsoft Azure 上でクラウドネイティブなシステムを作る際は、ユーザー情報管理や認証処理を Azure AD B2C を利用して実現することが一般的です。 本記事では、Microsoft Graph API を利用して Azure AD B2C 上のユーザー情報を作成、更新、削除する方法を紹介します。 前提条件 Azure AD B2C テナントが作成済みであること Azure AD B2C テナントに Azure AD B2C 用ユーザーが作成されていること Microsoft Graph アプリケーションを登録されていること クライアント側は Spring-Boot ベースの Java アプリケーション pom.xml 作成編を参考にしてください。 Azure AD B2C ユーザーの ObjectId を確認する Azure AD B2C ユーザーの更新は、対象ユーザーの ObjectId が必要になります。 ObjectId は、ユーザーのプロファイル画面から確認できます。 Azure AD B2C ユーザーの更新 TestGraphApi.java @Test void updateUser() { /** * ユーザーインスタンスの作成 */ User user = new User(); /** * ユーザー属性の設定 */ user.displayName = DISPLAY_NAME_FOR_UPDATE; ObjectIdentity objectIdentity = new ObjectIdentity(); objectIdentity.signInType = "username"; objectIdentity.issuer = ISSUER; objectIdentity.issuerAssignedId = ISSUER_ASSIGNED_ID_FOR_UPDATE; List<ObjectIdentity> identities = new ArrayList(); identities.add(objectIdentity); user.identities = identities; /** * Azure AD B2C 上のユーザーを更新 */ createIGraphServiceClient( CLIENT_ID, CLIENT_SECRET, DOMAIN_NAME).users(OBJECT_ID_FOR_UPDATE) .buildRequest().patch(user); // (*1)(*2) } (*1) IGraphServiceClient オブジェクトの users メソッドの引数は、更新対象ユーザーの ObjectId になります。 (*2) ユーザー作成時は post メソッドでしたが、ユーザー更新時は、patch メソッドになります。 サインインタイプについて 作成編で、サインインのタイプを選択できるとお伝えしました。 objectIdentity.issuerAssignedId で設定した値は、サインイン時にアカウント名として利用されます。サインインのタイプによって、指定できる値が異なります。 ユーザー名認証 テナント内でユニークな文字列 メールアドレス認証 テナント内でユニークな文字列 {文字列} @ {Active Directoryのドメイン} の形式 (*1) フェデレーション連携認証 テナント内でユニークな文字列 @ マークを含むメールアドレスとして正しい形式 (*1) Active Directory のドメインは、カスタム ドメインを追加していない場合、{テナント名}.onmicrosoft.com のみになります。他のドメインのユーザーを設定したい場合は、Active Directory B2C のカスタム ドメインを有効にしてください。 実行結果 上記を実行すると、Azure AD B2C 上に指定した属性のユーザーが更新されていることが確認できます。 次回は、ユーザー情報の削除方法について記述します。 読んで頂きありがとうございました。 検証コード Graph API リファレンス
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む