2016-05-30 60 views
0

我有一個彈簧mvc項目。我有一個控制器定義如下:彈簧控制器參考服務使用配置文件

public class HelloController { 

    private HelloService helloService; 

    @RequestMapping("/hello") 
    public void sayHello() { 
     helloService.sayHello(); 
    } 
} 

我的服務如下:

public class HelloServiceImpl implements HelloService { 

public void sayHello() { 
    System.out.println("Hello Spring !"); 
} 
} 

的界面如下:

public interface HelloService { 

void sayHello(); 
} 

和我的配置文件如下:

<mvc:annotation-driven/> 
<context:component-scan base-package="com.pack"/> 

<bean id="HelloController" class="com.pack.controllers.HelloController"> 
    <property name="helloService" ref="HelloService"></property> 
</bean> 
<bean id="HelloService" class="com.pack.services.HelloServiceImpl"/> 

I ca n使用註釋controllerserviceautowire使用註釋@autowired的服務工作正常。 我正在嘗試使用配置文件實現相同。有沒有辦法做到這一點?

我得到以下異常,同時運行它:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'HelloController' defined in ServletContext resource [/WEB-INF/config/servlet-config.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'helloService' of bean class [adams.invincible.controllers.HelloController]: Bean property 'helloService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1423) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1128) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628) 
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 
root cause 

org.springframework.beans.NotWritablePropertyException: Invalid property 'helloService' of bean class [adams.invincible.controllers.HelloController]: Bean property 'helloService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 
    org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1042) 
    org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:902) 
    org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:75) 
    org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:57) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1420) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1128) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628) 
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 
+0

把'@ Autowired'一個字段是一種不好的做法。現在你已經體驗了爲什麼它不好。 – zeroflagL

回答

1

可以實現它通過注射HelloService中提供的setter方法後添加@Autowired註解如下圖所示
// setter注入

public void setHelloService(HelloService helloService) { 
    this.helloService = helloService; 
    } 

或者你可以如下圖所示
//構造方法注入通過提供用於注射使用構造器注入HelloService的構造實現它

public HelloController (HelloService helloService) { 
    this.helloService = helloService; 
} 

//改變配置文件

<bean id="HelloController" class="com.pack.controllers.HelloController"> 
    <constructor-arg ref="HelloService"/> 

0

的錯誤是說你需要生成的取得和豆HelloService的設置。

Bean屬性'helloService'不可寫或具有無效的setter方法。請問參數類型二傳手的配合吸氣

的返回類型但如果你試圖注入豆,甚至手工製作的配置,你需要把註釋@Autowire

@Autowire 
private HelloService helloService; 
+0

如果您有XML配置,則添加'@ Autowired'毫無意義。 – zeroflagL

1

添加HelloController類中的helloservice的setter和getter會照顧它。應該是需要做的是

+0

添加吸氣劑有什麼意義? – zeroflagL