9

ステートレスEJBで2つのPUを使用しており、それぞれが1つのメソッドで呼び出されます。

@PersistenceContext(unitName="PU")
private EntityManager em;
@PersistenceContext(unitName="PU2")
private EntityManager em2;

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
public void getCandidates(final Integer eventId) throws ControllerException {
    ElectionEvent electionEvent = em.find(ElectionEvent.class, eventId);
    ...
    Person person = getPerson(candidate.getLogin());
    ...
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
private Person getPerson(String login) throws ControllerException {
    Person person = em2.find(Person.class, login);
    return person;
}

これらのメソッドには、この例外を回避するためにREQUIRES_NEWトランザクションの注釈が付けられています。javaFXアプレットからこれらのメソッドを呼び出していたとき、すべてが期待どおりに機能しました。現在、JAX-RS Webサービスからそれらを呼び出そうとしています(どちらの場合もejbが初期コンテキストで検索されたため、論理的な違いは見られません)。この例外が発生し続けます。Glassfish 2.1接続プールでXADatasourceを設定すると、em2でnullpointer例外が発生しました。

次に何を試すべきかアイデアはありますか?

よろしく

4

3 に答える 3

7

Ok、

これで解決しました。誰かが同じようなことに取り組まれた場合に備えて、私は共有します。全体的な問題は、NetBeansのデプロイにありました。それらはglassfish接続プールの設定を上書きし、実行時に適切に設定すると、npeまたはパスワードの欠落が発生します。これを編集する場所はsun-resources.xmlです。XML要素には、datasource-classname属性とrs-type属性があります。Derbyデータベースの場合に行う必要があることは次のとおりです。

<jdbc-connection-pool ... 
        datasource-classname="org.apache.derby.jdbc.ClientXADataSource" 
        res-type="javax.sql.XADataSource">
   ...
</jdbc-connection-pool>

今では魅力のように機能します。

于 2010-04-24T22:03:41.593 に答える
6

ステートレスEJBで2つのPUを使用しており、それぞれが1つのメソッドで呼び出されます

それはそう。ただし、最初のメソッドから2番目のメソッドを呼び出しているため、分散トランザクションを実行しており、これにはXAを使用する必要があります(GlassFishは1つの非XAを含むことができる最後のエージェント最適化をサポートしているため、少なくとも1つのリソースに対して)資源)。つまり、データソースの1つをaとして設定するのXADataSourceが方法です。

これを行っているときにエラーが発生した場合は、正確 に行ったこととスタックトレースに関する詳細を追加してください。

于 2010-04-21T23:14:07.507 に答える
2

最初から2番目のメソッドを呼び出す場合、それはEJBメソッド呼び出しではありません。通常のメソッド呼び出しとして扱い、を調べません@TransactionAttribute。同じEJBを呼び出す場合は、とを挿入しSessionContextて呼び出すことができますgetBusinessObject。次に、返されたEJBでメソッドを呼び出します。

于 2011-12-21T16:22:02.120 に答える