不是托管类型:类

时间:2019-08-29 17:15:58

标签: spring-boot kotlin

我尝试将Java应用程序重构为Kotlin,它是用Spring Boot编写的。 我将所有文件都转移到了新项目中,但是当我运行该应用程序时,总是会收到此错误:不是托管类型:com.contactlist.contactlistapp.model.User

我尝试(我认为)在这里找到的所有答案,但没有一个可以解决问题。

错误消息

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'restApiController': Unsatisfied dependency expressed through field 'userService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.contactlist.contactlistapp.model.User

ContactListAppApplication

@Import(JpaConfiguration::class)
@SpringBootApplication(scanBasePackages = ["com.contactlist.contactlistapp"])
class ContactListAppApplication

fun main(args: Array<String>)
{
    SpringApplication.run(ContactListAppApplication::class.java, *args)
}

用户

@Entity
@Table(name = "APP_USER")
class User(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long? = null,

    @NotEmpty
    @Column(name = "NAME", nullable = false)
    var name: String,

    @Column(name = "AGE", nullable = false)
    var age: Int? = null,

    @Column(name = "SALARY", nullable = false)
    var salary: Double?
): Serializable

UserRepository

@Repository
interface UserRepository: JpaRepository<User, Long>
{
    fun findByName(name: String): User
}

JpaConfiguration

@Configuration
@EnableJpaRepositories(basePackages =         ["com.contactlist.contactlistapp.repositories"],
    entityManagerFactoryRef = "entityManagerFactory",
    transactionManagerRef = "transactionManager")
@EnableTransactionManagement
class JpaConfiguration
{
@Autowired
private lateinit var environment: Environment

@Value("\${datasource.sampleapp.maxPoolSize:10}")
private val maxPoolSize: Int = 0

/*
 * Populate SpringBoot DataSourceProperties object directly from application.yml
 * based on prefix. Thanks to .yml, Hierarchical data is mapped out of the box with matching-name
 * properties of DataSourceProperties object].
 */
@Bean
@Primary
@ConfigurationProperties(prefix = "datasource.sampleapp")
fun dataSourceProperties(): DataSourceProperties
{
    return DataSourceProperties()
}

/*
 * Configure HikariCP pooled DataSource.
 */
@Bean
fun dataSource(): DataSource
{
    val dataSourceProperties = dataSourceProperties()
    val dataSource = DataSourceBuilder
            .create(dataSourceProperties.classLoader)
            .driverClassName(dataSourceProperties.driverClassName)
            .url(dataSourceProperties.url)
            .username(dataSourceProperties.username)
            .password(dataSourceProperties.password)
            .type(HikariDataSource::class.java)
            .build() as HikariDataSource
    dataSource.maximumPoolSize = maxPoolSize
    return dataSource
}

/*
 * Entity Manager Factory setup.
 */
@Bean
@Throws(NamingException::class)
fun entityManagerFactory(): LocalContainerEntityManagerFactoryBean
{
    val factoryBean = LocalContainerEntityManagerFactoryBean()
    factoryBean.dataSource = dataSource()
    factoryBean.setPackagesToScan(*arrayOf("com.websystique.springboot.model"))
    factoryBean.jpaVendorAdapter = jpaVendorAdapter()
    factoryBean.setJpaProperties(jpaProperties())
    return factoryBean
}

/*
 * Provider specific adapter.
 */
@Bean
fun jpaVendorAdapter(): JpaVendorAdapter
{
    return HibernateJpaVendorAdapter()
}

/*
 * Here you can specify any provider specific properties.
 */
private fun jpaProperties(): Properties
{
    val properties = Properties()
    properties["hibernate.dialect"] = environment.getRequiredProperty("datasource.sampleapp.hibernate.dialect")
    properties["hibernate.hbm2ddl.auto"] = environment.getRequiredProperty("datasource.sampleapp.hibernate.hbm2ddl.method")
    properties["hibernate.show_sql"] = environment.getRequiredProperty("datasource.sampleapp.hibernate.show_sql")
    properties["hibernate.format_sql"] = environment.getRequiredProperty("datasource.sampleapp.hibernate.format_sql")
    if (StringUtils.isNotEmpty(environment.getRequiredProperty("datasource.sampleapp.defaultSchema"))) {
        properties["hibernate.default_schema"] = environment.getRequiredProperty("datasource.sampleapp.defaultSchema")
    }
    return properties
}

@Bean
@Autowired
fun transactionManager(emf: EntityManagerFactory): PlatformTransactionManager
{
    val txManager = JpaTransactionManager()
    txManager.entityManagerFactory = emf
    return txManager
}
}

UserServiceImpl

@Service("userService")
@Transactional
class UserServiceImpl: UserService
{
@Autowired
private val userRepository: UserRepository? = null

override fun findById(id: Long?): User
{
    return userRepository!!.findOne(id!!)
}

override fun findByName(name: String): User
{
    return userRepository!!.findByName(name)
}

override fun saveUser(user: User)
{
    userRepository!!.save(user)
}

override fun updateUser(user: User)
{
    saveUser(user)
}

override fun deleteUserById(id: Long?)
{
    userRepository?.delete(id!!)
}

override fun deleteAllUsers()
{
    userRepository!!.deleteAll()
}

override fun findAllUsers(): List<User>
{
    return userRepository!!.findAll()
}

override fun isUserExist(user: User): Boolean
{
    return findByName(user.name!!) != null
}
}

com
    +- contactlist
      +- contactlistapp
          +- ContactListAppApplication.kt
          |
          +- configuration
          |   +- JpaConfiguration.kt
          |
          +- controller
          |   +- AppController.kt
          |   +- RestApiController.kt
          |
          +- model
          |   +- User.kt
          |
          +- repositories
          |   +- UserRepository.kt
          |
          +- service
          |   +- UserService.kt
          |   +- UserServiceImpl.kt
          |
          +- util
          |   +- CustomErrorType.kt

0 个答案:

没有答案