Swagger-codegen: [JAVA Spring] La generación de código con envoltorios booleanos primitivos no valida para nulo

Creado en 8 feb. 2018  ·  3Comentarios  ·  Fuente: swagger-api/swagger-codegen

Descripción y pasos para reproducir

Al generar modelos Java con swagger-codegen, los valores booleanos se convierten en clases contenedoras. Por ejemplo, un booleano llamado foo generará un objeto contenedor booleano.

Por ejemplo, el archivo swagger:

swagger: "2.0"
info:
  title: "Test"
  version: "2"
host: "petstore.swagger.io"
basePath: "/v2"
schemes:
- "http"
paths:
  /test:
    post:
      tags:
      - "pet"
      summary: "Test"
      parameters:
      - in: "body"
        name: "body"
        description: "Pet object that needs to be added to the store"
        required: true
        schema:
          $ref: "#/definitions/test"
      responses:
        200:
          description: ""
definitions:
  test:
    type: "boolean"

generará el siguiente modelo:

/**
 * TestModel
 */
<strong i="11">@Validated</strong>
@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2018-02-08T10:30:55.500+01:00")

public class TestModel   {
  @JsonProperty("someBoolean")
  private Boolean someBoolean = null;

  public TestModel someBoolean(Boolean someBoolean) {
    this.someBoolean = someBoolean;
    return this;
  }

  /**
   * Get someBoolean
   * <strong i="12">@return</strong> someBoolean
  **/
  @ApiModelProperty(value = "")


  public Boolean isSomeBoolean() {
    return someBoolean;
  }

  public void setSomeBoolean(Boolean someBoolean) {
    this.someBoolean = someBoolean;
  }

 //equals, hashocde and toString here
}

Como se mencionó en esta respuesta, si el booleano no es una primitiva, Hibernator Validator solo lo inspecciona si el getter se llama "getSomeBoolean" no "isSomeBoolean" que es solo la convención con primitivas. Por tanto, Hibernate lo ignora.

En la práctica, esto significa que cualquier objeto con booleanos, el booleano se ignora para la validación, lo que significa que enviar "nulo" u omitir el objeto no falla en la validación.

Versión swagger-codegen

2.3.1

Línea de comando utilizada para la generación

No estoy muy seguro de cuál es el comando CLI adecuado, ya que lo usamos a través de [gradle] https://github.com/thebignet/swagger-codegen-gradle-plugin-example), pero nuestra tarea de gradle es la siguiente :

task generateApi {
    inputs.file(swaggerInput)
    outputs.dir(generatedSourcesPath)
    doLast {
        def config = new CodegenConfigurator()
        config.setInputSpec(swaggerInput.path)
        config.setOutputDir(generatedSourcesPath.path)
        config.setLang('spring')
        //The documentation for the properties below can be found by downloading swagger-codegen-cli.jar
        //and running java -jar swagger-codegen-cli.jar config-help -l spring
        config.setAdditionalProperties([
                'invokerPackage': 'com.stibosystems.ziggy.mainbackend.api',
                'modelPackage': 'com.stibosystems.ziggy.mainbackend.api.model',
                'apiPackage': 'com.stibosystems.ziggy.mainbackend.api',
                'sourceFolder': '.', //This is relative to the output dir
                //We don't care about the timestamp, but need the <strong i="22">@Generated</strong> annotation so error prone knows not to check generated files
                'hideGenerationTimestamp': false,
                'dateLibrary': 'java8',
                'java8': true,
                'interfaceOnly': true,
                'useBeanValidation': true,
                'withXml': false,
                'useTags': true
        ])
        new DefaultGenerator().opts(config.toClientOptInput()).generate()
Sugerir una corrección / mejora

Sugiero cambiar el nombre del captador o agregar dos captadores y desaprobar el anterior.

Bug Java Spring

Comentario más útil

Hola, ¿este problema se solucionó o aún existe?

Todos 3 comentarios

@GeeWee cambia la convención de nomenclatura del captador personalizando la plantilla. Consulte lo siguiente para obtener más información:

https://github.com/swagger-api/swagger-codegen/pull/7344
https://github.com/swagger-api/swagger-codegen/issues/7261

Hola, ¿este problema se solucionó o aún existe?

¿Cómo lograrlo?

  • ¿El campo booleano requerido se genera en booleano primitivo, mientras que no es obligatorio para el contenedor booleano?

¿O cómo forzar el método getter de envoltura booleana a getSomeBool en lugar de isSomeBool?
@ wing328 se vinculó a PR https://github.com/swagger-api/swagger-codegen/pull/7344 que permite a los usuarios personalizar is / get / has para booleano.
¿Puede dar un ejemplo de cómo usarlo realmente, por favor? ¿Puede vincular a dicha plantilla o dar algunos consejos?

EDITAR:
Gracias @ wing328 . Tu comentario en las relaciones públicas me ayudó a lograrlo, editado {{#isBoolean}} get {{/ isBoolean}} en pojo.mustache.

Ahora solo tengo que averiguar si su problema puede solucionarse editando plantillas:https://github.com/swagger-api/swagger-codegen/issues/7980 , https://github.com/swagger-api/swagger-codegen/issues/8001 , https://github.com/swagger- api / swagger-codegen / issues / 8044 ~~EDITAR:Todo arreglado gracias

¿Fue útil esta página
0 / 5 - 0 calificaciones