Global mappings
Global type mapping will replace any usage of an OpenAPI type in the api description to the given java type.
It is defined like below, and it should be added to the map/types section in the mapping.yaml
which is a list of global type mappings.
A single global mapping can have the following properties:
- type: {source type} => {target type}
generics:
- {a generic type}
- {another generic type}
-
type is required.
-
{source type} is the type name used in the OpenAPI description and names the type that should be replaced by {target type}. {target type} is the fully qualified class name of the java type that should be used instead of {source type}.
-
-
generics is optional. It defines the list of types that should be used as generic type parameters to the java type given by {target type}.
simple mapping
In the simplest form a global type mapping of an OpenAPI object schema like this one:
Book:
type: object
properties:
isbn:
type: string
title:
type: string
can be mapped to an existing Book java type/class by the following mapping:
- type: Book => io.openapiprocessor.oap.Book
It is also possible to use a predefined OpenAPI type in the from type of the type mapping:
- type: array => java.util.List
This tells the processor to us a java.util.List instead of the OpenAPI type array.
The generics parameter is unnecessary in this special case. The processor knows java.util.List
and will automatically use the items property of the array as the generic type.
|
mapping with format
The basic types in OpenAPI can have a format modifier. For example the string type has two
modifiers date and date-time to provide more detail of the type. In this case the kind of date
that is represented as a string.
It is possible to create a global mapping that only matches a specific format by adding the format
to the {source type} property value separated by a ':' like this:
- type: string:date-time => java.time.ZonedDateTime
This maps the string type with a date-time format from the default java.time.OffsetDateTime to
java.time.ZonedDateTime. The mapping does not affect string without a format or string with
other formats.
Another example:
- type: string:uuid => java.util.UUID
mapping with generic types
Type mapping allows to use a target type that has generic parameters. The generic types are given by the generics property of the mapping. generics is a list and can contain multiple types.
For example if a StringPage schema in the OpenAPI corresponds to org.springframework.data.domain.Page<java.lang.String>, it can be mapped to the Spring type by:
- type: StringPage => org.springframework.data.domain.Page
generics:
- java.lang.String
The processor will replace any use of StringPage with the {target type} type and add the generic types (in the given order) to the {target type} type.
In case of the example above the processor will create Page<String> instead of StringPage with an additional import for the generic type (.. ignoring imports on java.lang).
To get a more compact description it is possible to write a shorter mapping by inlining the generic types:
- type: StringPage => org.springframework.data.domain.Page<java.lang.String>
This will generate the same code as the longer mapping version above.
nested generic types
since 2023.2
It is possible to create type mappings with nested generics types. Here are a few examples:
openapi-processor-mapping: v7
options:
package-name: generated
map:
types:
- type: Foo => java.util.Map<java.lang.String, java.util.List<java.lang.String>>
paths:
/foo:
responses:
- content: application/json => java.util.Map<java.lang.String, java.lang.String>
/foo2:
responses:
- content: application/json => java.util.Map<java.lang.String, java.util.List<java.lang.String>>
This is useful to map an OpenAPI dictionary description using additionalProperties to a proper java map type:
# a schema the defines a dictionary with string keys and string values
Map:
type: object
additionalProperties:
type: string