У меня есть класс, который расширяет 2 других класса, как показано ниже.
public class EJBHandler<T extends EJBObject, I extends EJBHome>
(EJBObject и EJBHome происходят из артефакта javax.ejb) Идея, стоящая за этим, заключалась в том, чтобы я мог просто использовать Springчтобы указать точный экземпляр, и Spring автоматически подключит экземпляр для меня, как в следующем примере.
@Autowired
private EJBHandler<SystemUser, SystemUserHome> systemUserEjb;
@Autowired
private EJBHandler<Authentication, AuthenticationHome> authenticationEjb;
Но при попытке выполнения вышеизложенного я получаю следующую ошибку:
Expected 1 type argument on generic interface.remote.EJBHandler<?, ?> but found 2
Я искал решение, но ни один из них, похоже, не работает. Среди них, которые, по моему мнению, имели больше шансов решить проблему, был следующий метод:
- В классе
EJBHandler
есть конструктор, который определял бы типы классов, используя встроенный в Spring GenericTypeResolver (каквидно ниже). Это решение строится, но похоже, что при фактическом использовании systemUserEjb
имеет значение null и никогда не инициализируется.
protected Class<T> ejbObject;
protected Class<I> ejbHomeClass;
@SuppressWarnings("unchecked")
protected void EJBHandler() {
ejbObject = (Class<T>) GenericTypeResolver.resolveTypeArgument(getClass(), EJBHandler.class);
ejbHomeClass =(Class<I>) GenericTypeResolver.resolveTypeArgument(getClass(), EJBHandler.class);
if(useExternalDependencies) {
try {
Object homeObject = createHomeObject(ejbObject.getSimpleName(), "SomeServerHere");
this.homeObject = (I) PortableRemoteObject.narrow(homeObject, ejbHomeClass);
} catch (NamingException e) {
e.printStackTrace();
}
}
}
protected Object createHomeObject(String jndiName, DeployedServer server) throws NamingException {
Context ctx = new InitialContext(getProperties(server));
Object homeObject = ctx.lookup(jndiName);
log.debug("Found [{}] bean in context on server [{}].", jndiName, server);
return homeObject;
}
Затем я создал конкретный класс для расширения класса EJBHandler
ив конструктор просто внедрить объекты класса и тогда он работает?
Мой вопрос таков: почему, поскольку в моей голове должно происходить то же самое без необходимости иметь конкретный класс, который ничего не делает, кроме как просто сказать суперклассу тип T и I?