Как расширить класс с помощью 2 универсальных типов и получить экземпляр Spring to Autowire - PullRequest
1 голос
/ 24 октября 2019

У меня есть класс, который расширяет 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

Я искал решение, но ни один из них, похоже, не работает. Среди них, которые, по моему мнению, имели больше шансов решить проблему, был следующий метод:

  1. В классе 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?

...