【问题标题】:Passing 2 type of class object in spring boot controller在 Spring Boot 控制器中传递 2 类对象
【发布时间】:2022-01-03 04:58:23
【问题描述】:

我必须在我的 Spring Boot Controller 方法中的 RequestBody 中传递 2 种不同类型的苹果类型或橙色类型的对象。

public myResponse myMethod(@ApiParam(value = "myRequest", required = true) @RequestBody Object mulRequest) {

在上面的代码sn-p中,Object类型的mulRequest可以是苹果类或橙类。

我想按照以下逻辑来满足我的要求 -

if (mulRequest instanceof apple) {
// process logic...
} else if (mulRequest instanceof orange) {
// process...
}

但是我坚持如何根据传递的 RequestBody 转换为相关的类对象,因为我不知道为 mulRequest 传递的对象类型是苹果类还是橙色类。 apple 和 orange 类都实现了 Serializable 接口。

感谢任何解决此问题的建议或方法。

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    您正在寻找的是 @JsonTypeInfo 和 @JsonSubTypes Jackson 注释,它们添加了对反序列化多态化的支持。

    为了让 Jackson 了解它应该如何反序列化 JSON 对象,您可能需要在序列化对象时提供一些额外的属性或添加类名 - 这取决于您决定使用的反序列化策略。

    DTO 和控制器的示例实现可能如下所示:

    @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
    @JsonSubTypes({
        @JsonSubTypes.Type(value = Apple.class, name = "apple"),
        @JsonSubTypes.Type(value = Orange.class, name = "orange")
    })
    public abstract class Fruit implements Serializable { // basically you do not need this Serializable at all here
        String someData;
        //... 
        // note that we can but we do not need to define 'type' field!
        // Jackson will handle it if it will appear in JSON
    }
    
    public class Orange extends Fruit {
        //...
    }
    
    public class Apple extends Fruit {
        //...
    }
    

    那么你的 JSON 会是什么样子

    {
        "someData": "test",
        "type": "orange"
    }
    

    您将提供以下控制器

    public myResponse myMethod(@ApiParam(value = "myRequest", required = true) @RequestBody Fruit mulRequest) {
    

    然后可以测试mulRequest是Apple还是Orange。当然你不能在那里使用Object 类,因为你不能用杰克逊注释来注释它,但是也许providing custom deserializer 你可以实现它。但这会很可疑

    请阅读以下文章以更好地理解这一点:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2018-06-24
      • 2017-12-14
      相关资源
      最近更新 更多