Skip to content

Commit bdb4073

Browse files
author
bnasslahsen
committed
code review
1 parent e14dd65 commit bdb4073

File tree

12 files changed

+231
-152
lines changed

12 files changed

+231
-152
lines changed

springdoc-openapi-data-rest/pom.xml

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
35
<parent>
46
<artifactId>springdoc-openapi</artifactId>
57
<groupId>org.springdoc</groupId>

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

+24-27
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,34 @@
1818

1919
package org.springdoc.data.rest;
2020

21-
import io.swagger.v3.core.util.Json;
22-
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
23-
import org.springframework.hateoas.mediatype.hal.Jackson2HalModule;
24-
import org.springframework.stereotype.Component;
25-
26-
import javax.annotation.PostConstruct;
2721
import java.util.Optional;
2822

29-
@Component
30-
public class HalProvider {
31-
32-
private Optional<RepositoryRestConfiguration> repositoryRestConfigurationOptional;
23+
import javax.annotation.PostConstruct;
3324

34-
public HalProvider(Optional<RepositoryRestConfiguration> repositoryRestConfigurationOptional) {
35-
this.repositoryRestConfigurationOptional = repositoryRestConfigurationOptional;
36-
}
25+
import io.swagger.v3.core.util.Json;
3726

38-
@PostConstruct
39-
private void init() {
40-
if (!isEnabled()) {
41-
return;
42-
}
27+
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
28+
import org.springframework.hateoas.mediatype.hal.Jackson2HalModule;
4329

44-
if (!Jackson2HalModule.isAlreadyRegisteredIn(Json.mapper())) {
45-
Json.mapper().registerModule(new Jackson2HalModule());
46-
}
47-
}
30+
public class HalProvider {
4831

49-
public boolean isEnabled() {
50-
return repositoryRestConfigurationOptional
51-
.map(RepositoryRestConfiguration::useHalAsDefaultJsonMediaType)
52-
.orElse(true);
53-
}
32+
private Optional<RepositoryRestConfiguration> repositoryRestConfigurationOptional;
33+
34+
public HalProvider(Optional<RepositoryRestConfiguration> repositoryRestConfigurationOptional) {
35+
this.repositoryRestConfigurationOptional = repositoryRestConfigurationOptional;
36+
}
37+
38+
@PostConstruct
39+
private void init() {
40+
if (!isHalEnabled())
41+
return;
42+
if (!Jackson2HalModule.isAlreadyRegisteredIn(Json.mapper()))
43+
Json.mapper().registerModule(new Jackson2HalModule());
44+
}
45+
46+
public boolean isHalEnabled() {
47+
return repositoryRestConfigurationOptional
48+
.map(RepositoryRestConfiguration::useHalAsDefaultJsonMediaType)
49+
.orElse(true);
50+
}
5451
}

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

+57-45
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
package org.springdoc.data.rest;
2020

21+
import java.util.Optional;
22+
2123
import com.fasterxml.jackson.core.JsonGenerator;
2224
import com.fasterxml.jackson.databind.SerializerProvider;
2325
import com.querydsl.core.types.Predicate;
@@ -33,74 +35,84 @@
3335
import org.springdoc.data.rest.converters.Pageable;
3436
import org.springdoc.data.rest.converters.RepresentationModelLinksOASMixin;
3537
import org.springdoc.data.rest.customisers.QuerydslPredicateOperationCustomizer;
38+
3639
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3740
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3841
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3942
import org.springframework.context.annotation.Bean;
40-
import org.springframework.context.annotation.ComponentScan;
4143
import org.springframework.context.annotation.Configuration;
44+
import org.springframework.context.annotation.Lazy;
4245
import org.springframework.data.querydsl.binding.QuerydslBindingsFactory;
4346
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
4447
import org.springframework.hateoas.Link;
4548
import org.springframework.hateoas.Links;
4649
import org.springframework.hateoas.RepresentationModel;
4750
import org.springframework.hateoas.server.LinkRelationProvider;
4851

49-
import java.util.Optional;
50-
5152
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
5253
import static org.springdoc.core.SpringDocUtils.getConfig;
5354

5455
@Configuration
5556
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
56-
@ComponentScan
5757
public class SpringDocDataRestConfiguration {
5858

59-
static {
60-
getConfig().replaceWithClass(org.springframework.data.domain.Pageable.class, Pageable.class)
61-
.replaceWithClass(org.springframework.data.domain.PageRequest.class, Pageable.class);
62-
}
59+
static {
60+
getConfig().replaceWithClass(org.springframework.data.domain.Pageable.class, Pageable.class)
61+
.replaceWithClass(org.springframework.data.domain.PageRequest.class, Pageable.class);
62+
}
63+
64+
@ConditionalOnClass(value = { QuerydslBindingsFactory.class })
65+
class QuerydslProvider {
66+
67+
@Bean
68+
@ConditionalOnMissingBean
69+
@Lazy(false)
70+
QuerydslPredicateOperationCustomizer queryDslQuerydslPredicateOperationCustomizer(Optional<QuerydslBindingsFactory> querydslBindingsFactory) {
71+
if (querydslBindingsFactory.isPresent()) {
72+
getConfig().addRequestWrapperToIgnore(Predicate.class);
73+
return new QuerydslPredicateOperationCustomizer(querydslBindingsFactory.get());
74+
}
75+
return null;
76+
}
77+
}
6378

64-
@ConditionalOnClass(value = {QuerydslBindingsFactory.class})
65-
class QuerydslProvider {
6679

67-
@Bean
68-
@ConditionalOnMissingBean
69-
QuerydslPredicateOperationCustomizer queryDslQuerydslPredicateOperationCustomizer(Optional<QuerydslBindingsFactory> querydslBindingsFactory) {
70-
if (querydslBindingsFactory.isPresent()) {
71-
getConfig().addRequestWrapperToIgnore(Predicate.class);
72-
return new QuerydslPredicateOperationCustomizer(querydslBindingsFactory.get());
73-
}
74-
return null;
75-
}
76-
}
80+
@Bean
81+
@ConditionalOnMissingBean
82+
@Lazy(false)
83+
HalProvider halProvider(Optional<RepositoryRestConfiguration> repositoryRestConfiguration) {
84+
return new HalProvider(repositoryRestConfiguration);
85+
}
7786

78-
@Bean
79-
CollectionModelContentConverter collectionModelContentConverter(HalProvider halProvider, LinkRelationProvider linkRelationProvider) {
80-
return halProvider.isEnabled() ? new CollectionModelContentConverter(linkRelationProvider) : null;
81-
}
87+
@Bean
88+
@ConditionalOnMissingBean
89+
@Lazy(false)
90+
CollectionModelContentConverter collectionModelContentConverter(HalProvider halProvider, LinkRelationProvider linkRelationProvider) {
91+
return halProvider.isHalEnabled() ? new CollectionModelContentConverter(linkRelationProvider) : null;
92+
}
8293

83-
/**
84-
* Registers an OpenApiCustomiser and a jackson mixin to ensure the definition of `Links` matches the serialized
85-
* output. This is done because the customer serializer converts the data to a map before serializing it.
86-
*
87-
* @see org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize(Links, JsonGenerator, SerializerProvider)
88-
*/
89-
@Bean
90-
OpenApiCustomiser linksSchemaCustomiser(HalProvider halProvider) {
91-
if (!halProvider.isEnabled()) {
92-
return openApi -> {
93-
};
94-
}
95-
Json.mapper().addMixIn(RepresentationModel.class, RepresentationModelLinksOASMixin.class);
94+
/**
95+
* Registers an OpenApiCustomiser and a jackson mixin to ensure the definition of `Links` matches the serialized
96+
* output. This is done because the customer serializer converts the data to a map before serializing it.
97+
*
98+
* @see org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize(Links, JsonGenerator, SerializerProvider)
99+
*/
100+
@Bean
101+
@Lazy(false)
102+
OpenApiCustomiser linksSchemaCustomiser(HalProvider halProvider) {
103+
if (!halProvider.isHalEnabled()) {
104+
return openApi -> {
105+
};
106+
}
107+
Json.mapper().addMixIn(RepresentationModel.class, RepresentationModelLinksOASMixin.class);
96108

97-
ResolvedSchema resolvedLinkSchema = ModelConverters.getInstance()
98-
.resolveAsResolvedSchema(new AnnotatedType(Link.class).resolveAsRef(true));
109+
ResolvedSchema resolvedLinkSchema = ModelConverters.getInstance()
110+
.resolveAsResolvedSchema(new AnnotatedType(Link.class).resolveAsRef(true));
99111

100-
return openApi -> openApi
101-
.schema("Link", resolvedLinkSchema.schema)
102-
.schema("Links", new MapSchema()
103-
.additionalProperties(new StringSchema())
104-
.additionalProperties(new ObjectSchema().$ref("#/components/schemas/Link")));
105-
}
112+
return openApi -> openApi
113+
.schema("Link", resolvedLinkSchema.schema)
114+
.schema("Links", new MapSchema()
115+
.additionalProperties(new StringSchema())
116+
.additionalProperties(new ObjectSchema().$ref("#/components/schemas/Link")));
117+
}
106118
}

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/converters/CollectionModelContentConverter.java

+29-29
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
package org.springdoc.data.rest.converters;
2020

21+
import java.util.Collection;
22+
import java.util.Iterator;
23+
2124
import com.fasterxml.jackson.core.JsonGenerator;
2225
import com.fasterxml.jackson.databind.SerializerProvider;
2326
import com.fasterxml.jackson.databind.type.CollectionType;
@@ -30,9 +33,6 @@
3033
import org.springframework.hateoas.EntityModel;
3134
import org.springframework.hateoas.server.LinkRelationProvider;
3235

33-
import java.util.Collection;
34-
import java.util.Iterator;
35-
3636
/**
3737
* Override resolved schema as there is a custom serializer that converts the data to a map before serializing it.
3838
*
@@ -41,35 +41,35 @@
4141
*/
4242
public class CollectionModelContentConverter implements ModelConverter {
4343

44-
private LinkRelationProvider linkRelationProvider;
44+
private LinkRelationProvider linkRelationProvider;
4545

46-
public CollectionModelContentConverter(LinkRelationProvider linkRelationProvider) {
47-
this.linkRelationProvider = linkRelationProvider;
48-
}
46+
public CollectionModelContentConverter(LinkRelationProvider linkRelationProvider) {
47+
this.linkRelationProvider = linkRelationProvider;
48+
}
4949

50-
@Override
51-
public Schema<?> resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
52-
if (chain.hasNext() && type != null && type.getType() instanceof CollectionType
53-
&& "_embedded".equalsIgnoreCase(type.getPropertyName())) {
54-
Schema<?> schema = chain.next().resolve(type, context, chain);
55-
if (schema instanceof ArraySchema) {
56-
Class<?> entityType = getEntityType(type);
57-
String entityClassName = linkRelationProvider.getCollectionResourceRelFor(entityType).value();
50+
@Override
51+
public Schema<?> resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
52+
if (chain.hasNext() && type != null && type.getType() instanceof CollectionType
53+
&& "_embedded".equalsIgnoreCase(type.getPropertyName())) {
54+
Schema<?> schema = chain.next().resolve(type, context, chain);
55+
if (schema instanceof ArraySchema) {
56+
Class<?> entityType = getEntityType(type);
57+
String entityClassName = linkRelationProvider.getCollectionResourceRelFor(entityType).value();
5858

59-
return new ObjectSchema()
60-
.name("_embedded")
61-
.addProperties(entityClassName, schema);
62-
}
63-
}
64-
return chain.hasNext() ? chain.next().resolve(type, context, chain) : null;
65-
}
59+
return new ObjectSchema()
60+
.name("_embedded")
61+
.addProperties(entityClassName, schema);
62+
}
63+
}
64+
return chain.hasNext() ? chain.next().resolve(type, context, chain) : null;
65+
}
6666

