当前位置: 首页 > 知识库问答 >
问题:

在spring boot控制器中传递2类类对象

冯霖
2023-03-14

我必须传递2种不同类型的对象的类型苹果或类型橙色在我的Spring Boot控制器方法中的请求身体。

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

在上面的代码片段中,Object类型的Mul请求可以是类苹果或类橙色。

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

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

但是我坚持如何根据传递的 RequestBody 强制转换为相关的类对象,因为我不知道为 mulRequest 传递了什么类型的对象,可以是苹果类或橙色类。Apple 和 orange 类都实现了可序列化接口。

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

共有1个答案

夏骏
2023-03-14

您正在寻找的是@JsonTypeInfo@JsonSubTypeJackson注释,它们正在添加对反序列化的Polymorphizm的支持。

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

DTO和Controller的示例实现可能如下:

@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) {

然后可以测试Mul请求Apple还是奥兰治。当然你不能使用那里的Object类,因为你不能用Jackson注释来注释它,但是也许提供自定义反序列化器你就可以实现它。但是这会非常非常可疑

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

  • Jackson基于类型反序列化
  • @JsonTypeInfo和@JsonSubType在jackson中用于什么
  • https://octoperf.com/blog/2018/02/01/polymorphism-with-jackson/
 类似资料:
  • 下面是我的实际控制人课: 我得到了一个例外:

  • 嗨,我正在构建JavaFX项目,我正在使用JavaFX Scene Builder2。我想将我的控制器链接到我的fxml文件,但是我看不到在Scene Builder2中添加控制器到我的fxml文件的可能性。我在想是否有人能帮我一下。谢谢你。

  • 我继续并在内部的方法中执行一些逻辑。 我尝试在url中传递object,重定向到另一个页面,并显示关于person的信息,但面对的是。

  • 控制器类 mininet.node.Controller 控制器基类。默认的控制器是一个参考的实现,controller。 表示一个控制器节点。包括 IP 地址、端口等。 主要方法包括启动和停止一个控制器。 init def __init__( self, name, inNamespace=False, command='controller', cargs=

  • 我正试图从数据库中删除一个条目。这是我的控制器方法: 这是我的.cshtml: 正如您所看到的,对象不会被传递,并且总是有初始值,因此我得到了一个转储。我的错在哪里? 谢谢.

  • 问题内容: 大家好,我正在构建一个JavaFX项目并正在使用JavaFX Scene Builder2。我想将控制器链接到我的fxml文件,但是我看不到在Scene Builder 2中将控制器添加到我的fxml文件的可能性。我想知道是否有人可以帮助我。谢谢。 问题答案: 我偶然在SceneBuilder 2中找到了控制器属性。关闭左侧的层次结构菜单时,将显示“控制器”菜单,可以在其中声明我的控制