java.lang.IllegalArgumentException“无法设置DAO字段”与Spring 4&休眠4 [英] java.lang.IllegalArgumentException "Can not set DAO field" with Spring 4 & Hibernate 4

查看:89
本文介绍了java.lang.IllegalArgumentException“无法设置DAO字段”与Spring 4&休眠4的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图按照教程(使用STS):
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>

我已阅读过一些关于字段未被翻译的文章正确但它没有帮助我。在这里,我已经尝试过:



无法autowire字段:Spring-Hibernate



无法autowire字段

解决方案

您正在使用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

Could not autowire field

解决方案

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&amp;休眠4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