67-
private Class<?> getEntityType(AnnotatedType type) {
68-
Class<?> containerEntityType = ((CollectionType) (type.getType())).getContentType().getRawClass();
67+
private Class<?> getEntityType(AnnotatedType type) {
68+
Class<?> containerEntityType = ((CollectionType) (type.getType())).getContentType().getRawClass();
6969

70-
if (containerEntityType.isAssignableFrom(EntityModel.class)) {
71-
return ((CollectionType) type.getType()).getContentType().getBindings().getBoundType(0).getRawClass();
72-
}
73-
return containerEntityType;
74-
}
70+
if (containerEntityType.isAssignableFrom(EntityModel.class)) {
71+
return ((CollectionType) type.getType()).getContentType().getBindings().getBoundType(0).getRawClass();
72+
}
73+
return containerEntityType;
74+
}
7575
}

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/converters/Pageable.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,17 @@
3232
public class Pageable {
3333

3434
@Min(0)
35-
@Parameter(description = "Zero-based page index (0..N)",schema = @Schema(type = "integer", defaultValue = "0"))
35+
@Parameter(description = "Zero-based page index (0..N)", schema = @Schema(type = "integer", defaultValue = "0"))
3636
private Integer page;
3737

3838
@Min(1)
39-
@Parameter(description = "The size of the page to be returned",schema = @Schema(type = "integer", defaultValue = "20"))
39+
@Parameter(description = "The size of the page to be returned", schema = @Schema(type = "integer", defaultValue = "20"))
4040
private Integer size;
4141

4242
@Parameter(description = "Sorting criteria in the format: property(,asc|desc). "
4343
+ "Default sort order is ascending. " + "Multiple sort criteria are supported."
4444
, name = "sort"
45-
,array = @ArraySchema(schema = @Schema(type = "string")))
45+
, array = @ArraySchema(schema = @Schema(type = "string")))
4646
private List<String> sort;
4747

