【问题标题】:Failed to convert property value of type 'java.lang.String' to required type 'server.model.User' for property 'user'无法将类型“java.lang.String”的属性值转换为属性“user”所需的类型“server.model.User”
【发布时间】:2019-07-11 16:05:44
【问题描述】:

我在这里遇到了一些麻烦。试图为我的用户创建 10 个农场。以下是 Famplot 数据类和用户数据类:

@Entity
@IdClass(FarmPlotPK::class)
data class FarmPlot (

    @Id
    val slotnr: Int? = -1,

    @Id
    @ManyToOne
    @JoinColumn(name = "username", nullable = false)
    var user: User,

    val plantedDate: LocalDate? = null,

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "name")
    var plant: Plant? = null
){}

@Entity
@Table(name="user")
data class User (
    @Id
    val username: String = "",


    @OneToMany(mappedBy = "user")
    val farmPlots: MutableSet<FarmPlot> = HashSet()
)

使用我的控制器,我尝试在 FarmPlotController 中使用此方法创建 10 个农场:

    @PostMapping("/farmPlots/create/{username}")
    fun createNewFarmPlot(@PathVariable(value = "username") username:String) {
        val user:User = userRepository.findById(username).get()
        for (i in 0..9) {
            val farmPlot = FarmPlot(slotnr = i, user = user)
            println(farmPlot.toString())
            // Outprint is FarmPlot(slotnr=0, user=User(username=test2, farmPlots=[]), plantedDate=null, plant=null)
            farmPlotRepository.save(farmPlot)
        }
    }

但是当尝试向用户添加农场时,我收到以下错误消息:

"message": "Failed to convert property value of type 'java.lang.String' to required type 'com.merchantsofrome.server.model.User' for property 'user'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.merchantsofrome.server.model.User' for property 'user': no matching editors or conversion strategy found"

FarmPlotRepository.kt

import com.merchantsofrome.server.model.FarmPlot
import com.merchantsofrome.server.model.IdClass.FarmPlotPK
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository

@Repository
interface FarmPlotRepository : JpaRepository<FarmPlot, FarmPlotPK>

FarmPlotPK.kt

@IdClass(FarmPlotPK::class)
class FarmPlotPK : Serializable {
    var slotnr: Int? = -1
    var user: User? = null

    init{
        this.slotnr=slotnr
        this.user=user
    }

    // The override of equals, see the rules mentioned above for creating a composite primary key
    override fun equals(other: Any?): Boolean {
        if (other is FarmPlotPK) {
            val farmPlotPK = other as FarmPlotPK?
            if (this.user!!.username == farmPlotPK!!.user!!.username && this.slotnr == farmPlotPK.slotnr) {
                return true
            }
        } else {
            return false
        }
        return false
    }

    // The override of hashCode, see the rules mentioned above for creating a composite primary key
    override fun hashCode(): Int {
        return super.hashCode()
    }

}

【问题讨论】:

  • 错误信息很明显需要用户,但您正在发送字符串。
  • Soorapadman:是的,但我不知道在哪里...farmplot.user 是一个用户对象。
  • 你能发布farmPlotRepository.save的实现吗?
  • 是的,已编辑到主帖中:)
  • 可能是因为我没有覆盖 InitBinder?

标签: hibernate spring-boot model-view-controller kotlin spring-data-jpa


【解决方案1】:

使用 User.kt 中的额外构造函数对问题进行了非常简单且可能不太体面的解决方案

constructor(username: String) : this(username=username, salt = "123")

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 2017-05-06
    • 2015-03-29
    • 2013-10-26
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2018-08-21
    相关资源
    最近更新 更多