Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring引导中的多态@RequestBody_Spring Boot_Spring Mvc - Fatal编程技术网

Spring boot Spring引导中的多态@RequestBody

Spring boot Spring引导中的多态@RequestBody,spring-boot,spring-mvc,Spring Boot,Spring Mvc,问题很简单。我有几个事件来自同一个接口,我想将它们反序列化到它们的propper超类 我知道如何使用对象映射器实现这一点,但使用我自己的映射器意味着让Spring Boot将@RequestBody解析为字符串,然后自己完成,这并不是世界末日,但我不禁怀疑Spring提供了适当的工具来处理这种情况。问题是,我好像找不到他们 下面是一些示例代码: 示例事件: interface YellowOpsEvent { val user: String val partner: Strin

问题很简单。我有几个事件来自同一个接口,我想将它们反序列化到它们的propper超类

我知道如何使用对象映射器实现这一点,但使用我自己的映射器意味着让Spring Boot将@RequestBody解析为字符串,然后自己完成,这并不是世界末日,但我不禁怀疑Spring提供了适当的工具来处理这种情况。问题是,我好像找不到他们

下面是一些示例代码:

示例事件:

interface YellowOpsEvent {
    val user: String
    val partner: String
    val subject: String
    val change: NatureOfChange
}

data class StatusChangedEvent(override val user: String,
                              override val partner: String,
                              override val subject: String,
                              val before: String,
                              val after: String): YellowOpsEvent {
    override val change = NatureOfChange.Changed
}
控制器:

@PostMapping("/event")
    fun writeEvent(@RequestBody event: YellowOpsEvent) {  // < I expect this not to throw an exception
        val bugme = event is StatusChangedEvent // < I expect this to return true if I send the proper event data.
    }
@PostMapping(/event)
fun writeEvent(@RequestBody event:YellowOpsEvent){/<我希望这不会引发异常
val bugme=event is StatusChangedEvent/<如果发送正确的事件数据,我希望返回true。
}

我只是想澄清一下,我完全理解为什么这不能开箱即用。问题是,我无法找到我需要做什么才能使它工作。

pL4Gu33评论中的链接将我引向了正确的方向,但它需要额外的搜索和修改,从这里和那里收集信息,才能得出最终可行的解决方案,因此为了完整性,我在这里对其进行总结

问题在于,您需要两个注释,一个在接口上,一个在实现类上,它们的组合使用似乎有点缺乏文档。 首先,在接口上添加此注释。与您将看到的一些教程相反,不需要对界面进行进一步的注释:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
interface YellowOpsEvent {
    val user: String
    val partner: String
    val subject: String
    val change: NatureOfChange
}
根据一些文档,仅此一项就足以支持propper反序列化。但是,spring引导控制器将引发异常,因为传递的根名称与其预期的类不匹配

// the above will throw an exception when the serialization product is sent to this controller:

    @PostMapping("/event")
        fun writeEvent(@RequestBody event: YellowOpsEvent) {  // < I expect this not to throw an exception
            val bugme = event is StatusChangedEvent // < I expect this to return true if I send the proper event data.
        }

现在它工作了!:)

pL4Gu33评论中的链接将我引向了正确的方向,但它需要额外的搜索和修改,从这里和那里收集信息,才能找到最终可行的解决方案,因此为了完整性,我在这里对其进行总结

问题在于,您需要两个注释,一个在接口上,一个在实现类上,它们的组合使用似乎有点缺乏文档。 首先,在接口上添加此注释。与您将看到的一些教程相反,不需要对界面进行进一步的注释:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
interface YellowOpsEvent {
    val user: String
    val partner: String
    val subject: String
    val change: NatureOfChange
}
根据一些文档,仅此一项就足以支持propper反序列化。但是,spring引导控制器将引发异常,因为传递的根名称与其预期的类不匹配

// the above will throw an exception when the serialization product is sent to this controller:

    @PostMapping("/event")
        fun writeEvent(@RequestBody event: YellowOpsEvent) {  // < I expect this not to throw an exception
            val bugme = event is StatusChangedEvent // < I expect this to return true if I send the proper event data.
        }

现在它工作了!:)

我不确定它是否真的能帮助你,但看看这个答案,尤其是第二个。我不确定它是否真的能帮助你,但看看这个答案,尤其是第二个。aa这时您才意识到使用wrap root值会破坏招摇过市的用户界面。回到原点…aa这时您才意识到使用换行根值会破坏招摇过市的用户界面。回到原点。。。