4848
public Pageable(int page, int size, List<String> sort) {
@@ -74,7 +74,8 @@ public List<String> getSort() {
7474
public void setSort(List<String> sort) {
7575
if (sort == null) {
7676
this.sort.clear();
77-
} else {
77+
}
78+
else {
7879
this.sort = sort;
7980
}
8081
}

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/converters/PageableAsQueryParam.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import io.swagger.v3.oas.annotations.media.Content;
3030
import io.swagger.v3.oas.annotations.media.Schema;
3131

32-
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
32+
@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
3333
@Retention(RetentionPolicy.RUNTIME)
3434
@Parameter(in = ParameterIn.QUERY
3535
, description = "Zero-based page index (0..N)"

springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/AbstractSpringDocTest.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,12 @@ public abstract class AbstractSpringDocTest {
5454
protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractSpringDocTest.class);
5555

5656
public static String className;
57+
5758
private static List<ModelConverter> modelConverters;
5859

5960
@Autowired
6061
protected MockMvc mockMvc;
6162

62-
@Autowired
63-
private void setModelConverters(List<ModelConverter> modelConverters) {
64-
AbstractSpringDocTest.modelConverters = modelConverters;
65-
}
66-
6763
public static String getContent(String fileName) throws Exception {
6864
try {
6965
Path path = Paths.get(FileUtils.class.getClassLoader().getResource(fileName).toURI());
@@ -81,6 +77,11 @@ public static void afterClass() {
8177
System.clearProperty("spring.hateoas.use-hal-as-default-json-media-type");
8278
}
8379

80+
@Autowired
81+
private void setModelConverters(List<ModelConverter> modelConverters) {
82+
AbstractSpringDocTest.modelConverters = modelConverters;
83+
}
84+
8485
@Test
8586
public void testApp() throws Exception {
8687
className = getClass().getSimpleName();

0 commit comments

Comments
 (0)