Skip to content

Commit adaf6b8

Browse files
author
bnasslahsen
committed
Merge branch 'hal-collectionmodel-content-map' of https://github.com/fredrik-w/springdoc-openapi into fredrik-w-hal-collectionmodel-content-map
2 parents 25303f8 + a6288ed commit adaf6b8

File tree

4 files changed

+58
-9
lines changed

4 files changed

+58
-9
lines changed

springdoc-openapi-data-rest/src/main/java/org/springdoc/core/HalProvider.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020

2121
import javax.annotation.PostConstruct;
2222

23+
import io.swagger.v3.core.converter.ModelConverters;
2324
import io.swagger.v3.core.util.Json;
2425

26+
import org.springdoc.core.hal.CollectionModelContentConverter;
2527
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
2628
import org.springframework.hateoas.mediatype.hal.Jackson2HalModule;
2729

@@ -35,7 +37,10 @@ public HalProvider(RepositoryRestConfiguration repositoryRestConfiguration) {
3537

3638
@PostConstruct
3739
private void init(){
38-
if(repositoryRestConfiguration.useHalAsDefaultJsonMediaType())
40+
if(repositoryRestConfiguration.useHalAsDefaultJsonMediaType()) {
3941
Json.mapper().registerModule(new Jackson2HalModule());
42+
ModelConverters.getInstance()
43+
.addConverter(new CollectionModelContentConverter());
44+
}
4045
}
4146
}

springdoc-openapi-data-rest/src/main/java/org/springdoc/core/SpringDocDataRestConfiguration.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,20 @@
2424
import io.swagger.v3.core.converter.ModelConverters;
2525
import io.swagger.v3.core.converter.ResolvedSchema;
2626
import io.swagger.v3.core.util.Json;
27-
import io.swagger.v3.oas.annotations.media.Schema;
2827
import io.swagger.v3.oas.models.media.MapSchema;
2928
import io.swagger.v3.oas.models.media.ObjectSchema;
3029
import io.swagger.v3.oas.models.media.StringSchema;
3130
import org.springdoc.core.converters.Pageable;
3231
import org.springdoc.core.customizers.OpenApiCustomiser;
3332

33+
import org.springdoc.core.hal.RepresentationModelLinksOASMixin;
3434
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3535
import org.springframework.context.annotation.Bean;
3636
import org.springframework.context.annotation.Configuration;
3737
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
3838
import org.springframework.hateoas.Link;
3939
import org.springframework.hateoas.Links;
4040
import org.springframework.hateoas.RepresentationModel;
41-
import org.springframework.hateoas.mediatype.hal.RepresentationModelMixin;
4241

4342
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
4443
import static org.springdoc.core.SpringDocUtils.getConfig;
@@ -69,18 +68,14 @@ public OpenApiCustomiser linksSchemaCustomiser(RepositoryRestConfiguration repos
6968
return openApi -> {};
7069
}
7170
Json.mapper().addMixIn(RepresentationModel.class, RepresentationModelLinksOASMixin.class);
71+
7272
ResolvedSchema resolvedLinkSchema = ModelConverters.getInstance()
7373
.resolveAsResolvedSchema(new AnnotatedType(Link.class));
74+
7475
return openApi -> openApi
7576
.schema("Link", resolvedLinkSchema.schema)
7677
.schema("Links", new MapSchema()
7778
.additionalProperties(new StringSchema())
7879
.additionalProperties(new ObjectSchema().$ref("#/components/schemas/Link")));
7980
}
80-
81-
abstract static class RepresentationModelLinksOASMixin extends RepresentationModelMixin {
82-
@Override
83-
@Schema(ref = "#/components/schemas/Links")
84-
public abstract Links getLinks();
85-
}
8681
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.springdoc.core.hal;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.databind.SerializerProvider;
5+
import com.fasterxml.jackson.databind.type.CollectionType;
6+
import io.swagger.v3.core.converter.AnnotatedType;
7+
import io.swagger.v3.core.converter.ModelConverter;
8+
import io.swagger.v3.core.converter.ModelConverterContext;
9+
import io.swagger.v3.oas.models.media.ArraySchema;
10+
import io.swagger.v3.oas.models.media.MapSchema;
11+
import io.swagger.v3.oas.models.media.Schema;
12+
import io.swagger.v3.oas.models.media.StringSchema;
13+
14+
import java.util.Collection;
15+
import java.util.Iterator;
16+
17+
/**
18+
* Override resolved schema as there is a custom serializer that converts the data to a map before serializing it.
19+
*
20+
* @see org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalResourcesSerializer
21+
* @see org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalResourcesSerializer#serialize(Collection, JsonGenerator, SerializerProvider)
22+
*/
23+
public class CollectionModelContentConverter implements ModelConverter {
24+
@Override
25+
public Schema<?> resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
26+
if (chain.hasNext() && type != null && type.getType() instanceof CollectionType
27+
&& "_embedded".equalsIgnoreCase(type.getPropertyName())) {
28+
Schema<?> schema = chain.next().resolve(type, context, chain);
29+
if (schema instanceof ArraySchema) {
30+
return new MapSchema()
31+
.name("_embedded")
32+
.additionalProperties(new StringSchema())
33+
.additionalProperties(schema);
34+
}
35+
}
36+
return chain.hasNext() ? chain.next().resolve(type, context, chain) : null;
37+
}
38+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.springdoc.core.hal;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import org.springframework.hateoas.Links;
5+
import org.springframework.hateoas.mediatype.hal.RepresentationModelMixin;
6+
7+
public abstract class RepresentationModelLinksOASMixin extends RepresentationModelMixin {
8+
@Override
9+
@Schema(ref = "#/components/schemas/Links")
10+
public abstract Links getLinks();
11+
}

0 commit comments

Comments
 (0)