У меня есть проект Maven с этой структурой:@EJB аннотаций не работает для инициализации бина в приложении EJB
-myproject
-myproject-ear
-myproject-service
-webservice
-myproject-ejb
В myproject-ejb
у меня есть это Java пакеты:
-src/main/java/
-src/test/java/
у меня есть EJB и соответствующая реализация компонента в
-src/main/java/org/mypackage/MyBean.java
-src/main/java/org/mypackage/MyBeanImpl.java
В src/test/java/
У меня есть тест под названием MyBeanTest.java со следующим кодом:
import javax.ejb.EJB;
import org.mypackage.MyBean;
import org.junit.*;
public class MyBeanTest {
@EJB
private MyBean myBean;
@Test
public void testBean() {
System.out.println("myBean: "+myBean); // prints null
myBean.writeToDB("Hello", "World"); // fails since myBean is null
}
}
При запуске теста на единицу, то myBean
равно нулю. Мне интересно, почему аннотация @EJB
не работает. Пакет для тестирования находится в том же приложении, что и компонент, поэтому @EJB
должен работать.
Любые идеи?
EDIT 1
Я нашел this link с той же проблемой, как у меня есть, но решение там, кажется, это не распространяется на работу для меня. Я что-то делаю неправильно?
package org.myproject.ejb;
import java.util.Hashtable;
import java.util.Properties;
import javax.ejb.EJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import org.myproject.ejb.MyBean;
import org.jboss.ejb.client.ContextSelector;
import org.jboss.ejb.client.EJBClientConfiguration;
import org.jboss.ejb.client.EJBClientContext;
import org.jboss.ejb.client.PropertiesBasedEJBClientConfiguration;
import org.jboss.ejb.client.remoting.ConfigBasedEJBClientContextSelector;
import org.junit.*;
public class MyBeanTest {
private MyBean myBean;
@Before
public void init() {
try {
Properties clientProp = new Properties();
clientProp.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false");
clientProp.put("remote.connections", "default");
clientProp.put("remote.connection.default.port", "4447");
clientProp.put("remote.connection.default.host", "localhost");
clientProp.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS", "false");
EJBClientConfiguration cc = new PropertiesBasedEJBClientConfiguration(clientProp);
ContextSelector<EJBClientContext> selector = new ConfigBasedEJBClientContextSelector(cc);
EJBClientContext.setSelector(selector);
Properties env = new Properties();
env.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
env.put(Context.SECURITY_PRINCIPAL, "admin");
env.put(Context.SECURITY_CREDENTIALS, "testing");
InitialContext ctx = new InitialContext(env);
myBean = (MyBean) ctx.lookup("java:app/myproject-ejb-1.0-SNAPSHOT/MyBeanImpl");
}
catch(NamingException ex) {
ex.printStackTrace();
}
}
@Test
public void testBean() {
System.out.println("ejb: "+myBean); // prints null
}
}
Я получаю ошибку с помощью данной конфигурации:
WARN: Unsupported message received with header 0xffffffff
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)
Я считаю, что аннотация @EJB будет работать только в классах, управляемых контейнером сервлетов (например: сервлеты, управляемые компоненты, EJB и т. Д.). Если что-то не изменилось в последнее время, я бы не ожидал, что он будет работать в случайном классе pojo. – jahroy
Вы посмотрели http://www.junitee.org/? –
Вот [ответ] (http://stackoverflow.com/a/850006/778118), что также говорит о том, что @EJB работает только с управляемыми классами ... – jahroy