0

アプリケーションを Glassfish 2.2.1 から JBoss AS 6 に移行しました。

以前は、ejbs を検索するためのジェネリック クラスがありました。以下はコードです。

public class BeanUtil {
    private static InitialContext ctx; 
    public static <T> T create(Class<T> type){
        try {
            ctx = new InitialContext();
            return (T)ctx.lookup(type.getName());
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return null;
    }

}

上記のクラスは、glassfish でのルックアップに問題なく機能します。しかし、コードを JBoss AS 6 に移行した後、常に javax.naming.NameNotFoundException が発生します。

以下は私のejbクラスの1つです。

 @Remote
    public interface OperationPerformed {

        public void addRandomNo(String randomNos);

    }

    @Stateless
    @Remote(OperationPerformed.class)
    public class OperationPerformedImpl implements OperationPerformed {

        public void addRandomNo(String randomNos) {
        }

    }

アプリの展開中に jboss が作成した完全な jndi 名を指定すると、同じものを簡単に検索できます。しかし、ルックアップ用の汎用コードが必要です。

以下は、Bean をルックアップするために呼び出すコードです。

OperationPerformed operationPerformed = BeanUtil.create(OperationPerformed.class);

私が何か間違ったことをしている場合は提案してください。

4

2 に答える 2

0

クラス名をjndi名に変換して普通に調べられると思います

于 2013-03-05T08:01:37.430 に答える
0

いくつかの提案:

  1. インターフェイスと実装で同時に @Remote アノテーションを使用することは非常にまれです。ステートレス Bean からこのアノテーションを削除してください。冗長です。
  2. 私は他のポスターに同意します:
    • ローカル ルックアップとインジェクションにリモート インターフェイスを使用しないでください。別のインターフェイスを作成し、@Local でマークします。
    • JVM ローカル操作に関しては、@EJB インジェクションは、手動の JNDI ルックアップと比較してはるかに優れています (http://stackoverflow.com/questions/12681436/ejb-annotation-vs-jndi-lookup への回答および SO に関する同様の質問を参照してください)。 .

すべてを要約すると:

作成OperationPerformedLocal.java:

@Local
public interface OperationPerformedLocal {
    public void addRandomNo(String randomNos);
}

SLSB を変更します。

@Stateless
public class OperationPerformedImpl implements OperationPerformedLocal, OperationPerformed {

    public void addRandomNo(String randomNos) {
    }
}

可能な限り、jndi ルックアップではなくインジェクションを使用します。

@EJB
private OperationPerformedLocal operationPerformed;

WAR モジュールの場合、いくつかの CDI@Injectionマジックが機能するはずですが、実際の経験はまだありません。


さて、プレーンな JNDI ルックアップを使用することを主張し、それらを可能な限り汎用的にしたい場合は、次の解決策を思いつきました。

public class BeanUtil {
    private static InitialContext ctx;
    public static <T, C> T create(Class<C> implType, Class<T> interfaceType) {
        try {
            ctx = new InitialContext();

            return (T)ctx.lookup(implType.getSimpleName()+"/local");
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

次のように使用できます。

try {
    OperationPerformedLocal operationPerformed =
        BeanUtil.create(OperationPerformedImpl.class, OperationPerformedLocal.class);
    operationPerformed.addRandomNo("123");
} catch (Exception e) {
    e.printStackTrace();
}

それは私が知っている醜いです、私はそれを投稿するのがちょっと恥ずかしいです。

移植性がなく、インターフェースと実装クラスを知る必要があり、「/ local」部分がハードコードされているため、さらに醜い::sigh::.

EJB-JAR を EAR に配置すると、事態がさら​​に複雑になる可能性があります。jndi-name の前に EAR 名が付けられます。

return (T)ctx.lookup("earName/" + implType.getSimpleName() + "/local");

さらに、SLSB が名前を変更した場合、おそらく壊れます@Stateless(name="someNewName")

于 2013-03-06T10:26:27.910 に答える