Не удалось разрешить ссылку @EJB: - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь внедрить EJB в моем проекте, но продолжаю получать ту же ошибку при развертывании в JBoss AS 6 (Final).

У меня есть два класса:

@Stateless
@Local(ForecastReturnService.class)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ForecastReturnServiceImpl implements ForecastReturnService {

private static final Logger logger = LoggerFactory
        .getLogger(ForecastReturnServiceImpl.class);

@PersistenceContext
protected EntityManager em;
}

и другой EJB:

@Stateless
public class CacheManagementServiceImpl implements CacheManagementService {

@EJB
private ForecastReturnService forecastReturnService;
}

Сообщение об ошибке касается bean-объекта «ForegnetintService», который я пытаюсь внедрить:

DEPLOYMENTS IN ERROR:
  Deployment "vfs:///C:/jboss/jboss-6.0.0.Final/server/default/deploy/webui.war" is in error due to the following reason(s): java.lang.RuntimeException: Could not resolve @EJB reference: [EJB Referenc
e: beanInterface 'com.ls.forecast.jpa.ForecastReturnService', beanName 'null', mappedName 'null', lookupName 'null', owning unit 'ComponentDeploymentContext@16939526{org.jboss.metadata.ejb.jboss.JBoss
EnterpriseBeanMetaData.CacheManagementServiceImpl}'] for environment entry: env/com.ls.forecast.webui.business.CacheManagementServiceImpl/forecastReturnService in unit ComponentDeploymentContext@16939
526{org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData.CacheManagementServiceImpl}

    at org.jboss.deployers.plugins.deployers.DeployersImpl.checkComplete(DeployersImpl.java:1228) [:2.2.0.GA]
    at org.jboss.deployers.plugins.main.MainDeployerImpl.checkComplete(MainDeployerImpl.java:905) [:2.2.0.GA]
    at org.jboss.system.server.profileservice.deployers.MainDeployerPlugin.checkComplete(MainDeployerPlugin.java:87) [:6.0.0.Final]
    at org.jboss.profileservice.deployment.ProfileDeployerPluginRegistry.checkAllComplete(ProfileDeployerPluginRegistry.java:107) [:0.2.2]
    at org.jboss.system.server.profileservice.bootstrap.BasicProfileServiceBootstrap.start(BasicProfileServiceBootstrap.java:135) [:6.0.0.Final]
    at org.jboss.system.server.profileservice.bootstrap.BasicProfileServiceBootstrap.start(BasicProfileServiceBootstrap.java:56) [:6.0.0.Final]
    at org.jboss.bootstrap.impl.base.server.AbstractServer.startBootstraps(AbstractServer.java:827) [jboss-bootstrap-impl-base.jar:2.1.0-alpha-5]
    at org.jboss.bootstrap.impl.base.server.AbstractServer$StartServerTask.run(AbstractServer.java:417) [jboss-bootstrap-impl-base.jar:2.1.0-alpha-5]
    at java.lang.Thread.run(Thread.java:619) [:1.6.0_20]

Я заметил следующее сообщение в консоли JBoss:

13:34:27,681 WARN  [MappedReferenceMetaDataResolverDeployer] Unresolved references exist in JBossMetaData:[#CacheManagementServiceImpl:AnnotatedEJBReferenceMetaData{name=com.ls.forecast.webui.business
.CacheManagementServiceImpl/forecastReturnService,ejb-ref-type=null,link=null,ignore-dependecy=false,mapped/jndi-name=null,resolved-jndi-name=null,beanInterface=interface com.ls.forecast.jpa.ForecastR
eturnService}, #EntityForecastReturnResultServiceImpl:AnnotatedEJBReferenceMetaData{name=com.ls.forecast.webui.business.EntityForecastReturnResultServiceImpl/entityForecastReturnProcessor,ejb-ref-type

Любая помощь будет высоко ценится! Похоже, я что-то упустил в сантехнике ...

Я хотел бы добавить, что если я добавлю следующее в аннотацию @EJB, похоже, что это избавит от ошибки:

