2017-07-19 234 views
0

我正在尝试使用Spring-boot + Vaadin创建一个Web项目,我想用hibernate的spring-data-jpa从PostgreSQL数据库中获取数据。@Autowired lateinit属性''尚未初始化

在我的Vaadin看来,我尝试自动装配我的服务类,但我总是得到空值,并且eror堆栈跟踪没有告诉我为什么。

kotlin.UninitializedPropertyAccessException: lateinit property clientService has not been initialized at com.apache.vaadin.view.Index.getClientService(Index.kt:24) ~[classes/:na] at com.apache.vaadin.view.Index$readButton$1.buttonClick(Index.kt:40) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131] at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) ~[vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:211) ~[vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:174) ~[vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1029) ~[vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.ui.Button.fireClick(Button.java:370) ~[vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.ui.Button$1.click(Button.java:57) ~[vaadin-server-8.0.6.jar:8.0.6] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:155) ~[vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:116) ~[vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:445) [vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:410) [vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274) [vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) [vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) [vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1464) [vaadin-server-8.0.6.jar:8.0.6] at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:381) [vaadin-server-8.0.6.jar:8.0.6] at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.15.jar:8.5.15] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.15.jar:8.5.15] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.15.jar:8.5.15] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.15.jar:8.5.15] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]

我的数据库配置:

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = arrayOf("com.apache.vaadin.model")) 
@ComponentScan(basePackages = arrayOf("com.apache.vaadin.model")) 
open class DataSourceConfig { 
    @Autowired 
    lateinit var environment: Environment 

    @Bean 
    open fun entityManagerFactory(): LocalContainerEntityManagerFactoryBean { 
     var entityManagerFactory: LocalContainerEntityManagerFactoryBean = LocalContainerEntityManagerFactoryBean() 

     entityManagerFactory.apply { 
      dataSource = dataSource() 
      setPackagesToScan("com.apache.vaadin.model") 

      var vendorAdapter: HibernateJpaVendorAdapter = HibernateJpaVendorAdapter() 

      vendorAdapter.apply { 
       setGenerateDdl(true) 
       setShowSql(true) 
      } 

      var properties: Properties = Properties() 

      properties.apply { 
       put("database.dialet", "org.hibernate.dialect.PostgreSQL95Dialect") 
       put("database.globally_quoted_identifiers", "false") 
       put("database.enable_lazy_load_no_trans", "true") 
       put("database.show_sql", "true") 
      } 

      jpaVendorAdapter = vendorAdapter 
      setJpaProperties(properties) 
     } 

     return entityManagerFactory 
    } 

    @Primary 
    @Bean 
    open fun dataSource(): DataSource { 
     var source: ComboPooledDataSource = ComboPooledDataSource() 

     source.apply { 
      driverClass = "org.postgresql.Driver" 
      jdbcUrl = "jdbc:postgresql://localhost:5432/ignite" 
      user = "postgres" 
      password = "1111" 
      acquireIncrement = 5 
      idleConnectionTestPeriod = 60 
      maxPoolSize = 20 
      minPoolSize = 10 
      initialPoolSize = 10 
     } 

     return source 
    } 

    @Bean 
    open fun transactionManager() : PlatformTransactionManager { 
     var manager: JpaTransactionManager = JpaTransactionManager() 

     manager.apply { 
      entityManagerFactory = entityManagerFactory().nativeEntityManagerFactory 
     } 

     return manager 
    } 

    @Bean 
    open fun exceptionTranslator(): PersistenceExceptionTranslationPostProcessor = PersistenceExceptionTranslationPostProcessor() 
} 

查看和UI:

@SpringUI 
@Title(value = "Apache") 
class Navigator : UI() { 
    @Autowired 
    lateinit var viewProvider: SpringViewProvider 

    init { 
    } 

    private val INDEX = "" 

    override fun init(p0: VaadinRequest?) { 
     navigator = Navigator(this, this) 
     navigator.addProvider(viewProvider) 
     navigator.addView(INDEX, Index::class.java) 
    } 
} 

@UIScope 
@SpringView 
open class Index : VerticalLayout(), View { 
    private val logger: Logger = Logger.getLogger(Index::class.java) 

    @Autowired 
    lateinit var clientService: IClientService // <--- error is here 

    init { 
     var menuBar: MenuBar = MenuBar() 
     var file = menuBar.addItem("File", null, null) 
     file.addItem("Save", {_ -> logger.info("Save clicked")}) 
     file.addItem("Load", {_ -> logger.info("Load clicked")}) 
     file.addItem("Open", {_ -> logger.info("Open clicked")}) 
     file.addItem("Close", {_ -> logger.info("Close clicked")}) 

     var settings = menuBar.addItem("Settings", null, null) 
     settings.addItem("DataBase", {_ -> logger.info("DataBase clicked")}) 

     addComponent(menuBar) 

     var createButton: Button = Button("Create", { _ -> logger.info("Create clicked")}) 
     var readButton: Button = Button("Read", { _ -> logger.info(clientService.findAll())}) 
     var updateButton: Button = Button("Update", { _ -> logger.info("Update clicked")}) 
     var deleteButton: Button = Button("Delete", { _ -> logger.info("Delete clicked")}) 

     addComponent(createButton) 
     addComponent(readButton) 
     addComponent(updateButton) 
     addComponent(deleteButton) 
    } 

