2014-02-11 2 views
0

У меня возникло исключение в фазе фазы при попытке построить мой проект.Spring Maven - Не удалось загрузить ApplicationContext NoSuchBeanDefinitionException: Нет квалификационного компонента типа

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [java.lang.String] found for dependency: 
expected at least 1 bean which qualifies as autowire candidate for this dependency. 
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), 
@org.springframework.beans.factory.annotation.Qualifier(value=findUserByLogin)} 

Проект состоит с 4-х модулей:

AdviceExchange 
    ├── domain 
    ├── dao 
    ├── service 
    ├── web 

DAO классы (здесь происходят броски исключение)

package com.dozortsev.adviceexchange.dao; 
import com.dozortsev.adviceexchange.domain.User; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 
import static java.lang.String.format; 
import static org.springframework.transaction.annotation.Propagation.MANDATORY; 

@Transactional(propagation = MANDATORY) 
@Repository 
public class UserDaoImpl extends GenericDaoImpl<Long, User> implements UserDao { 

    @Autowired 
    private String findUserByLogin; // Spring can't Autowired this String 

    public UserDaoImpl() { 
     this.entityClass = User.class; 
    } 

    @Override public User findByLogin(String login) { 
     try { 
      log.info(format("Finding %s by Login: %s", getEntityClass(), login)); 
      User user = (User) getCurrentSession().createSQLQuery(findUserByLogin) 
         .addEntity(getEntityClass()).setString("login", login) 
         .uniqueResult(); 

      if (user != null) { 
       log.info("Successful found"); 
       return user; 
      } 
      log.info(format("%s not exist", getEntityClass())); 
     } catch (Exception e) { 
      log.error("Error: ", e); 
     } 
     return null; 
    } 
} 

Что случилось с моим ApplicationContext? Пожалуйста, помогите мне решить эту проблему.

+0

Пожалуйста, сократите свой вопрос, просто включив соответствующий код. Не нужно сбрасывать все, что не имеет отношения к вопросу – arahant

ответ

1

Я не вижу импорт из дао-приложения-context.xml в контексте тестового приложения. Поскольку для целей тестирования вы используете отдельный источник данных, вы должны добавить еще один файл контекста приложения с общими компонентами, необходимыми как в реальном контексте dao-application, так и в контексте тестового приложения. То есть, создать новый файл контекста совместного использования приложений context.xml со следующим:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"...> 
    <!-- Queries --> 
    <bean id="findUserByLogin" class="java.lang.String"> 
     <constructor-arg index="0" 
        value=" 
        SELECT u.* FROM 
         user u, badge b, user_badge ub 
        WHERE 
         u.user_id = ub.ub_user_id 
         AND 
         b.bdg_id = ub.ub_badge_id 
         AND 
         u.user_email = :login"/> 
    </bean> 
</beans> 

Затем импортировать, что в обоих дао-приложения-context.xml и файл контекста приложения тест с использованием:

<import resource="classpath:/META-INF/spring/shared-application-context.xml"/> 
+0

Да! Это решение, спасибо, но теперь у меня есть новое исключение: 'org.hibernate.HibernateException: сеанс не найден для текущего потока'. –

+0

Test-application-context.xml, загруженный абстрактным классом TestContext через @ContextConfiguration (locations = "/META-INF/spring/test-application-context.xml"). Этот файл не определяет никаких фасонных элементов. Вы также можете поместить этот бит («findUserByLogin») в тестовый контекстный файл, но тогда вы рискуете им выйти из синхронизации. – java1337

+0

Я исправляю 'No Session для текущей нити'. Добавьте '' в [здесь] (http://goo.gl/bsvxaA), но почему мы не видим мой ' SessionFactory' в этом файле. –

1

При использовании @Qualifier используйте

bean name="findUserByLogin" 

вместо

bean id="findUserByLogin" 
+0

Ошибка такая же. –

+0

На самом деле я не использую '@ Qualifier', но ошибка остается неизменной. Я удаляю эту аннотацию из кода. –

+0

По-моему, эта ошибка связана с 'ApplicationContext'. –

Смежные вопросы