Nano Hash - криптовалюты, майнинг, программирование

Есть ли способ написать другую документацию с помощью аннотации swagger для класса модели, который используется разными ресурсами конечной точки?

Я использую версию Swagger 2.0.6 и JAX-WS-RS 2.0.1.

У меня есть 5 разных ресурсов конечных точек (rest API), которые используют один и тот же класс модели. Я приложил снимок экрана с задокументированной страницей модели.

введите здесь описание изображения

введите здесь описание изображения

Моя задача - написать разную документацию для каждой конечной точки. Моя проблема в том, что если я внесу изменение в описание в классе модели, это новое описание будет отображаться во всех 5 ресурсах конечной точки.

Мои классы моделей:

PatchOperations.java

public class PatchOperations {

    @Valid
    private List<PatchOperation> operationList;

    public PatchOperations() {
    }

    @Override
    public String toString() {
        return "PatchOperations{" +
            "operationList=" + operationList +
            '}';
    }

    public List<PatchOperation> getOperationList() {
        return operationList;
    }

    public void setOperationList(List<PatchOperation> operationList) {
        this.operationList = operationList;
    }
}

PatchOperation.java

public class PatchOperation {

    /**
     * {@link PatchOperator} operation to be performed
     */
    @Schema(description = "Operation to be performed", required = true)
    @JsonProperty
    @NotNull
    private PatchOperator op;

    @Schema(description = "Path to target where operation will be performed", required = true)
    @JsonProperty
    @Pattern(regexp = RegExConstants.PATCH_PATH, message = "Invalid path, the path should match regex '" + RegExConstants.PATCH_PATH + "'")
    private String path;

    @Schema(description = "Value used by operation [new value to add, new value used to replace existing value, existing value to be removed]")
    @JsonProperty
    private Object value;

    public PatchOperation() {
    }
}

Я попытался создать 2 новых класса, которые расширяют PatchOperations и PatchOperation.

public class DBRolePatch extends PatchOperations {

    @Override
    @Schema(implementation = DBRolePatchOperation.class)
    public List<PatchOperation> getOperationList() {
        return super.getOperationList();
    }
}


public class DBRolePatchOperation extends PatchOperation {

    @Override
    @Schema(description = "New description for Db role", example = "ADD", required = true)
    public PatchOperator getOp() {
        return super.getOp();
    }

    @Override
    @Schema(description = "New description for DBROLE", example = "/Name", required = true)
    public String getPath(){
        return super.getPath();
    }

    @Override
    @Schema(description = "New Description for DB ROLE", example = "New Project Name", required = true)
    public Object getValue(){
        return super.getValue();
    }

}

Из приведенных выше новых изменений в шаблоне проектирования я перезаписываю свое новое описание для всех атрибутов и достигаю своей задачи, но мои изменения выше меняют тело запроса.

{
 “operationList”: {
   “op”: “ADD”,
   “path”: “/Name”,
   “value”: “Autopilot”
 }
}

Исходное тело запроса выглядит так:

{
 “operationList”: [
   {
     “op”: “ADD”,
     “path”: “string”,
     “value”: {}
   }
 ]
}

Следовательно, я получаю сообщение об ошибке 400 Bad Request, говоря

Невозможно десериализовать экземпляр java.util.ArrayList из токена START_OBJECT

Не могли бы вы, пожалуйста, у кого-нибудь есть идея, как я могу достичь своей задачи, изменив мои классы Java или используя некоторые аннотации чванства.

Больше информации:

Это мой ресурс конечной точки:

