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

如何在rest API的不同模块中使用相同的模型类

姚晋
2023-03-14

{“query”:“”,“variables”:{“input”:{“name”:“”}}}

3.{“query”:“”,“variables”:{“search”:“”}}

我不想在我的API中传递所有的参数作为请求体,有些只有查询、变量、输入有些只有查询和变量,就像上面的json数据,我想创建相同的模型,可以在其余的API中使用。目前,我已经为每个API创建了不同的模型。

公共类CreatetRequest{

private String query;
private Variables variables;

}

public class Variables {

    private Input input;
}
public class Input {

    private String name;
    private String description;
    private String gitUrl;
    private String repoName;
}

这里我在所有API中复制了我的模型,所以我想创建三个模型类,其中包含所有必需的变量,这些变量在我的引导应用程序中都是常见的,但同时我必须避免在rest API的request Body..中发送所有数据。

在spring应用程序中,避免这种锅炉板代码的最佳方法是什么

共有1个答案

胡永逸
2023-03-14

使用带有@JsonDeserialize注释的接口

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonDeserialize(using = InputDeserializer.class)
public interface InputInterface {

}

实现此接口的输入对象类型1

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonDeserialize(as = Type1.class)
public class Type1 implements InputInterface {

    private String name;
    private String description;
    private String gitUrl;
    private String repoName;

    // setters, getters, constructor
}

实现此接口的输入对象类型2

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonDeserialize(as = Type2.class)
public class Type2 implements InputInterface{

    String name;

    // setters, getters, constructor
}

在这里,为了简化,我们只使用了两种类型。

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class InputDeserializer extends JsonDeserializer<InputInterface> {

       @Override
        public InputInterface deserialize(JsonParser jp, DeserializationContext context) throws IOException {
            ObjectMapper mapper = (ObjectMapper) jp.getCodec();
            ObjectNode root = mapper.readTree(jp);

            /* 
                  Write your conditions here 
                  to check what type of input is

             */
            if (root.has("name") && root.has("description")) {
                return mapper.readValue(root.toString(), Type1.class);
            } else {
                return mapper.readValue(root.toString(), Type2.class);
            }

        }

}

使用控制器中的接口

@PostMapping()
public void save(@RequestBody InputInterface input) throws Exception {
    // save the customer using service
    System.out.println(input);

}

这只是为了说明它是如何工作的,让它适应你的需要:-)

 类似资料:
  • 我正在使用XML构建调查。调查中的一个(矩阵)问题,具有列和行,如下所示: 我想使用不同的XSLT模板,这取决于 节点。因此,尽管所有问题都是以相同的方式构建的,但它们看起来可能不同。我想用不同的。每个问题类型的XSLT文件,定义问题、列和行的外观。 如果我使用以下代码包括“模块/模板”: 该模板包含问题、行和列的格式定义。如果同一页面上有不同类型的问题,会不会出现干扰,因为定义每种类型的问题、行

  • 假设我有一个表'some-table',我想在多个模式中创建它。名为“create-some-table.yaml”的文件 最后一个是changelog-master,它非常简单 有什么办法我可以做类似这样的事情吗,谢谢:)

  • 我们已经讲到了如何使用模块名称作为调用的一部分,来调用模块中的函数,如示例 7-7 中所示的 nested_modules 函数调用。 文件名: src/main.rs 示例 7-7:通过完全指定模块中的路径来调用函数 如你所见,指定函数的完全限定名称可能会非常冗长。所幸 Rust 有一个关键字使得这些调用显得更简洁。 Rust 的 use 关键字能将你想要调用的函数所在的模块引入到当前作用域中,

  • 我在多模块项目中工作。目前我面临以下问题: > 模块A 模块B 模块A依赖于B 模块A有以下方法@GetMapping(path=“/GetWorkspace”) } 模块B有以下方法,我需要使用模块A提到的endpoint 公共字符串consumeModuelAMethod(){ 当我从模块A通过RestTemboard调用“http://localhost:8080/getworkspaces

  • 我有两个外部模型相同的API,所以我为外部模型(ResponseModel)和结果键创建了一个模型类,我为结果键创建了一个名为ResultModel的类,所以我可能能够编写结果键上可能出现的所有响应 在这里,我添加了ResultModel结果键中可能的响应,将给出国家列表或州列表 CountryList API 1结果 状态列表API 2结果 我遵循这个结构来重用外部模型。但它不起作用 不管怎样,