2016-03-30 27 views
0

当我运行项目时,我得到一个IllegalArgumentException,问题是我自动装配了StudentService(它是一个类实现IStudentService)。但是当我自动装配IStudentService时,问题得到解决。人们告诉我,做这样的,但他们不告诉我why.I想知道哪些导致problem.Any答案的原因是赞赏:>使用@Autowired时抛出java.lang.IllegalArgumentException

StudentController

@Controller 
     public class StudentController { 
      @Autowired 
      StudentService studentService; 

      @RequestMapping("get") 
      public String get(){ 
       Student student = new Student(); 
       student.setName("abc"); 
       try { 
        studentService.save(student); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return "somwhere"; 
      } 
     } 

StudentService

@Service 
public class StudentService implements IStudentService{ 
    @Autowired 
    IStudentDao studentDao; 

    public Student getStudent(String id) throws Exception { 
     return studentDao.query(id); 
    } 

    public List<Student> getAll() throws Exception{ 
     return studentDao.queryAll(); 
    } 

    @Transactional 
    public void save(Student student)throws Exception{ 
     studentDao.save(student); 
    } 

    @Transactional 
    public void delete(Student student) throws Exception{ 
     studentDao.delete(student); 
    } 
} 

IStudentService

public interface IStudentService { 
    public Student getStudent(String id) throws Exception; 

    public List<Student> getAll() throws Exception; 

    public void save(Student student)throws Exception; 

    public void delete(Student student) throws Exception; 
} 

栈跟踪

**Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'studentController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.gtis.service.StudentService com.gtis.controller.StudentController.studentService; nested exception is java.lang.IllegalArgumentException: Can not set com.gtis.service.StudentService field com.gtis.controller.StudentController.studentService to com.sun.proxy.$Proxy30 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1146) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    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:633) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:602) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:521) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:462) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:595) 
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:385) 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:862) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:300) 
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1341) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1334) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:744) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:497) 
    at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:281) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:154) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.server.Server.start(Server.java:357) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:324) 
    at org.eclipse.jetty.maven.plugin.JettyServer.doStart(JettyServer.java:68) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:564) 
    at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:360) 
    at org.eclipse.jetty.maven.plugin.JettyRunWarExplodedMojo.execute(JettyRunWarExplodedMojo.java:73) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
    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:84) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
    at org.codehaus.classworlds.Launcher.main(Launcher.java:47) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.gtis.service.StudentService com.gtis.controller.StudentController.studentService; nested exception is java.lang.IllegalArgumentException: Can not set com.gtis.service.StudentService field com.gtis.controller.StudentController.studentService to com.sun.proxy.$Proxy30 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:517) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286) 
    ... 68 more 
Caused by: java.lang.IllegalArgumentException: Can not set com.gtis.service.StudentService field com.gtis.controller.StudentController.studentService to com.sun.proxy.$Proxy30 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) 
    at java.lang.reflect.Field.set(Field.java:741) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:513) 
    ... 70 more 

2016-03-30 11:34:58.126:WARN:/demo:main: unavailable 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'studentController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.gtis.service.StudentService com.gtis.controller.StudentController.studentService; nested exception is java.lang.IllegalArgumentException: Can not set com.gtis.service.StudentService field com.gtis.controller.StudentController.studentService to com.sun.proxy.$Proxy30 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1146) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    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:633) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:602) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:521) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:462) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:595) 
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:385) 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:862) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:300) 
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1341) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1334) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:744) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:497) 
    at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:281) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:154) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
    at * 
+0

您是否在使用像@Transaction这样的代理?或 Panther

+0

@Panther是的,我做到了,我使用StudentService中的Transaction注释和我的application-context.xml中的 Aezio

+0

需要显示堆栈跟踪告诉你到底是什么线和什么是错的 –

回答

0

正如你在评论中提到的那样,你使用的是Transaction注释,<tx:annotation-driven/>标签在你的应用程序上下文中,这意味着你的类实现了代理接口,所以spring实际上创建了一个实现你的接口但不继承的新类对象你的班级学生服务。
因此,自动装配不适用于学生服务。

+0

非常感谢你,我明白了。 :) – Aezio

+0

对不起,我真的想这样做,但似乎我没有足够的声誉,对不起。 – Aezio

0

如果我理解你的话,IStudentService是一个接口。从你得到的错误中,我猜你已经在应用程序上下文中将IStudentService接口注释为Spring bean,但不是具体的类StudentService。所以当Spring试图找到一个自动装配的bean时,它看不到一个StudentService类型的bean。

+0

我相信我们不能在应用程序上下文中注解接口,它需要具体的类。 – Panther

+0

豹,我知道如果你在春天扫描组件,它可以帮助找到组件实现的接口,但我不知道为什么你不能使用接口来定义bean。 – Willcodeforfun

+1

@Willcodeforfun我没有,我只是使用服务注释来声明它 – Aezio

1

Spring正在为你的bean创建一个代理来处理事务,因为你的业务方法有一个@Transactional注解。当你的StudentService类实现一个接口时,Spring会创建一个基于JDK接口的代理,而不是基于CGLIB类的代理。 Spring创建一个实现IStudentService并委托给你的StudentService的新类。Spring现在管理并用于注入的bean不再是继承的StudentService,而是代理,它是IStudentService。如果你真的想注入StudentService,你可以指示Spring使用@EnableTransactionManagement(proxyTargetClass = true)代理类而不是接口

+0

非常感谢你!我试图在xml中将studentService声明为一个bean,并且在同一时间删除StudentController中的Autowired,我发现该bean确实已注入,您的答案解释了为什么它可以工作。原因是Spring代理正确吗? – Aezio

相关问题