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

@Spring Boot应用程序中通过Swagger生成的Java模型MongoDb中集合名称的文档注释

孔俊爽
2023-03-14

我正在遵循的步骤

>

  • 我为我的微服务编写API合同和定义模型的Swager文件

    现在,我在Spring Boot应用程序中使用Swagger代码生成依赖项,通过从URL读取Swagger来生成模型,该URL位于我的应用程序“mvn安装”的目标(pom.xml中提到的输出目录)目录中。

    对于 Swagger 文件中的每个定义,将在应用程序的目标目录中生成一个模型类。

    现在我使用mongoDB作为模型的数据库,以保存为集合。

    需要为模型类动态提供@Document(值 = “集合名称”) - 动态。

    由于模型类是通过Swagger生成,codegen不能编辑它们,

    那么如何维护我想保存在数据库中的定义的动态名称有什么方法可以通过 Swagger 合约来定义它吗?

  • 共有1个答案

    徐柏
    2023-03-14

    不久前,我还在为同样的问题而苦苦挣扎,一些解决方案包括对生成的文件进行后处理。

    然而,出于安全考虑,将MongoDB模型暴露于API可能并不完全正确。一个有趣的方法是简单地使用映射器并将DTO概念应用于自动生成的模型类。

    例如:

    假设您在MongoDB中有一个用户集合,并有一个API来检索用户。

    components:
      schemas:
        User:
          type: object
          properties:
            id:
              type: string
            name:
              type: string
    

    Swagger自动生成的类是这样的:

    package api;
    
    @ApiModel()
    @Validated
    public class User   {
      @JsonProperty("id")
      private String id = null;
    
      @JsonProperty("name")
      private String name = null;
    }
    

    您还将拥有“标准”用户模型类:

    package model;
    
    @Document(collection = "users")
    public class User {
        @Id
        private String id;
        @NotNull
        private String name;
        @NotNull
        private String password;
    }
    

    例如,请注意,密码字段不包含在 API 定义中。

    然后我们将拥有典型的用户存储库:

    public interface UserRepository extends MongoRepository<User, String> { }
    

    现在我们必须实现映射器,使用 MapStruct 非常简单:

    @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
    public interface UserMapper {
        api.User map(model.User user);
    }
    

    您可以广泛定制映射信息的内容和方式。

    唯一剩下的就是控制器:

    @Controller
    public class MyController implements MyApi {
    
        @Inject
        UserMapper mapper;
    
        @Autowired
        private UserRepository repository;
    
        @GetMapping("/api/v1.0/users")
        public ResponseEntity<List<api.User>> getAllUsers() {
            List<api.User> users = new ArrayList<>();
            repository.findAll().forEach(user -> users.add(mapper.map(user)));
            return new ResponseEntity(users, HttpStatus.OK);
    }
    
     类似资料:
    • 我希望文档的显示方式类似于它在特定于应用程序的上下文路径下的文档中提到的方式。你能告诉我我错过了什么吗?

    • 有人能给我举个例子,说明如何使用PHPs新驱动程序计算MongoDB集合中的文档数吗(http://php.net/manual/en/set.mongodb.php) 所有示例似乎都在使用旧的驱动程序或库!

    • 本文向大家介绍SpringBoot+Swagger-ui自动生成API文档,包括了SpringBoot+Swagger-ui自动生成API文档的使用技巧和注意事项,需要的朋友参考一下 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染、先后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远。 这样后段开发好了api 之后就要提交api 文档给前端的朋友。给前端的a

    • 本文向大家介绍SpringBoot整合Swagger3生成接口文档过程解析,包括了SpringBoot整合Swagger3生成接口文档过程解析的使用技巧和注意事项,需要的朋友参考一下   前后端分离的项目,接口文档的存在十分重要。与手动编写接口文档不同,swagger是一个自动生成接口文档的工具,在需求不断变更的环境下,手动编写文档的效率实在太低。与新版的swagger3相比swagger2配置更

    • 在更新这个庞大的集合时,下面的迁移代码似乎被卡住了。 应用程序日志的最后几行表示已调用更改集,但随后的更改集未被调用。 2021-05-11 08:00:29.385INFO[product-service,,] 1 --- [ main]c.a.a.mongock.changelog.迁移:将租户添加到产品 2021-05-11 08:00:29.576信息[产品服务,,,]1---[br>ma

    • 我在Tomcat中删除了war文件。 并访问http://localhost:8080/camel-example-servlet-rest-tomcat/api-docs,我得到了这个... {“apiVersion”:“1.2.3”,“swaggerVersion”:“1.2”,“api”:[{“path”:“/User”,“description”:“User rest service”}]