【问题标题】:IllegalArgumentException: Can not set UserTransaction field to ServerVMClientUserTransactionIllegalArgumentException:无法将 UserTransaction 字段设置为 ServerVMClientUserTransaction
【发布时间】:2013-02-05 19:30:56
【问题描述】:

我正在将应用程序从 GlassFish 3.1 迁移到 JBoss 6.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]

我整个下午都在谷歌上搜索它,但找不到任何开始的提示。有什么想法吗?

【问题讨论】:

    标签: java jpa transactions persistence jboss6.x


    【解决方案1】:

    所以。我环顾四周,试错了,发现我错了。

    如果我使用 EJB,我不需要管理任何 UserTransaction,因为事务由容器管理。因此,

    1. 我删除了 Beans 中对它的所有引用
    2. 我将 @Named 服务更改为 @Stateless EJB
    3. 我使用 @EJB 注释而不是 @Inject 将它们注入到我的 Beans 中

    希望对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-08-27
      • 1970-01-01
      • 2016-01-23
      • 2014-09-01
      • 2018-06-23
      • 2018-07-18
      • 2021-06-20
      • 2016-12-18
      • 2019-11-13
      相关资源
      最近更新 更多