我尝试将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