我正在尝试使用kotlin语言构建并运行spring-boot应用程序。我研究了一些类似的问题,但无法构建我的应用程序。错误输出:com.github.raketa92.mailservice.service.EmailService中构造函数的参数0需要一个类型为"com.github.reketa92.mailservices.restore.MailRepository"的bean,但找不到该bean。考虑在您的配置中定义一个类型为"com.github.raketa92.mailservice.repository.MailRepository"的bean。我找到了github存储库,在那里可以成功地构建和运行这种代码。
这是我的存储库文件:
interface MailRepository : CoroutineCrudRepository<Email, Long>{
@Query("SELECT * FROM email WHERE messageId = :messageId")
suspend fun getEmailByMessageId(messageId: Int): Email?
@Query("UPDATE email set statusId = :statusId where id = :id")
suspend fun updateStatus(statusId: Int, id: Long): Email
}
这是我的服务文件:
package com.github.raketa92.mailservice.service
import com.github.raketa92.mailservice.model.Email
import com.github.raketa92.mailservice.repository.MailRepository
import kotlinx.coroutines.flow.Flow
import org.springframework.mail.SimpleMailMessage
import org.springframework.mail.javamail.JavaMailSender
import org.springframework.stereotype.Service
@Service
class EmailService(
private val mailRepository: MailRepository,
private val javaMailSender: JavaMailSender
)
{
fun sendMail(email: Email) {
val message = SimpleMailMessage()
message.setSubject(email.subject)
message.setText(email.message!!)
message.setTo(email.to)
message.setFrom("test@mail.com")
javaMailSender.send(message)
println("email sent")
}
suspend fun getAllEmails(): Flow<Email> = mailRepository.findAll()
suspend fun getEmailById(id: Long): Email? = mailRepository.findById(id)
suspend fun getEmailByMessageId(messageId: Int): Email? = mailRepository.getEmailByMessageId(messageId)
suspend fun createEmail(email: Email): Email = mailRepository.save(email)
suspend fun updateStatus(statusId: Int, id: Long): Email = mailRepository.updateStatus(statusId, id)
}
您的EmailService
是Spring@Service
,因此Spring将在启动时创建它的实例。
但是它的构造函数需要一个MailRepository
实例。而且您还没有告诉它从哪里获取,所以它会抛出您看到的运行时错误。
告诉Spring存储库接口的常用方法是将其注释为@Repository
;然后Spring知道创建一个(实现该接口的合成子类的(实例。