1

アプリケーションをGlassFish3.1からJBoss6.1に移行しています。

このコードはGlassFishでうまく機能しましたが、JBossで醜いエラーをスローします。

カスタムアノテーション:

@Named
@ViewAccessScoped
@Stereotype
@Target( { ElementType.TYPE, ElementType.METHOD, ElementType.FIELD } )
@Retention(RetentionPolicy.RUNTIME)
public  @interface Model {        
}

豆:

@Model
public class MyBean extends BaseBean {

    @Inject
    UserService userService

    public void save() {
        startTransaction();
        studioService.persist(studio);
        commitTransaction();
    }
}

ベースBean:

public class BaseBean implements Serializable {

    @Resource
    protected UserTransaction transaction;
    @PersistenceContext(unitName = "fits_PU")
    protected EntityManager entityManager;
    [...]

    protected void startTransaction() {
        try {
            transaction.begin();
            entityManager.joinTransaction();
        } catch [a few exceptions]
    }

    protected void commitTransaction() {
        try {
            transaction.commit();
        } catch [an awful lot of exceptions]
    }
}

次の例外が発生します。

Caused by: java.lang.IllegalArgumentException: Can not set javax.transaction.UserTransaction field my.company.project.BaseBean.transaction to org.jboss.tm.usertx.client.ServerVMClientUserTransaction
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) [:1.7.0_11]
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) [:1.7.0_11]
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) [:1.7.0_11]
    at java.lang.reflect.Field.set(Field.java:680) [:1.7.0_11]

午後中ずっとグーグルで検索していましたが、最初のヒントが見つかりませんでした。何か案が?

4

1 に答える 1

0

それで。私は周りを見回し、試行錯誤して、自分が間違っているのを見ました。

UserTransactionトランザクションはコンテナによって管理されるため、EJBを使用している場合は管理する必要はありません。したがって、

  1. Beansでそれへのすべての参照を削除しました
  2. @Namedサービスを@StatelessEJBに変更しました
  3. @EJB代わりにアノテーションを付けてBeanに注入しました@Inject

それが他の誰かを助けることを願っています。

于 2013-02-21T11:18:28.000 に答える