複合コンポーネントに続き、その他でも再利用できるものをjarに固める作業を進めてます。
今日詰まったのはInject関連。
この作業の元となっているJavaEE6で作成したプロトタイプでは、インターセプトを使いました。
設定ファイルでInjectする内容を振り分けよう、というものです。
非常にしょぼい例ですが、パスワードの暗号化するロジックをこんな感じに定義してみたりしてます。
インタフェースを準備。
public interface IMessageDigest {
指定文字列のメッセージダイジェストを取得する
@param encryptStr
@return
public String getMessageDigest(String encryptStr);
}
例えばSHA256のアルゴリズムでハッシュ値を返すものを実装します。アノテーションとして@Alternativeを付けます。
その他、SHA512やMD5(もう現在安全ではないので利用禁止ですが)等も実装しておきます。
@Alternative
public class Sha256 implements IMessageDigest{
指定文字列のSHA256によるメッセージダイジェストを取得する
@param encryptStr
@return
@Override
public String getMessageDigest(String encryptStr) {
}
}
beans.xmlを用意して、
xml version="1.0" encoding="UTF-8"
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance"
xsischemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>jp.co.hoge.encryption.Sha256</class>
</alternatives>
</beans>
として、利用する所では
@Inject
IMessageDigest messageDigest;
public void hoge(){
〜略〜
String encryptPassword = messageDigest.getMessageDigest(password);
〜略〜
}
といったような形です。
で、上記のインタフェースや実装クラスをjarに固めて、他のプロジェクトから利用してみたのですが、実行すると
重大: Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [IMessageDigest] with qualifiers [@Default] at injection point [[field] @Inject jp.co.hogehoge.controller.HogeController.messageDigest]
のようなエラーが…。まさかJarの中にあるクラスのインスタンスはInjectできないのか…と焦りながらも、調べてみた所、同じことで詰まってる人が。
Injecting a bean from a different Jar in Weld
JarのMETA-INF配下にbeans.xmlを置きな、とのこと。インジェクト内容のスイッチングはもちろん利用側プロジェクトのbeans.xmlで定義したいので、とりあえず空のbeans.xmlをJar側のほうに置いただけですが無事動きました。
最近徐々に時間がなくなってきて「なぜこうすると動くのか」に注力する時間が減ってきてしまっている(>_<;
時間のあるうちに色々理解して「なんかわからないけど、こうしたら動いた」じゃなく「こうこうこうだから動く」という日記にしていきたい。