«Невозможно преобразовать EJBREF для EJB» на инъекции CDI (сварного шва) @Stouseless EJB в Bean @sessionscoped jsf2 в Glassfish

StackOverflow https://stackoverflow.com/questions/3509255

Вопрос

[ОБНОВИТЬ: После обсуждения на форумах Glassfish / мл в http://forums.java.net/jive/thread.jspa?messageId=480532. Ошибка была подана против GlassFish https://glassfish.dev.java.net/issues/show_bug.cgi?id=13040. для этого вопроса.

Я пытаюсь ввести локальный вид без интерфейса @Stateless EJB в jsf2 @named @ javax.enterprise.context.sessionscoped Beaning Bean. EJB является одним из нескольких, которые расширяют абстрактный универсальный базовый класс. Инъекция «@INJECT Theejbclass varname» не удается с «невозможным преобразовывать EJBREF для EJB Thejbclass в бизнес-объект типа My.package.name.theabstractbase». Редактировать: фактически, оказывается, что впрыск преуспевает, но разрешение метода в инъекционном прокси для методов, унаследованных от суперкласс. Если я использую «@ejb theejbclass varname», то VARNAME остается NULL, то есть ничего не вводится.

Подробности:

Я бегаю Glassfish 3.0.1 на Linux (Ubuntu 10.04 в случае, если это имеет значение) и имея реальные проблемы, обрабатывающие в эксплуатацию моих моделей данных моей модели, в мою сессию JSF2. И да, прежде чем спросить, у меня есть Beans.xml на месте и CDI активируется для инъекции.

Если я введу его с аннотацией @ejb, например:

@EJB TheEJBClass memberName;

... EJB на самом деле не вводится, оставив члена NULL.

Если я введу его с аннотацией CDI @inject:

@Inject TheEJBClass memberName;

... Тогда CDI жалуется, когда я вызываю метод «MembleName», который реализован в суперклассе TheJBClass и не переопределен в 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;
    }
}

Обратите внимание, что инъекция делает Работа, если я переопределите The AbstractBase.getValue () в theejbclass, или если я позволю методу, определенному в 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 ' до поиска. Почему он работал с инъекцией JSF2 / EJB, но сбой с инъекцией CDI?

(Так как повторно размещено на форумах GlassFish http://forums.java.net/jive/thread.jspa?threadid=152567. )

Это было полезно?

Решение

Как отмечалось выше, это ошибка сварки / стекла.

Исправлено: отказаться от Glassfish и переехать в jboss as 7, что на самом деле работает большую часть времени.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top