##元ネタはこれ
https://github.com/watson-developer-cloud/java-sdk
##なにがはまったのか
ぱっとみて、「はいはい、API_Keyを渡すんでしょ」っていうこのコード部分に誘導された・・
// letting the SDK manage the IAM token
Authenticator authenticator = new IamAuthenticator("<iam_api_key>");
Discovery service = new Discovery("2019-04-30", authenticator);
##基本的な考え方
IBM CloudにDeployするなら、VCAP変数が使えるから、Authenticatorを指定せずにサービスのインスタンスを作ればいい。
(難しいことを考えた方が負け)
##単体テストをするとき
Credential Fileをとってきて読み込ませるのが楽(VCAP変数がないけど、あるのに近い感じでできる)
Credential file (easier!)
With a credential file, you just need to put the file in the right place and the SDK will do the work of parsing it and authenticating. You can get this file by clicking the Download button for the credentials in the Manage tab of your service instance.
ここでもはまったのが、このページ(「サービス」の「管理」)で、Credentialsのペインが表示されないときがあった・・ということ。(読み込みで失敗してたのかな・・?)
このDownloadで、ibm-credentials.env
が落とせる。
書式は、<サービス名の大文字>_<Key>=<value>
このNLCのサービスはふとみたらあったTokyoリージョンで作ったので、URLが東京リージョン向けになっている点も注意か。
ファイルの読み込みをさせる前に試行錯誤してたとき、API-Keyは渡せたけどURLが指定できてなくて、その場合https://gateway.watsonplatform.net/natural-language-classifier/api
が指定され、US-South
にアクセスに行こうとして、403 Forbiddenが返ってくる。
APIを引数で指定する && US-South以外のリージョンでサービスを作った場合は、URLを設定する。
NaturalLanguageClassifier nlc = new NaturalLanguageClassifier("<api_key");
//サービスのリージョンのURLを指定
nlc.setURL("https://gateway-tok.watsonplatform.net/natural-language-classifier/api");
##ibm-credentials.envの読み込み場所と順番
さらっとReadmeに書いているけど、ソースをみたほうがわかりやすかった。
ファイル名は、ibm-credentials.env
で固定
読み込み順序はこの通りで、上からみていって見つかったものを読み込む(それ以降は読まない)
private static List<File> getFilesToCheck() {
List<File> files = new ArrayList<>();
String userSpecifiedPath = EnvironmentUtils.getenv("IBM_CREDENTIALS_FILE");
String currentWorkingDirectory = System.getProperty("user.dir");
String unixHomeDirectory = EnvironmentUtils.getenv("HOME");
String windowsFirstHomeDirectory = EnvironmentUtils.getenv("HOMEDRIVE") + EnvironmentUtils.getenv("HOMEPATH");
String windowsSecondHomeDirectory = EnvironmentUtils.getenv("USERPROFILE");
Apache Commons IO のバージョンも注意
別の用途でCommonsを使ってて、入ってたバージョンがちょっと古めだったけど、とりあえず、2.3以上じゃないとだめっぽい(Commons IOは2.6をSDK Coreのpomで指定している)
このメソッドがないぞエラー(NoSuchMethodError)になる。
https://commons.apache.org/proper/commons-io/javadocs/api-2.6/org/apache/commons/io/IOUtils.html#readLines-java.io.InputStream-java.nio.charset.Charset