読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

CDI インターセプト from Jar

CDI Inject Jar

複合コンポーネントに続き、その他でも再利用できるものを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) {
        //SHA256でMD作る処理実装
    }
}

beans.xmlを用意して、

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="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> <!-- 今回のプロジェクトではこれ利用 -->
        <!-- <class>jp.co.hoge.encryption.Sha512</class> -->
    </alternatives>
</beans>

として、利用する所では

//beans.xmlで定義したクラスインスタンスがインジェクトされる
@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側のほうに置いただけですが無事動きました。

最近徐々に時間がなくなってきて「なぜこうすると動くのか」に注力する時間が減ってきてしまっている(>_<;
時間のあるうちに色々理解して「なんかわからないけど、こうしたら動いた」じゃなく「こうこうこうだから動く」という日記にしていきたい。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村