2017-03-06 33 views
0

Stuff.java:为什么我得到这个错误“在org.springframework.beans.factory.BeanCreationException中嵌套:创建名为'workService'的bean时出错?”?

@Entity 
@Table(name = "STUFF") 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Stuff { 
} 

Work.java:

@Entity 
@Table(name = "WORK") 
public class Work extends Stuff{ 
} 

AbstractDao的:

public abstract class AbstractDao<PK extends Serializable, T> { 
private final Class<T> persistentClass; 

@SuppressWarnings("unchecked") 
public AbstractDao(){ 
    this.persistentClass =(Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1]; 
} 

@Autowired 
private SessionFactory sessionFactory; 

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

@SuppressWarnings("unchecked") 
public T getByKey(PK key) { 
    return (T) getSession().get(persistentClass, key); 
} 

public void persist(T entity) { 
    getSession().persist(entity); 
} 

public void update(T entity) { 
    getSession().update(entity); 
} 

public void delete(T entity) { 
    getSession().delete(entity); 
} 

protected Criteria createEntityCriteria(){ 
    return getSession().createCriteria(persistentClass); 
} 
} 

StuffDao:

public interface StuffDao<T> { 
} 

StuffDaoImpl:

@Repository("stuffDao") 
public class StuffDaoImpl<T> extends AbstractDao<Integer,T> implements  StuffDao<T> { 


private Class<T> persistenceClass; 
@PersistenceContext 
protected EntityManager entityManager; 
public StuffDaoImpl(final Class<T> persistenceClass){ 
    this.persistenceClass = persistenceClass; 
} 

public final EntityManager getEntityManager() { 
    return entityManager; 
} 

public final void setEntityManager(EntityManager entityManager){ 
    this.entityManager = entityManager; 
} 
@Autowired 
private SessionFactory sessionFactory; 

@PersistenceContext 
protected EntityManager em; 

private Class<T> type; 

public StuffDaoImpl() { 
    Type t = getClass().getGenericSuperclass(); 
    ParameterizedType pt = (ParameterizedType) t; 
    type = (Class) pt.getActualTypeArguments()[0]; 
} 
} 

WorkDao这从StuffDao inhetitence:

public interface WorkDao extends StuffDao<Work>{ 
} 

WorkDaoImpl:

@Repository("workDao") 
public class WorkDaoImpl extends StuffDaoImpl<Work> implements WorkDao { 


public WorkDaoImpl(){ 
    super(); 
} 

} 

StuffService:

public interface StuffService<T> { 
} 

StuffServiceImpl:

@Service("stuffService") 
@Transactional 
public class StuffServiceImpl<T> implements StuffService<T> { 

@Autowired 
private StuffDao<T> dao; 
} 

WorkService:

public interface WorkService extends StuffService<Work>{ 
} 

WorkServiceImpl:

@Service("workService") 
@Transactional 
public class WorkServiceImpl extends StuffServiceImpl<Work> implements WorkService { 

@Autowired 
private WorkDao daow; 
} 

的Hibernate配置:

<?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:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 


<context:property-placeholder location="classpath:application.properties" /> 

<context:component-scan base-package="com.newbaz" /> 
<!--<context:annotation-config />--> 
<!--<mvc:default-servlet-handler/>--> 
<tx:annotation-driven transaction-manager="transactionManager"/> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}"/> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" > 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.newbaz.model</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql:false}</prop> 
      <prop key="hibernate.format_sql">${hibernate.format_sql:false}</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.current_session_context_class">thread</prop> 

     </props> 
    </property> 

</bean> 


<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<bean id="persistenceExceptionTranslationPostProcessor" 
     class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

<mvc:annotation-driven conversion-service="conversionService"/> 

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 

    <property name="converters"> 
     <util:list> 
      <bean id="roleToUserProfile" class="com.newbaz.converter.RoleToUserProfileConverter" /> 
     </util:list> 
    </property> 
</bean> 


<!--<bean id="productDao" class="com.newbaz.dao.ProductDao" />--> 
</beans> 

最后错误:

[ERROR] Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.newbaz.dao.StuffDao com.newbaz.service.StuffServiceImpl.dao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workDao' defined in file [/home/dorsa/IdeaProjects/spring/newbazzar/target/classes/com/newbaz/dao/WorkDaoImpl.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.newbaz.dao.WorkDaoImpl]: Constructor threw exception; nested exception is java.lang.ArrayIndexOutOfBoundsException: 1: 
java.lang.ArrayIndexOutOfBoundsException: 1 
at com.newbaz.dao.AbstractDao.<init>(AbstractDao.java:19) 
at com.newbaz.dao.StuffDaoImpl.<init>(StuffDaoImpl.java:44) 
at com.newbaz.dao.WorkDaoImpl.<init>(WorkDaoImpl.java:21) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1098) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:540) 
at org.mortbay.jetty.servlet.Context.startContext(Context.java:135) 
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) 
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:510) 
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
at org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebAppContext.java:110) 
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152) 
at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156) 
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152) 
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
at org.mortbay.jetty.Server.doStart(Server.java:222) 
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
at org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:132) 
at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:371) 
at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:307) 
at org.mortbay.jetty.plugin.AbstractJettyRunMojo.execute(AbstractJettyRunMojo.java:203) 
at org.mortbay.jetty.plugin.Jetty6RunMojo.execute(Jetty6RunMojo.java:184) 
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) 
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207) 
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) 
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) 
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) 
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) 
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307) 
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193) 
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106) 
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863) 
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288) 
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) 
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) 
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) 
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 
at org.codehaus.classworlds.Launcher.main(Launcher.java:47) 

请帮帮我。我能做什么?错误在哪里?

方面 Dorsa

+0

WorkDaoImpl没有参数化类型! – Jens

回答

1

你的堆栈跟踪告诉你:

nested exception is java.lang.ArrayIndexOutOfBoundsException: 1: java.lang.ArrayIndexOutOfBoundsException: 1 at com.newbaz.dao.AbstractDao.(AbstractDao.java:19)

我没有行号,但我想它指的是:

this.persistentClass =(Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];

你可能不有第二个ActualTypeArgument。

+0

非常感谢。你的回答帮助我。 –

0

显然,这个代码炸毁:

Type t = getClass().getGenericSuperclass(); 
ParameterizedType pt = (ParameterizedType) t; 
type = (Class) pt.getActualTypeArguments()[0]; 

猜测通用参数似乎无论如何检测类型相当不稳定的方式。只需使用另一个StuffDaoImpl构造函数,它可以让你提供实体类型,并且一切都应该正常工作:

@Repository("workDao") 
public class WorkDaoImpl extends StuffDaoImpl<Work> implements WorkDao { 

    public WorkDaoImpl(){ 
     super(Work.class); 
    } 

} 
+0

谢谢你的回答。 –

相关问题