Я пытаюсь создать класс фабрики EJB, который работает следующим образом: у вас есть метод, который принимает в качестве аргумента класс EJB, а затем проверяет, имеет ли EJB удаленный интерфейс (если не выбрасывать исключение), и если это произойдет, оно возвращает EJB.EJB Factory Class
Код ниже выполняет именно это. Однако возвращаемый им объект относится к типу удаленного интерфейса для компонента, а не самого компонента. Как я могу это изменить? Есть ли способ сказать Java, что общий тип T имеет тот же тип, что и класс, переданный методам.
import java.util.Properties;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.naming.*;
public class EJBFactory
{
private InitialContext ctx;
public EJBFactory() throws NamingException {
ctx = new InitialContext();
}
public EJBFactory(String host, String port) throws NamingException {
Properties props = new Properties();
props.setProperty("org.omg.CORBA.ORBInitialHost", host);
props.setProperty("org.omg.CORBA.ORBInitialPort", port);
ctx = new InitialContext(props);
}
.
// To improve: The object returned should be of the type ejbClass
// instead of the remote interface, which it implements
public <T> T createEJB(Class ejbClass) throws NamingException
{
Class remoteInterface = null;
for(Class interface_: ejbClass.getInterfaces()) {
if(interface_.isAnnotationPresent(Remote.class))
remoteInterface = interface_;
}
if(remoteInterface == null)
throw new IllegalArgumentException(
"EJB Requires a remote interface");
// Get the stateless annotation, then get the jndiName
Stateless stateless =
(Stateless)ejbClass.getAnnotation(Stateless.class);
String jndiName = stateless.mappedName();
T ejbObj = (T) ctx.lookup(jndiName);
return ejbObj;
}
}
Пример модульного теста, который использует завод.
import junit.framework.TestCase;
public class SimpleEJBTest extends TestCase
{
TestRemote testBean;
@Override
protected void setUp() throws Exception {
super.setUp();
EJBFactory ejbFactory = new EJBFactory();
testBean = ejbFactory.createEJB(TestBean.class);
}
public void testSayHello() {
assertEquals("Hello", testBean.sayHello());
}
}
Примечание: пример работает с Glassfish, я не тестировал его ни с каким другим сервером приложений.
Каким будет использование объекта самого реального компонента? - вы всегда будете взаимодействовать через интерфейс правильно? в основном как InterfaceType ref = (InterfaceType) jndiLookup; После этого вы вызываете методы на ref. Попытка понять необходимость этого. – OpenSource