Eugen Ivanou
Eugen Ivanou

Reputation: 13

Error creating "Service" bean

I have problem with service bean define. I tried to debug code, and sessionFactory always null. Can anyone explain me, where are mistakes? log:

Dec 12, 2014 5:36:10 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@62a83610: startup date [Fri Dec 12 17:36:10 FET 2014]; root of context hierarchy
Dec 12, 2014 5:36:10 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [application-context.xml]
Dec 12, 2014 5:36:10 PM org.springframework.beans.factory.support.DefaultListableBeanFactory registerBeanDefinition
INFO: Overriding bean definition for bean 'dao': replacing [Generic bean: class [com.pancerz.server.dao.impl.DaoImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/home/eugen/projects/pancerz/pancerz-server/server-admin/target/classes/com/pancerz/server/dao/impl/DaoImpl.class]] with [Generic bean: class [com.pancerz.server.dao.impl.DaoImpl]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [application-context.xml]]
Dec 12, 2014 5:36:10 PM org.springframework.beans.factory.support.DefaultListableBeanFactory registerBeanDefinition
INFO: Overriding bean definition for bean 'userDao': replacing [Generic bean: class [com.pancerz.server.dao.impl.UserDaoImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/home/eugen/projects/pancerz/pancerz-server/server-admin/target/classes/com/pancerz/server/dao/impl/UserDaoImpl.class]] with [Generic bean: class [com.pancerz.server.dao.impl.UserDaoImpl]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [application-context.xml]]
Dec 12, 2014 5:36:10 PM org.springframework.beans.factory.support.DefaultListableBeanFactory registerBeanDefinition
INFO: Overriding bean definition for bean 'userService': replacing [Generic bean: class [com.pancerz.server.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/home/eugen/projects/pancerz/pancerz-server/server-admin/target/classes/com/pancerz/server/service/impl/UserServiceImpl.class]] with [Generic bean: class [com.pancerz.server.service.impl.UserServiceImpl]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [application-context.xml]]
Dec 12, 2014 5:40:55 PM org.springframework.beans.factory.config.PropertyPlaceholderConfigurer loadProperties
INFO: Loading properties file from class path resource [jdbc.properties]
Dec 12, 2014 5:41:14 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@64ad8f2b: defining beans [dao,userDao,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,userService,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,propertyConfigurer,dataSource,sessionFactory,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
Dec 12, 2014 5:42:07 PM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
INFO: Loaded JDBC driver: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
Dec 12, 2014 5:42:13 PM org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.2.Final}
Dec 12, 2014 5:42:13 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.2.16.Final}
Dec 12, 2014 5:42:13 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Dec 12, 2014 5:42:13 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Dec 12, 2014 5:42:19 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Dec 12, 2014 5:42:20 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
Dec 12, 2014 5:42:20 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Dec 12, 2014 5:53:56 PM org.springframework.beans.factory.support.DefaultListableBeanFactory destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@64ad8f2b: defining beans [dao,userDao,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,userService,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,propertyConfigurer,dataSource,sessionFactory,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in class path resource [application-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'com.sun.proxy.$Proxy11 implementing com.pancerz.server.dao.UserDao,com.pancerz.server.dao.Dao,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'com.pancerz.server.dao.impl.UserDaoImpl' for property 'userDao'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy11 implementing com.pancerz.server.dao.UserDao,com.pancerz.server.dao.Dao,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.pancerz.server.dao.impl.UserDaoImpl] for property 'userDao': no matching editors or conversion strategy found
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at MainTest.main(MainTest.java:13)
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'com.sun.proxy.$Proxy11 implementing com.pancerz.server.dao.UserDao,com.pancerz.server.dao.Dao,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'com.pancerz.server.dao.impl.UserDaoImpl' for property 'userDao'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy11 implementing com.pancerz.server.dao.UserDao,com.pancerz.server.dao.Dao,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.pancerz.server.dao.impl.UserDaoImpl] for property 'userDao': no matching editors or conversion strategy found
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:463)
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:494)
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:488)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1463)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1422)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1158)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    ... 11 more
Caused by: java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy11 implementing com.pancerz.server.dao.UserDao,com.pancerz.server.dao.Dao,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.pancerz.server.dao.impl.UserDaoImpl] for property 'userDao': no matching editors or conversion strategy found
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:267)
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:448)
    ... 17 more