@PATCH
    @AuthenticatedSession
    @Path(“/{id}“)
    @Consumes(MediaType.APPLICATION_JSON)
    @Operation(summary = ” Update DB role.“)
    @ApiResponses(value = {
            @ApiResponse(responseCode = “201”, description = MessageConstants.CREATED),
            @ApiResponse(responseCode = “400", description = MessageConstants.BAD_REQUEST, content = @Content(schema = @Schema(implementation = RestError.class)))})
    public Response updatePartialDBRole(
            @Parameter(description = SwaggerConstants.AUTHORIZATION_TOKEN_DESC, required = true) @HeaderParam(ParamNames.SESSION_TOKEN) String authToken,
            @Parameter(description = SwaggerConstants.DBROLE_ID_DESC, required = true) @PathParam(“id”) String id,
            @Parameter(description = SwaggerConstants.PATCH_OPERATION_DESC, required = true) @Valid DBRolePatch operationList,
            @Context UriInfo uriInfo)throws RestException {
            return delegate.updatePartialDBRoleInResponse(SessionInjectionHelper.getSession(requestContext), id, operationList, uriInfo);
}
04.04.2019

Ответы:


1

Старайтесь не добавлять документацию в свой класс модели. Или, если да, добавьте туда документы, общие для всех конечных точек. Затем в каждой конечной точке вы можете использовать аннотации Swagger для написания документации. Попробуй это:

 @ApiOperation( position = 100,
               value = "Retrieve SecurityToken authentication using BODY(String password)",
               notes = "Retrieve SecurityToken authentication using ReturnsId id and password",
               response = ResponseObjectClass.class)
 @ApiResponses(value = { @ApiResponse(code = 200, message = "Sucess"),
                         @ApiResponse(code = 422, message = "business exception"),
                         @ApiResponse(code = 500, message = "Server error") })
    public ResponseObjectClass someFunctionality(@ApiParam(value = "request", defaultValue = "an string as example showing your response") @RequestBody YourRequestBodyClass request, HttpServletResponse response)
                    throws Exception {
    return new ResponseObjectClass();
}

@ApiOperation и @ApiResponses - это аннотации swagger, часть пакета io.swagger.annotations в swagger 2.0.

ОБНОВЛЕНИЕ

Попробуйте следующее: в PatchOperations.java используйте дженерики. Подобно общему классу PatchOperations, и список будет частным List operationList; Затем DBRolePatch изменится следующим образом: открытый класс DBRolePatch расширяет PatchOperations {. . . } и удалите аннотацию @Schema

04.04.2019
  • Пожалуйста, посмотрите описание моих вопросов. Я добавил свой ресурс конечной точки. Я уже использую все упомянутые вами аннотации по той или иной причине, но моя задача не могла быть достигнута путем добавления описания в конечной точке. Или не могли бы вы показать мне, как добавить описание для всех атрибутов для одного объекта. 04.04.2019
  • Попробуйте следующее: в PatchOperations.java используйте дженерики. Подобно общедоступному классу PatchOperations ‹T расширяет PatchOperation›, и список будет частным List ‹T› operationList; Затем DBRolePatch изменится следующим образом: открытый класс DBRolePatch расширяет PatchOperations ‹DBRolePatchOperation› {. . . } 04.04.2019
  • Попробуй отформатировать мой последний комментарий, так как он содержит код. В любом случае, это просто обходной путь, не уверен, что он сработает. На самом деле вы расширяете классы только для того, чтобы иметь возможность добавлять разные документы в каждый класс. Если у вас разные конечные точки и все они имеют один и тот же класс, это не означает, что вам нужно использовать один и тот же класс. Возможно, вы думаете, что структура данных такая же, но это может быть просто совпадением. Я бы еще раз подумал о вашей иерархии, ваши дочерние классы не добавляют новых функций. 04.04.2019
  • Забыл сказать, удалите аннотацию схемы и в своем дочернем классе. 04.04.2019
  • {operationList: {op: ADD, path: / Name, value: Autopilot}} Я изменил согласно вашему предложению. Тем не менее, он создает неправильное тело запроса. 04.04.2019
  • Можете на всякий случай поделиться внесенными вами изменениями? Я не понимаю, почему строка, сгенерированная чванством, по-прежнему является простым объектом, а не списком 04.04.2019
  • открытый класс PatchOperations ‹T расширяет PatchOperation› {private List ‹T› operationList; public PatchOperations () {}} открытый класс DBRolePatch расширяет PatchOperations ‹DBRolePatchOperation› {public DBRolePatch () {} @Override @Schema (implementation = DBRolePatchOperation.class) public List ‹DBRolePatchOperation› getOperationList () {return super.getOperationList () {return super.getOperationList; }} 04.04.2019
  • Давайте продолжим это обсуждение в чате. 04.04.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..