Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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
Java 使用Swagger将创建的日期时间添加到restapi_Java_Spring Boot_Swagger_Springfox - Fatal编程技术网

Java 使用Swagger将创建的日期时间添加到restapi

Java 使用Swagger将创建的日期时间添加到restapi,java,spring-boot,swagger,springfox,Java,Spring Boot,Swagger,Springfox,我有几个API,并使用springfox-swagger编写API文档。 我需要将创建日期添加到相应的API中。如何使用swagger实现这一点。我不需要任何API版本控制 例: @ApiOperation(value=“创建新用户并返回创建的用户。”) @后期映射(/user) public ResponseEntity createUser(@RequestBody UserDto UserDto){ User=userService.create(userDto); 返回新的响应属性(Us

我有几个API,并使用
springfox-swagger
编写API文档。 我需要将创建日期添加到相应的API中。如何使用
swagger
实现这一点。我不需要任何API版本控制

例:

@ApiOperation(value=“创建新用户并返回创建的用户。”)
@后期映射(/user)
public ResponseEntity createUser(@RequestBody UserDto UserDto){
User=userService.create(userDto);
返回新的响应属性(UserMappers.USER\u ENTITY\u TO\u DTO.apply(USER),HttpStatus.CREATED);
}

在上面的示例中,我想添加
/user
的创建日期,以便跟踪创建日期。

在我的项目中,我有类似的要求。作为解决方案,我创建了一个自定义注释(用于标记端点)并编写了一个插件(用于更新API描述)

选项#1

  • @ApiSince
    注释:

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ApiSince {
        String value() default "";
    }
    
  • ApiSincePlugin
    插件:

    @Component
    public class ApiSincePlugin implements OperationBuilderPlugin {
    
        private final DescriptionResolver resolver;
    
        @Autowired
        public ApiSincePlugin(DescriptionResolver resolver) {
            this.resolver = resolver;
        }
    
        @Override
        public void apply(OperationContext context) {
    
            final String sinceTemplate = "### Since %s%n%n%s";
            String notes = "";
            Optional<ApiOperation> apiOperationOptional = context.findAnnotation(ApiOperation.class);
            if (apiOperationOptional.isPresent()) {
                notes = apiOperationOptional.get().notes();
            }
            String finalNotes = notes;
            Optional<ApiSince> apiSinceOptional = context.findAnnotation(ApiSince.class);
            if (apiSinceOptional.isPresent()) {
                finalNotes = String.format(sinceTemplate, apiSinceOptional.get().value(), notes);
            }
            context.operationBuilder().notes(resolver.resolve(finalNotes));
        }
    
        @Override
        public boolean supports(DocumentationType type) {
            return true;
        }
    }
    
    @Component
    public class ApiSincePlugin implements OperationBuilderPlugin {
    
        @Override
        public void apply(OperationContext context) {
            Optional<ApiSince> annotation = context.findAnnotation(ApiSince.class);
            if (annotation.isPresent()) {
                String value = annotation.get().value();
                ObjectVendorExtension extention = new ObjectVendorExtension("x-since");
                extention.addProperty(new StringVendorExtension("value", value));
                context.operationBuilder().extensions(Collections.singletonList(extention));
            }
        }
    
        @Override
        public boolean supports(DocumentationType documentationType) {
            return true;
        }
    }
    


如果您不想将其添加到描述中,而是作为一个额外的JSON属性,请查看此解决方案:

选项2

  • @ApiSince
    注释(代码同上)
  • ApiSincePlugin
    插件:

    @Component
    public class ApiSincePlugin implements OperationBuilderPlugin {
    
        private final DescriptionResolver resolver;
    
        @Autowired
        public ApiSincePlugin(DescriptionResolver resolver) {
            this.resolver = resolver;
        }
    
        @Override
        public void apply(OperationContext context) {
    
            final String sinceTemplate = "### Since %s%n%n%s";
            String notes = "";
            Optional<ApiOperation> apiOperationOptional = context.findAnnotation(ApiOperation.class);
            if (apiOperationOptional.isPresent()) {
                notes = apiOperationOptional.get().notes();
            }
            String finalNotes = notes;
            Optional<ApiSince> apiSinceOptional = context.findAnnotation(ApiSince.class);
            if (apiSinceOptional.isPresent()) {
                finalNotes = String.format(sinceTemplate, apiSinceOptional.get().value(), notes);
            }
            context.operationBuilder().notes(resolver.resolve(finalNotes));
        }
    
        @Override
        public boolean supports(DocumentationType type) {
            return true;
        }
    }
    
    @Component
    public class ApiSincePlugin implements OperationBuilderPlugin {
    
        @Override
        public void apply(OperationContext context) {
            Optional<ApiSince> annotation = context.findAnnotation(ApiSince.class);
            if (annotation.isPresent()) {
                String value = annotation.get().value();
                ObjectVendorExtension extention = new ObjectVendorExtension("x-since");
                extention.addProperty(new StringVendorExtension("value", value));
                context.operationBuilder().extensions(Collections.singletonList(extention));
            }
        }
    
        @Override
        public boolean supports(DocumentationType documentationType) {
            return true;
        }
    }
    
  • @ApiSince
    起作用(代码同上):

@Bean
UiConfiguration uiConfig() {
    return UiConfigurationBuilder
            .builder()
            .showExtensions(true)
            ...
            .build();
}