Ошибка компиляции при попытке связать фабричный класс в Джерси 2.27 - PullRequest
0 голосов
/ 06 июля 2018

Я создаю Java REST API с использованием Jersey 2.27, и в моем тестовом классе (как показано ниже) я получаю следующую ошибку компиляции: Cannot resolve method 'bindFactory(java.lang.Class<LdapServiceFactory>)'.

Я не понимаю, почему это не компилируется. У метода bindFactory есть один параметр типа Class<? extends Supplier<T>>, и мой фабричный класс реализует Supplier<LdapService>, как показано ниже. Может кто-нибудь объяснить мне, почему это не скомпилируется?

PS: Это всего лишь фрагменты полного кода, чтобы прояснить ситуацию.

import org.glassfish.jersey.internal.inject.AbstractBinder;

public class AppTest extends JerseyTest {
    @Override
    protected Application configure() {
        return new ResourceConfig()
                .packages(App.class.getPackage().getName())
                .register(new AbstractBinder() {
                    @Override
                    protected void configure() {
                        bindFactory(LdapServiceFactory.class).to(LdapService.class);
                    }
            });
    }
}

Вот как выглядит мой LdapServiceFactory класс:

public class LdapServiceFactory<T> implements Supplier<LdapService> {
    @Override
    public LdapService<T> get() {
        return createLdapService(DEFAULT_PROPERTIES_FILE);
    }
}

И, наконец, класс LdapService:

public interface LdapService<T> {
    List<T> request(String filter, String[] attributes, ResponseHandler<T> responseHandler) throws FilterException, ServerException;
}

1 Ответ

0 голосов
/ 06 июля 2018

Удалите универсальный тип из вашего фабричного класса. То, что вы должны идти, это добавить конкретный тип к Supplier

public class LdapServiceFactory implements Supplier<LdapService<YourType>> {
    @Override
    public LdapService<YourType> get() {
        return createLdapService(DEFAULT_PROPERTIES_FILE);
    }
}

Тогда, когда вы свяжете это, сделайте

bindFactory(LdapServiceFactory.class)
        .to(new GenericType<LdapService<YourType>>() {});

Это обеспечивает безопасность типа при вводе.

@Inject
private LdapService<YourType> service; 
...