[更新: :在玻璃鱼论坛/ml上讨论之后 http://forums.java.net/jive/thread.jspa?messageID=480532 针对玻璃鱼提起了一个错误 https://glassfish.dev.java.net/issues/show_bug.cgi?id=13040 对于这个问题。

我正在尝试将@stateless EJB的本地无接口视图注入JSF2 @Named @javax.enterprise.context.sessionscoped Backing Bean。 EJB是扩展抽象通用基类的几种。注入“ @inject theejbclass varname”失败,“无法将EJB theejbClass转换为类型类my.package.name.name.theabstractbase的业务对象”。 编辑:实际上,事实证明注射成功,但是在超级类传承的方法的注入委托中,方法分辨率是失败的。 如果我使用“ @ejb theejbclass varname”,则varname保持null,即没有注入。

细节:

我正在Linux上运行Glassfish 3.0.1(Ubuntu 10.04,以防万一很重要),并且使用CDI(WELD)将数据模型EJB的实际问题处理到我的JSF2会话范围内。是的,在您询问之前,我有beans.xml,CDI正在激活注射。

如果我给它注入@ejb注释,例如:

@EJB TheEJBClass memberName;

... EJB实际上并未注入,而将MemberName Null留下。

如果我给它注入CDI @Inject注释:

@Inject TheEJBClass memberName;

...然后CDI抱怨当我称之为“成员名称”的方法是在theejbclass的超级阶级中实现的,而不是在theejbclass中覆盖的自我,报告:报告:

java.lang.IllegalStateException: Unable to convert ejbRef for ejb TheEJBClass to a business object of type class my.package.name.TheAbstractBase
    at
com.sun.ejb.containers.EjbContainerServicesImpl.getBusinessObject(EjbContainerServicesImpl.java:104)
at
org.glassfish.weld.ejb.SessionObjectReferenceImpl.getBusinessObject(SessionObjectReferenceImpl.java:60)
....

我已经尝试将基础转换为具体类并脱离生成,但是遇到了同样的问题,所以我认为我不会用通用基础击中焊缝错误(https://jira.jboss.org/browse/weld-305, https://jira.jboss.org/browse/weld-381, https://jira.jboss.org/browse/weld-518).

为了清楚起见,该代码的大纲具有完整的包装资格。

// JSF2 managed backing bean.
//
// Called via #{someJSF2Model.value} in a JSF2 page
//
@javax.inject.Named
@javax.enterprise.context.SessionScoped
public class SomeJSF2Model implements Serializable {
   @javax.inject.Inject TheEJBClass member;

   public Integer getValue() {
       return member.getValue();
   }
   // blah blah
}

// One of several EJB classes that extend TheAbstractBase
@javax.ejb.Stateless
public class TheEJBClass extends TheAbstractBase {
  // blah blah
  // does **NOT** override "getValue()"
}

public abstract class TheAbstractBase {
    // blah blah
    public Integer getValue() {
        return 1;
    }
}

请注意注射 工作如果我在theejbclass中覆盖theabstractbase.getValue(),或者我调用在theejbclass中定义的方法而不是任何超级类。似乎问题与继承有关。

使用JSF2内置的生命周期和注入功能的非常相似的代码奏效了,但是鉴于这是一个新项目,并且CDI是将来事情发展的地方,我认为最好尝试使用CDI。这是我最初使用JSF2/EJB注射的方法,该注射有效:

// JSF2 managed backing bean. Using @ManagedBean and JSF2's @SessionScoped
// instead of CDI @Named and CDI @SessionScoped this time.
//
@javax.faces.bean.ManagedBean
@javax.faces.bean.SessionScoped
public class SomeJSF2Model implements Serializable {
   @javax.ejb.EJB TheEJBClass member;
   public Integer getValue() {
       return member.getValue();
   }
   // blah blah
}

// One of several EJB classes that extend TheAbstractBase
// Unchanged from CDI version
@javax.ejb.Stateless
public class TheEJBClass extends TheAbstractBase {
  // blah blah
  // does **NOT** override "getValue()"
}

// Unchanged from CDI version
public abstract class TheAbstractBase {
    // blah blah
    public Integer getValue() {
        return 1;
    }
}

我目前正在努力将一个独立的测试案例放在一起,但是以为我现在要解散这个问题,以防我只是做一些愚蠢的事情,或者有一个众所周知的解决方案,我的Google-fu Isn' t要找到。为什么它可以与JSF2/EJB注射一起使用,但会在CDI注射下失败?

(自从在Glassfish论坛上重新发布 http://forums.java.net/jive/thread.jspa?threadid=152567 )

有帮助吗?

解决方案

如上所述,这是一个焊接/玻璃鱼虫。

修复:放弃玻璃鱼,然后移至JBOSS AS 7,实际上大部分时间都起作用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top