application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.pancerz.server.dao" />
    <context:component-scan base-package="com.pancerz.server.service" />

    <bean id="transactionManager"
          class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
          p:location="jdbc.properties"/>

    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName"
                  value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"/>
        <property name="url" value="jdbc:mysql://localhost/server-admin_dev"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
    </bean>

    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.connection.charSet">UTF-8</prop>
            </props>
        </property>
    </bean>

    <bean id="dao" class="com.pancerz.server.dao.impl.DaoImpl">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <bean id="userDao" class="com.pancerz.server.dao.impl.UserDaoImpl" parent="dao">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <bean id="userService" class="com.pancerz.server.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>

</beans>

Dao.java

public interface Dao<T, PK extends Serializable> {
    public PK save(T newInstance);

    public void update(T transientObject);

    public List<T> findAll();

    public List<T> findByCriteria(Criterion... criterion);

    public T findById(PK id);

    public void delete(PK id);

    public void delete(T persistentObject);

}

DaoImpl.java

@Repository("dao")
@Transactional(propagation= Propagation.REQUIRED, readOnly=false)
public class DaoImpl<T, PK extends Serializable> implements Dao<T, PK> {

    SessionFactory sessionFactory;

    private Class<T> entityClass;

    public DaoImpl() {
    }

    public DaoImpl(Class<T> clazz) {
        this.entityClass = clazz;
    }

    @SuppressWarnings("unchecked")
    @Override
    public PK save(T newInstance) {
        return (PK) getSession().save(newInstance);
    }

    @SuppressWarnings("unchecked")
    @Override
    public void update(T transientObject) {
        getSession().update(transientObject);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<T> findAll() {
        Criteria criteria = getSession().createCriteria(entityClass);
        return (List<T>) criteria.list();
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<T> findByCriteria(Criterion... criterion) {
        Criteria criteria = getSession().createCriteria(entityClass);
        for (Criterion c : criterion) {
            criteria.add(c);
        }
        return (List<T>) criteria.list();
    }

    @SuppressWarnings("unchecked")
    @Override
    public T findById(PK id) {
        return (T) getSession().get(entityClass, id);
    }

    @SuppressWarnings("unchecked")
    @Override
    public void delete(PK id) {
        T persistentObject = (T) getSession().load(entityClass, id);
        try {
            getSession().delete(persistentObject);
        } catch (NonUniqueObjectException e) {
            T instance = (T) getSession().merge(persistentObject);
            getSession().delete(instance);
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public void delete(T persistentObject) {
        try {
            getSession().delete(persistentObject);
        } catch (NonUniqueObjectException e) {
            T instance = (T) getSession().merge(persistentObject);
            getSession().delete(instance);
        }
    }

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

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}

UserDao.java

public interface UserDao extends Dao<User, Long> {
    public User findByLogin(String login);

    public User createUser(String login, String password, String email, String name, String surName,
                           Date birthDay, Date registrationDate, int role);

}

UserDaoImpl.java

package com.pancerz.server.dao.impl;

import com.pancerz.server.dao.UserDao;
import com.pancerz.server.models.User;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * Date: 12/12/14
 */
@Repository("userDao")
public class UserDaoImpl extends DaoImpl<User, Long> implements UserDao {

    public UserDaoImpl() {
        super(User.class);
    }

    @Override
    @Transactional
    public User findByLogin(String login) {
        Criteria criteria = getSession().createCriteria(User.class);
        criteria.add(Restrictions.like("login", login));
        return (User) criteria.uniqueResult();
    }

    @Override
    public User createUser(String login, String password, String email, String name, String surName,
                           Date birthDay, Date registrationDate, int role) {
        Criteria criteria = getSession().createCriteria(User.class);
//        criteria.set
        return (User) criteria.uniqueResult();
    }
}

UserService.java

package com.pancerz.server.service;

import com.pancerz.server.models.User;

import java.util.List;

/**

 * Date: 12/12/14
 */
public interface UserService {
    public User findByLogin(String login);

    public List<User> getAllUsers();
}

UserServiceImpl.java

@Service("userService")
public class UserServiceImpl implements UserService {

    private UserDaoImpl userDao;

    public UserServiceImpl() {
    }

    @Override
    @Transactional
    public User findByLogin(String login) {
        return userDao.findByLogin(login);
    }

    @Override
    @Transactional
    public List<User> getAllUsers() {
        return userDao.findAll();
    }

    @Autowired
    public void setUserDao(UserDaoImpl userDao) {
        this.userDao = userDao;
    }
}

Upvotes: 1

Views: 2013

Answers (1)

Arnold Galovics
Arnold Galovics

Reputation: 3416

You are using a UserDaoImpl in the UserServiceImpl class however spring proxying this class with implementing the UserDao interface.

Change the UserDaoImpl type to UserDao and change it in the setter as well and it should work.

Upvotes: 1

Related Questions