tutorial tool hub for swagger swagger-2.0 swagger-editor openapi swagger-tools

tool - swagger ui



“Discriminador” en el polimorfismo, OpenAPI 2.0(Swagger 2.0) (2)

Haciendo referencia a OpenAPI 2.0, Schema Object o Swagger 2.0, Schema Object , y la definición de campo discriminator como:

Agrega soporte para el polimorfismo. El discriminador es el nombre de la propiedad del esquema que se utiliza para diferenciar entre otros esquemas que heredan este esquema. El nombre de la propiedad utilizada DEBE estar definido en este esquema y DEBE estar en la lista de propiedades required . Cuando se utiliza, el valor DEBE ser el nombre de este esquema o cualquier esquema que lo herede.

Mis confusiones / preguntas:

  • Es ambiguo para mí, qué papel juega exactamente en la herencia o el polimorfismo. ¿Podría alguien explicar el discriminator con un ejemplo práctico que muestre lo que hace exactamente y si no lo usamos? ¿Algún error, advertencia o alguna herramienta que dependa de él para algunas operaciones?
  • ¿Es el caso que swagger-editor no soporta discriminator , y este campo se usa en algunas otras herramientas?

Lo que he intentado hasta ahora:

  • He intentado usar swagger-editor y el ejemplo de la misma documentación (también se menciona a continuación), para jugar con esta propiedad para ver si puedo ver alguno de sus comportamientos especiales. Cambié la propiedad, la eliminé y extendí el modelo Dog a un nivel más profundo y probé lo mismo en el nuevo submodelo, pero no vi ningún cambio en la vista previa de swagger-editor .
  • Intenté buscar en línea y, especialmente, las preguntas de stackoverflow, pero no encontré ninguna información relevante.

El código de muestra que solía hacer experimentos:

definitions: Pet: type: object discriminator: petType properties: name: type: string petType: type: string required: - name - petType Cat: description: A representation of a cat allOf: - $ref: ''#/definitions/Pet'' - type: object properties: huntingSkill: type: string description: The measured skill for hunting default: lazy enum: - clueless - lazy - adventurous - aggressive required: - huntingSkill Dog: description: A representation of a dog allOf: - $ref: ''#/definitions/Pet'' - type: object properties: packSize: type: integer format: int32 description: the size of the pack the dog is from default: 0 minimum: 0 required: - packSize


De acuerdo con este grupo de Google , el discriminator se utiliza en la parte superior de la propiedad allOf y se define en el allOf para polimorfismo. Si no se utiliza el discriminator , la palabra clave allOf describe que un modelo contiene las propiedades de otros modelos para la composición.

Al igual que en su código de muestra, Pet es un tipo super con propiedad de petType identificado como discriminator y Cat es un subtipo de Pet . A continuación se muestra un ejemplo json de un objeto Cat :

{ "petType": "Cat", "name": "‎Kitty" }

El uso del discriminator pretende indicar la propiedad utilizada para identificar el tipo de un objeto. Supone que hay herramientas que pueden admitir correctamente los objetos de definición con el uso del discriminator , es posible determinar el tipo escaneando la propiedad. Por ejemplo, identificar el objeto es un Cat según petType .

Sin embargo, el campo discriminator no está bien definido en la especificación de la versión actual o en las muestras (ver problema # 403 ). Hasta donde sé, no hay herramientas proporcionadas por Swagger que lo respalden adecuadamente en este momento.

Se puede usar un discriminator si el modelo tiene una propiedad utilizada para determinar el tipo. En este caso, es natural y se puede utilizar como un indicador para que otros desarrolladores entiendan la relación de polimorfismo. Si se consideran herramientas de terceros como ReDoc que admiten el discriminator (vea petType en este gif y example ), puede encontrar esto útil.


La funcionalidad del discriminador se ha mejorado mucho en OpenApi 3. Ahora proporciona un objeto discriminador que contiene el nombre de la propiedad discriminadora, así como una asignación de los valores de esa propiedad a los nombres de esquema.

(Me doy cuenta de que sí preguntaste sobre OpenApi 2, pero esto se ha mejorado tanto en 3 que espero que puedas utilizarlo).

Consulte: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#discriminatorObject para la especificación real