Spring не может автоматически связать поле, Нет соответствующего бина типа - PullRequest
2 голосов
/ 25 декабря 2011

Я пытаюсь реализовать использование Spring 3.1.0.RELEASE + Hibernate, чтобы веб-сервис RESTful следовал проекту этого парня https://github.com/eugenp/REST

когда я запускаю мой проект, в нем содержится ошибка, подобная этой.

SEVERE: Context initialization failed
*.BeanCreationException: Error creating bean with name 'userServiceController': Injection of autowired dependencies failed;
*.BeanCreationException: Error creating bean with name 'defaultUserService': Injection of autowired dependencies failed;
*.BeanCreationException: Could not autowire field: private com.cloudlb.dao.UserDAO com.cloudlb.service.DefaultUserService.userDao;
*.NoSuchBeanDefinitionException: No matching bean of type [com.cloudlb.dao.UserDAO]

Это моя конфигурация: (persistence.properties)

ApplicationConfig:

@Configuration
@ComponentScan(basePackages = "com.cloudlb", excludeFilters = { @ComponentScan.Filter(Configuration.class)})
public class ApplicationConfig {

    @Bean
    public static PropertyPlaceholderConfigurer properties() {
        final PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        final Resource[] resources = new ClassPathResource[]{new ClassPathResource("persistence.properties"), new ClassPathResource("restful.properties")};
        ppc.setLocations(resources);
        ppc.setIgnoreUnresolvablePlaceholders(true);
        return ppc;
    }

В PersistenceHibernateConfig содержится так:

@Profile("hibernate")
@EnableTransactionManagement
public class PersistenceHibernateConfig { ...

    @Bean
    public LocalSessionFactoryBean alertsSessionFactoryBean() { ...

    @Bean
    public DataSource restDataSource() { ...

    @Bean
    public HibernateTransactionManager transactionManager() { ...

WebConfig:

@Configuration
@EnableWebMvc
public class WebConfig { ... }

Итак, он начинает получать ошибку в автопроводке отсюда:

UserServiceController:

@Controller
public class UserServiceController {

    @Autowired
    private UserService userService;

UserService, который реализован в DefaultUserService:

@Service
@Transactional(propagation = Propagation.REQUIRED)
public class DefaultUserService implements UserService {

    @Autowired
    private UserDAO userDao;

UserDAO:

public interface UserDAO extends GenericDAO<User> {  ... }

UserHibernateDAO:

@Profile("hibernate")
public class UserHibernateDAO extends GenericHibernateDAO<User> implements UserDAO{ ... }

GenericHibernateDAO:

@Profile("hibernate")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class GenericHibernateDAO<T extends Serializable> extends AbstractHibernateDAO<T> implements GenericDAO<T> { ... }

И последнее. AbstractHibernateDAO:

@Transactional( propagation = Propagation.SUPPORTS )
public abstract class AbstractHibernateDAO<T extends Serializable> implements DAO<T> {

    private Class<T> clazz;

    @Autowired
    private SessionFactory sessionFactory;

    public AbstractHibernateDAO() {
        super();
    }

    public final void setClazz(final Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    @Transactional( readOnly = true )
    public T findById(String id) {
        return (T) this.getCurrentSession().get(this.clazz, id);
    }

    protected Session getCurrentSession() {
        return this.sessionFactory.getCurrentSession();
    }
}

Я думал, что он может найти UserHibernateDAO. Может быть, я что-то здесь упускаю. Так что, надеюсь, кто-то знает, как это исправить. Я ударил эту проблему в течение 2 дней.

Полагаю, в SessionFactory тоже может быть проблема. Потому что я начал исправлять эту вещь, и это пришло.

Заранее спасибо.

1 Ответ

3 голосов
/ 25 декабря 2011

В дополнение к @Profile("hibernate") для UserHibernateDAO нужна аннотация, объявляющая его бобом Spring типа @Named или @Component.

...