java.lang.IllegalArgumentException“无法设置DAO字段”与Spring 4&休眠4 [英] java.lang.IllegalArgumentException "Can not set DAO field" with Spring 4 & Hibernate 4
问题描述
Spring 4和Hibernate 4集成教程第1部分:XML配置
一切都很顺利,除了执行。这是我在部署期间得到的内容:
< pre>
2015年1月17日6:39:22 org.apache.catalina.core.ApplicationContext log
SEVERE:StandardWrapper.Throwable
org.springframework.beans.factory.BeanCreationException:创建bean时出错名称为'homeController':注入自动装载依赖失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装入字段:private com.example.web.dao.ActivityDAO com.example.web.HomeController.activityDAO;嵌套异常是java.lang.IllegalArgumentException:无法将com.example.web.dao.ActivityDAO字段com.example.web.HomeController.activityDAO设置为com.sun.proxy。$ Proxy32 $ b $ at org.springframework.beans .factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans .factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans .factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:304)
在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(Defaul tSingletonBeanRegistry.java:228)美元,org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300 B $ B)
在org.springframework.beans.factory.support.AbstractBeanFactory.getBean( AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext。的java:760)$在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482 b $ b)
。在org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)在org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
。在org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext( FrameworkServlet.java:672)在org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543
)
在org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java: 484)
在org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)在javax.servlet.GenericServlet.init(GenericServlet.java:158
)
。在组织.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1241)
在org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154)
在org.apache.catalina .core.StandardWrapper.load(StandardWrapper.java:1041)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4944)
at org.apache.catalina.core.StandardContext .startInternal(StandardContext.java:5230)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at com.springsource.tcserver.serviceability.de ploy.TcContainerDeployer.startApplication(TcContainerDeployer.java:371)
at com.springsource.tcserver.serviceability.deploy.TcContainerDeployer.startApplication(TcContainerDeployer.java:351)
at sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(未知源)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)
at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(Unknown Source)
at javax.management.remote .rmi.RMIConnectionImpl.doOperation(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.access $ 300(Unknown Source)
在javax.management.remote.rmi.RMIConnectionImpl $ PrivilegedOperation.run(未知源)$ b $ java.util.AccessController.doPrivileged(Native方法)
在javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation (来源不明)
在javax.management.remote.rmi.RMIConnectionImpl.invoke(来源不明)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在sun.reflect.NativeMethodAccessorImpl .invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server .UnicastServerRef.dispatch(未知来源)
在sun.rmi.transport.Transport $ 1.run(未知来源)
在sun.rmi.transport.Transport $ 1.run(未知来源)
在java.security.AccessController.doPrivileged(本地方法)
在sun.rmi.transport.Transport.serviceCall(未知源)
在sun.rmi.transport.tcp.TCPTransport.h andleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(Unknown Source)
。在java.util.concurrent.ThreadPoolExecutor.runWorker(来源不明)
在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(来源不明)
在java.lang.Thread.run( org.springframework.beans.factory.BeanCreationException:未知来源)
。通过致无法自动装配领域:私人com.example.web.dao.ActivityDAO com.example.web.HomeController.activityDAO;嵌套异常是java.lang.IllegalArgumentException:无法将com.example.web.dao.ActivityDAO字段com.example.web.HomeController.activityDAO设置为com.sun.proxy。$ Proxy32 $ b $ at org.springframework.beans .factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
在org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
在org.springframework .beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 54 more
引起:java.lang.IllegalArgumentException:无法设置com.example.web.dao。 ActivityDAO场com.example.web.HomeController.activityDAO到com.sun.proxy。$ Proxy32
在sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(来源不明)
在sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(未知小号乌尔斯河)
在sun.reflect.UnsafeObjectFieldAccessorImpl.set(来源不明)
在java.lang.reflect.Field.set(来源不明)
在org.springframework.beans.factory.annotation .AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504)
... 56 more
2015年1月17日6:39:22 org.apache.catalina.core.StandardContext loadOnStartup
SEVERE:Servlet / web抛出load()异常
java.lang.IllegalArgumentException:无法将com.example.web.dao.ActivityDAO字段com.example.web.HomeController.activityDAO设置为com.sun .proxy。$ Proxy32 $在sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(来源不明)
在sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(来源不明)
在sun.reflect.UnsafeObjectFieldAccessorImpl.set(b $ b未知源)
在java.lang.reflect.Field.set(未知源)
在org.springframework.beans.factory.ann otation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject处org.springframework.beans org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
(AutowiredAnnotationBeanPostProcessor.java:504)
。在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean上
(AbstractAutowireCapableBeanFactory.java:1185)在org.springframework.beans处
。在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean上的
(AbstractAutowireCapableBeanFactory.java:475)在org.springframework.beans处
。 factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.s upport.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
处org.springframework.beans.factory org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
。在org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
(DefaultListableBeanFactory.java:703)
。在org.springframework.context.support。 AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext( FrameworkServlet.java:658)在org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624
)
在org.springframework.we b.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
处org.springframework.web.servlet org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
。 FrameworkServlet.initServletBean(FrameworkServlet.java:484)
在org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
在javax.servlet.GenericServlet.init(GenericServlet.java:在org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1241 158)
)
。在org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1041)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4944)
at org .apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)在com.springsource.tcserver.serviceability.deploy.TcContainerDeployer.startApplication(TcContainerDeployer.java:371)
在com.springsource.tcserver.serviceability.deploy.TcContainerDeployer.startApplication(TcContainerDeployer.java:351)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
at com.sun。 jmx.interceptor.DefaultMBeanServerInterceptor.invoke(未知源)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(未知源)
at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(未知源)
在javax.management.remote.rmi.RMIConnectionImpl.doOperation(未知源)
在javax.management.remote。 rmi.RMIConnectionImpl.access $ 300(来源不明)在javax.management.remote.rmi.RMIConnectionImpl $ PrivilegedOperation.run(来源不明)
在java.security.AccessController.doPrivileged
(本机方法)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke (未知源)
在sun.rmi.server.UnicastServerRef.dispatch(未知源)
在sun.rmi.transport.Transport $ 1.run(未知源)
在sun.rmi。 transport.Transport $ 1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown S乌尔斯河)
在sun.rmi.transport.tcp.TCPTransport.handleMessages(来源不明)
在sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(来源不明)
在阳光下.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(未知源)
在java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
在java.util.concurrent.ThreadPoolExecutor $ Worker.run (未知来源)
在java.lang.Thread.run(未知来源)
< / pre>
使用此脚本创建的数据库中的活动表:
CREATE TABLE IF NOT EXISTS`Example`.Activity`(
`id` INT NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(32) NOT NULL,
PRIMARY KEY(`id`),
UNIQUE INDEX`id_UNIQUE`(`id` ASC))
ENGINE = InnoDB
以下是Model类:
package com。 example.web.model;
public class Activity
{
private int id;
私人字符串名称;
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
$ b $ p $这是我的servlet-context.xml <?xml version =1.0encoding =UTF-8?>
< beans xmlns:mvc =http://www.springframework.org/schema/mvc
xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xmlns =http://www.springframework.org/schema/beans
xmlns:context =http://www.springframework.org/schema/context
xmlns :tx =http://www.springframework.org/schema/tx
xsi:schemaLocation =http://www.springframework.org/schema/mvc http://www.springframework.org/ schema / mvc / spring-mvc.xsd
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\">
<! - DispatcherServlet上下文:定义这个servlet的请求处理基础结构 - >
<! - 启用Spring MVC @Controller编程模型 - >
< mvc:annotation-driven />
<! - 通过高效地提供$ {webappRoot} / resources目录中的静态资源来处理/ resources / **的HTTP GET请求 - >
< mvc:resources mapping =/ resources / **location =/ resources //>
<! - 解析@Controllers为/ WEB-INF / views目录中的.jsp资源选择渲染的视图 - >
< bean class =org.springframework.web.servlet.view.InternalResourceViewResolver>
< property name =prefixvalue =/ WEB-INF / views //>
< property name =suffixvalue =。jsp/>
< / bean>
< context:component-scan base-package =com.example.web/>
< context:component-scan base-package =com.example.web.dao/>
< bean id =dataSourceclass =org.apache.commons.dbcp2.BasicDataSourcedestroy-method =close>
< property name =driverClassNamevalue =com.mysql.jdbc.Driver/>
< property name =urlvalue =jdbc:mysql:// localhost:3306 / Example/>
< property name =usernamevalue =example/>
< property name =passwordvalue =eX $ @ mp1E/>
< / bean>
< bean id =sessionFactoryclass =org.springframework.orm.hibernate4.LocalSessionFactoryBean>
< property name =dataSourceref =dataSource/>
< property name =configLocationvalue =classpath:hibernate.cfg.xml/>
< / bean>
< tx:annotation-driven />
< bean id =transactionManagerclass =org.springframework.orm.hibernate4.HibernateTransactionManager>
< property name =sessionFactoryref =sessionFactory/>
< / bean>
< bean id =ActivityDaoclass =com.example.web.dao.ActivityDAO>
< constructor-arg>
< ref bean =sessionFactory/>
< / constructor-arg>
< / bean>
< / beans>
以下是ActivityDAO:
package com.example.web.dao;
import java.util.List;
import com.example.web.model.Activity;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
public class ActivityDAO implements IActivityDAO
{
private SessionFactory sessionFactory;
public ActivityDAO(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
@Override
@Transactional
public List< Activity> All()
{
@SuppressWarnings(unchecked)
List< Activity> listActivity =(List< Activity>)sessionFactory.getCurrentSession()
.createCriteria(Activity.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
return listActivity;
$ / code>
我已阅读过一些关于字段未被翻译的文章正确但它没有帮助我。在这里,我已经尝试过:
解决方案您正在使用Spring JDK代理方法。你的 HomeController
有类似于 ActivityDAO
的字段:
@Autowired
私人的ActivityDAO activityDAO;
但是Spring无法使用JDK代理方法创建类代理。
您可以将 activityDAO
字段的类型更改为 IActivityDAO
:
@Autowired
private IActivityDAO activityDAO;
即可解决问题。
阅读更多关于代理方法的信息:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop-api.html#aop-pfb-proxy-types
I am trying to follow the tutorial (using STS):
Spring 4 and Hibernate 4 Integration Tutorial Part 1: XML Configuration
Everything went smooth except execution. Here is what I am getting during deployment:
<pre>
Jan 17, 2015 6:39:22 PM org.apache.catalina.core.ApplicationContext log
SEVERE: StandardWrapper.Throwable
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.web.dao.ActivityDAO com.example.web.HomeController.activityDAO; nested exception is java.lang.IllegalArgumentException: Can not set com.example.web.dao.ActivityDAO field com.example.web.HomeController.activityDAO to com.sun.proxy.$Proxy32
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1241)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1041)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4944)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at com.springsource.tcserver.serviceability.deploy.TcContainerDeployer.startApplication(TcContainerDeployer.java:371)
at com.springsource.tcserver.serviceability.deploy.TcContainerDeployer.startApplication(TcContainerDeployer.java:351)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)
at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.web.dao.ActivityDAO com.example.web.HomeController.activityDAO; nested exception is java.lang.IllegalArgumentException: Can not set com.example.web.dao.ActivityDAO field com.example.web.HomeController.activityDAO to com.sun.proxy.$Proxy32
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 54 more
Caused by: java.lang.IllegalArgumentException: Can not set com.example.web.dao.ActivityDAO field com.example.web.HomeController.activityDAO to com.sun.proxy.$Proxy32
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(Unknown Source)
at java.lang.reflect.Field.set(Unknown Source)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504)
... 56 more
Jan 17, 2015 6:39:22 PM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet /web threw load() exception
java.lang.IllegalArgumentException: Can not set com.example.web.dao.ActivityDAO field com.example.web.HomeController.activityDAO to com.sun.proxy.$Proxy32
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(Unknown Source)
at java.lang.reflect.Field.set(Unknown Source)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1241)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1041)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4944)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at com.springsource.tcserver.serviceability.deploy.TcContainerDeployer.startApplication(TcContainerDeployer.java:371)
at com.springsource.tcserver.serviceability.deploy.TcContainerDeployer.startApplication(TcContainerDeployer.java:351)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)
at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
</pre>
The Activity Table in the database created with this script:
CREATE TABLE IF NOT EXISTS `Example`.`Activity` (
`id` INT NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(32) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB
Here is the Model class:
package com.example.web.model;
public class Activity
{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
This is my servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
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">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<context:component-scan base-package="com.example.web" />
<context:component-scan base-package="com.example.web.dao"/>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/Example"/>
<property name="username" value="example"/>
<property name="password" value="eX$@mp1E"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="ActivityDao" class="com.example.web.dao.ActivityDAO">
<constructor-arg>
<ref bean="sessionFactory" />
</constructor-arg>
</bean>
</beans>
Here is the ActivityDAO:
package com.example.web.dao;
import java.util.List;
import com.example.web.model.Activity;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
public class ActivityDAO implements IActivityDAO
{
private SessionFactory sessionFactory;
public ActivityDAO(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
@Override
@Transactional
public List<Activity> All()
{
@SuppressWarnings("unchecked")
List<Activity> listActivity = (List<Activity>) sessionFactory.getCurrentSession()
.createCriteria(Activity.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
return listActivity;
}
}
I have read some post about fields are not being translated properly but it did not help me. Here what I have tried:
Could not autowire field: Spring-Hibernate
解决方案 You are using spring JDK proxy method. And your HomeController
have a field like of type ActivityDAO
like:
@Autowired
private ActivityDAO activityDAO;
however spring is unable to create class proxy using JDK proxy method.
You can change type of activityDAO
field to IActivityDAO
:
@Autowired
private IActivityDAO activityDAO;
that will solve the problem.
Read more about proxy methods here:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop-api.html#aop-pfb-proxy-types
这篇关于java.lang.IllegalArgumentException“无法设置DAO字段”与Spring 4&休眠4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!