Ошибка при внедрении службы: UnsatisfiedDependencyException: не было объекта, доступного для внедрения в SystemInjecteeImpl - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь внедрить службу в приложение весенней загрузки. Однако я получаю следующую ошибку:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=RecommendationService,parent=RecommendationResourceImpl,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1163111460)

Вот код:

package com.example.test.recommendations.resources;    

@Provider
public class RecommendationResourceImpl implements RecommendationResource {

@Inject
private RecommendationService recommendationService;

@Override
public List<Recommendation> get(String currency,
                                String entity) {
    return recommendationService.getRecommendations(currency, entity));
  }
}

Сервисный интерфейс

package com.example.test.recommendations.resources;

// imports

public interface RecommendationService {
    List<Recommendation> getRecommendations(String currency, String entity);

    Recommendation get(UUID uuid);
}

Реализация услуги

package com.example.test.recommendations.resources;

//imports

@Component
public class RecommendationServiceImpl implements RecommendationService{
    @Override
    public List<Recommendation> getRecommendations(String currency, String entity) {
        return Collections.emptyList();
    }

    @Override
    public Recommendation get(UUID uuid) {
        return null;
    }
}

Как правильно вводить службы в приложениях с весенней загрузкой?

Я использую весеннюю загрузку версии 1.3.8 и Джерси версии 2.25.1

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Вы, вероятно, никогда не регистрировали свою Службу в DI-контейнере. Вы можете сделать это в вашем ResourceConfig, который вы, вероятно, имеете, так как используете джерси:

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(new org.glassfish.hk2.utilities.binding.AbstractBinder() {

            @Override
            protected void configure() {
                bind(RecommendationServiceImpl.class).to(RecommendationService.class).in(Singleton.class);
            }
        });

        packages("com.example.test.recommendations.resources");
    }
}

Я использую hk2 без пружины, поэтому я обычно аннотирую свои интерфейсы с org.jvnet.hk2.annotations.Contract, а реализации с org.jvnet.hk2.annotations.Service. (примечание: не весенняя аннотация @Service), поэтому я рекомендую попробовать и это.

0 голосов
/ 07 июня 2019

Из вашей трассировки стека видно, что серверу не удается найти бин зависимости, который нужно внедрить. Итак, сначала проверьте, что при запуске приложения создается желаемый бин для класса. Убедитесь, что класс обслуживания находится в пути к классам для компонента. выполнить сканирование, в противном случае включите пакет для сканирования.

Вы используете аннотацию @Inject вместо пружинной аннотации @Autowired для добавления бобов. Она будет работать нормально, но первое и самое важное отличие между аннотациями @Autowired и @Inject заключается в том, что аннотация @Inject доступно только начиная с Spring 3.0, поэтому, если вы хотите использовать внедрение зависимостей на основе аннотаций в Spring 2.5, вы должны использовать аннотацию @Autowired.

Во-вторых, используйте аннотацию @Service для уровня обслуживания, а не аннотацию @Component.

Указывает, что аннотированный класс является «Сервисом», изначально определенным по доменно-управляемой конструкции (Эванс, 2003) как «операция, предлагаемая как интерфейс, который стоит отдельно в модели, без инкапсулированного состояния. "

Может также указывать, что класс является «Фасадом бизнес-услуг» (в Основные J2EE-шаблоны имеют смысл) или что-то подобное. Эта аннотация универсальный стереотип и отдельные команды могут сузить семантика и использование по необходимости.

Эта аннотация служит специализацией @Component, позволяя классы реализации, которые будут автоматически обнаруживаться при сканировании пути к классам.

@Service
public class RecommendationServiceImpl implements RecommendationService{
    @Override
    public List<Recommendation> getRecommendations(String currency, String entity) {
        return Collections.emptyList();
    }

    @Override
    public Recommendation get(UUID uuid) {
        return null;
    }
}

Я не являюсь экспертом по использованию трикотажа со Springboot, поэтому я не знаю, являются ли какие-либо конфигурации причиной этой проблемы.

Может быть, эта тема может вам помочь больше: Инъекция зависимости с Джерси 2.0

...