    override fun enter(p0: ViewChangeListener.ViewChangeEvent?) { 
     Notification.show("Welcome to the main com.ignite.app.view") 
    } 
} 

的pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.apache.vaadin</groupId> 
    <artifactId>ignite</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>ignite</name> 
    <description></description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.4.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
     <vaadin.version>8.0.6</vaadin.version> 
     <kotlin.version>1.1.3-2</kotlin.version> 
     <hibernate>5.2.9.Final</hibernate> 
     <hibernate-validator>5.4.1.Final</hibernate-validator> 
     <postgres>42.1.1</postgres> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>com.vaadin</groupId> 
      <artifactId>vaadin-spring-boot-starter</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.jetbrains.kotlin</groupId> 
      <artifactId>kotlin-stdlib-jre8</artifactId> 
      <version>${kotlin.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.jetbrains.kotlin</groupId> 
      <artifactId>kotlin-test</artifactId> 
      <version>${kotlin.version}</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-ehcache</artifactId> 
      <version>${hibernate}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-c3p0</artifactId> 
      <version>${hibernate}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>${hibernate-validator}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>${postgres}</version> 
     </dependency> 
    </dependencies> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>com.vaadin</groupId> 
       <artifactId>vaadin-bom</artifactId> 
       <version>${vaadin.version}</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
      <plugin> 
       <groupId>org.jetbrains.kotlin</groupId> 
       <artifactId>kotlin-maven-plugin</artifactId> 
       <version>${kotlin.version}</version> 
       <executions> 
        <execution> 
         <id>compile</id> 
         <phase>compile</phase> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>test-compile</id> 
         <phase>test-compile</phase> 
         <goals> 
          <goal>test-compile</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <jvmTarget>1.8</jvmTarget> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>compile</id> 
         <phase>compile</phase> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>testCompile</id> 
         <phase>test-compile</phase> 
         <goals> 
          <goal>testCompile</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

我的服务:

@NoRepositoryBean 
interface IClientService : CrudRepository<Client, Long> 
@Service 
class ClientService : IClientService { 
    private val logger: Logger = Logger.getLogger(ClientService::class.java) 

    @Autowired 
    lateinit var clientRepository: ClientRepository 

    override fun delete(p0: Long?) { 
     clientRepository.delete(p0) 
    } 

    override fun delete(p0: MutableIterable<Client>?) { 
     clientRepository.delete(p0) 
    } 

    override fun delete(p0: Client?) { 
     clientRepository.delete(p0) 
    } 

    override fun <S : Client?> save(p0: MutableIterable<S>?): MutableIterable<S> = clientRepository.save(p0) 

    override fun <S : Client?> save(p0: S): S = clientRepository.save(p0) 

    override fun findAll(p0: MutableIterable<Long>?): MutableIterable<Client> = clientRepository.findAll(p0) 

    override fun findAll(): MutableIterable<Client> = clientRepository.findAll() 

    override fun exists(p0: Long?): Boolean = clientRepository.exists(p0) 

    override fun findOne(p0: Long?): Client = clientRepository.findOne(p0) 

    override fun count(): Long = clientRepository.count() 

    override fun deleteAll() { 
     clientRepository.deleteAll() 
    } 
} 

和资源库:

@Repository 
interface ClientRepository : CrudRepository<Client, Long> 

项目编译正常,但是当我试图从我的数据库中的数据,我得到这个错误。我也尝试手动创建连接和查询,当我这样做时,我没有得到任何错误。可能是数据源配置中的错误,但我没有看到它。

谢谢您的帮助!

修订 解决方案:

@SpringUI 
@Title(value = "Apache") 
class Navigator : UI() { 
    @Autowired 
    lateinit var viewProvider: SpringViewProvider 

    @Autowired 
    lateinit var index: Index// <- 

    private val INDEX = "index" 

    override fun init(p0: VaadinRequest?) { 
     navigator = Navigator(this, this) 
     navigator.addProvider(viewProvider) 
     navigator.addView(INDEX, index) // <- 
    } 
} 

@UIScope 
@SpringView 
@SpringComponent // <- 
open class Index : VerticalLayout(), View {...} 

回答

4

这是因为您尝试访问clientServiceinit块,你不应该这样做,出现春季依赖注入对象已经准备好创建。例如:

@Autowired 
lateinit var clientService: IClientService 

init{ 
    // v--- `clientService` is not injected by spring yet. 
    clientService; 
} 

在另一方面,你应该实现InitializingBean为春季组件初始化,例如:

open class Index : VerticalLayout(), View, InitializingBean { 

    @Autowired 
    lateinit var clientService: IClientService 

    override fun afterPropertiesSet(){ 
     //copy your init block code here 
    } 
} 
+0

我试图用这样的:'公开课指数:VerticalLayout的(),查看,{的InitializingBean @Autowired lateinit VAR clientService:IClientService 控乐趣的afterPropertiesSet(){// 这里复制您的初始块码 } }'但我仍然得到相同的错误。我也尝试通过构造函数注入来注入我的服务。最后,我试图在我的Index.view中调用clientService.findAll,但又一次我得到相同的错误:'kotlin.UninitializedPropertyAccessException:lateinit属性clientService尚未初始化' –

+0

@NickRyan嗨,有你的vaadin查看由spring管理? –

+1

@NickRyan请看这里:https://vaadin.com/docs/-/part/framework/advanced/advanced-spring.html –

相关问题