@EJB(lookup="com.ls.forecast.jpa.ForecastReturnService/local")
private ForecastReturnService forecastReturnService;

Не уверен, почему мне пришлось бы указывать локальный интерфейс, так как я видел много примеров / руководств только с @EJB. Зачем мне нужно указывать локальный интерфейс?

Ответы [ 3 ]

2 голосов
/ 16 января 2013

Я искал хай-лоу для этого решения, наконец-то получил его.Прежде всего нам нужно знать о стандартных JNDI EE 6 (переносимые JNDI).Документация JBoss отстой.ты должен искать свое решение.

Портативный JNDI (ПРЕФИКСЫ):

  • java:appИспользуется только в приложении (например, EAR)
  • java:globalИспользуется из любого приложения в контейнере (т.е. даже вне EAR)
  • java:moduleИспользуемый только в модуле (то есть Модуль - EJB)

позволяет взглянуть на JBoss 6.1.0 JMX Console.Консоль JMX> service = JNDIView (в разделе JBoss)

Это дает вам представление JMX MBeanТеперь вы можете просмотреть дерево JNDI, нажав на кнопку вызова list строку (у меня был последний ряд), вы также можете использовать listXML, но я нашел это странным.

в разделе java: перейдите к ветви, которая начинается с global (потому что мы хотим использовать EJB удаленно вне EAR).Судя по приведенному выше коду, вы сможете найти путь, который выглядит примерно так:

global> ForecastReturnServiceEJB (Имя проекта)> ForecastReturnServiceImpl! Inject.ForecastReturnService

перевести это на:java:global/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService

Это JNDI, который мы должны использовать для глобального доступа.

 @EJB(mappedName="java:global/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService")
private ForecastReturnService forecastReturnService;

или

 @EJB(mappedName="java:app/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService")
private ForecastReturnService forecastReturnService;

Еще одна вещь, которую вы можете использовать только @EJB без параметров в том же EAR.

0 голосов
/ 11 января 2012

Есть ли что-то конкретное в интерфейсах, которые вы реализуете?

Самая простая реализация, развернутая в JBoss AS 6, работает только тогда, когда я быстро ее пробую локально:

package inject;

public interface ForecastReturnService {

}

Подлежит внедрениюbean-компонент:

package inject;

import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

@Stateless
@Local(ForecastReturnService.class)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ForecastReturnServiceImpl implements ForecastReturnService {


}

Интерфейс bean-компонента, в котором происходит внедрение:

package inject;

public interface CacheManagementService {

}

Bean-объект, в котором выполняется внедрение:

package inject;

import javax.ejb.EJB;
import javax.ejb.Stateless;

@Stateless
public class CacheManagementServiceImpl implements CacheManagementService {

    @EJB
    private ForecastReturnService forecastReturnService;
}

Соответствующие записи в журнале:

[org.jboss.ejb3.EJBContainer] STARTED EJB: inject.ForecastReturnServiceImpl ejbName: ForecastReturnServiceImpl
[org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

    ForecastReturnServiceImpl/local - EJB3.x Default Local Business Interface
    ForecastReturnServiceImpl/local-inject.ForecastReturnService - EJB3.x Local Business Interface

и

STARTED EJB: inject.CacheManagementServiceImpl ejbName: CacheManagementServiceImpl
[org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

    CacheManagementServiceImpl/local - EJB3.x Default Local Business Interface
    CacheManagementServiceImpl/local-inject.CacheManagementService - EJB3.x Local Business Interface

Два небольших замечания (напрямую не связанных с вашим вопросом), но @TransactionAttribute здесь не требуется.REQUIRED уже по умолчанию.@Local должен использоваться на интерфейсе, его использование на уровне класса предназначено для устаревших интерфейсов, которые вы не можете изменить.

0 голосов
/ 11 января 2012

Я решил эту проблему, изменив свой проект так, чтобы он теперь упаковывался как ухо, а не как война.Теперь я могу иметь столько jar-файлов ejb, сколько пожелаю, хотя я решил воспользоваться этой возможностью, чтобы реорганизовать проект и поместить все EJB в один и тот же модуль Maven.

...