Добавить созданную дату и время в REST API с помощью Swagger - PullRequest
2 голосов
/ 16 октября 2019

У меня есть пара API, и я использую springfox-swagger для документации по API. У меня есть требование добавить дату создания в соответствующий API. Как я могу добиться этого, используя swagger. Мне не нужно никаких версий API.

Пример:

@ApiOperation(value = "Creates a new user and returns the created user.")
    @PostMapping(/user)
    public ResponseEntity<UserDto> createUser(@RequestBody UserDto userDto) {
        User user =userService.create(userDto);
        return new ResponseEntity<>(UserMappers.USER_ENTITY_TO_DTO.apply(user),HttpStatus.CREATED);
    }

В приведенном выше примере я хочу добавить дату создания /user, чтобы можно было отслеживать дату создания.

1 Ответ

0 голосов
/ 31 октября 2019

В моем проекте у меня аналогичное требование. В качестве решения я создал пользовательскую аннотацию (для маркировки конечной точки) и написал плагин (для обновления описания API).

Option # 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;
        }
    }
    
  • @ApiSince в действии:

    @ApiSince(value = "2019-10-31")
    @PostMapping(value = "/login")
    @ApiOperation(value = "Authenticate user", nickname = "login", notes = "your API description")
    @ResponseStatus(HttpStatus.OK)
    @ApiResponses(value = {
        @ApiResponse(code = 200, response = LoginResponse.class, message = HTTP_200_OK),
        ...
    })
    @ResponseBody
    ResponseEntity<LoginResponse> login(...);
    

Если вы не хотите добавлять его в описание, но в качестве дополнительного атрибута JSON, тогда возьмитепосмотрите на это решение: Плагин Custom Operation Builder .

Option # 2

  • @ApiSince аннотация (код такой же, как выше)
  • ApiSincePlugin Плагин:

    @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;
        }
    }
    
  • Активировать расширения в интерфейсе Swagger:

    @Bean
    UiConfiguration uiConfig() {
        return UiConfigurationBuilder
                .builder()
                .showExtensions(true)
                ...
                .build();
    }
    
  • @ApiSince в действии (код такой же, как указано выше):

...