Skip to content

Commit a33e929

Browse files
committed
Malformed api-docs JSON when StringHttpMessageConverter is not active. Fixes #2051
1 parent f27ff76 commit a33e929

File tree

20 files changed

+166
-32
lines changed

20 files changed

+166
-32
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,7 +1236,7 @@ protected void initOpenAPIBuilder(Locale locale) {
12361236
* @return the string
12371237
* @throws JsonProcessingException the json processing exception
12381238
*/
1239-
protected String writeYamlValue(OpenAPI openAPI) throws JsonProcessingException {
1239+
protected byte[] writeYamlValue(OpenAPI openAPI) throws JsonProcessingException {
12401240
String result;
12411241
ObjectMapper objectMapper = springDocProviders.yamlMapper();
12421242
if (springDocConfigProperties.isWriterWithOrderByKeys())
@@ -1247,7 +1247,7 @@ protected String writeYamlValue(OpenAPI openAPI) throws JsonProcessingException
12471247
result = objectMapper.writerFor(OpenAPI.class).writeValueAsString(openAPI);
12481248
else
12491249
result = objectMapper.writerWithDefaultPrettyPrinter().forType(OpenAPI.class).writeValueAsString(openAPI);
1250-
return result;
1250+
return result.getBytes(StandardCharsets.UTF_8);
12511251
}
12521252

12531253
/**
@@ -1307,7 +1307,7 @@ protected boolean isActuatorRestController(String operationPath, HandlerMethod h
13071307
* @return the string
13081308
* @throws JsonProcessingException the json processing exception
13091309
*/
1310-
protected String writeJsonValue(OpenAPI openAPI) throws JsonProcessingException {
1310+
protected byte[] writeJsonValue(OpenAPI openAPI) throws JsonProcessingException {
13111311
String result;
13121312
ObjectMapper objectMapper = springDocProviders.jsonMapper();
13131313
if (springDocConfigProperties.isWriterWithOrderByKeys())
@@ -1316,7 +1316,7 @@ protected String writeJsonValue(OpenAPI openAPI) throws JsonProcessingException
13161316
result = objectMapper.writerFor(OpenAPI.class).writeValueAsString(openAPI);
13171317
else
13181318
result = objectMapper.writerWithDefaultPrettyPrinter().forType(OpenAPI.class).writeValueAsString(openAPI);
1319-
return result;
1319+
return result.getBytes(StandardCharsets.UTF_8);
13201320
}
13211321

13221322
/**

springdoc-openapi-common/src/main/java/org/springdoc/core/converters/JavaTypeToIgnoreConverter.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import io.swagger.v3.core.converter.ModelConverter;
3030
import io.swagger.v3.core.converter.ModelConverterContext;
3131
import io.swagger.v3.oas.models.media.Schema;
32-
import org.springdoc.core.AbstractRequestService;
3332
import org.springdoc.core.providers.ObjectMapperProvider;
3433

3534
/**

springdoc-openapi-kotlin/src/test/kotlin/test/org/springdoc/api/app7/ExampleController.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package test.org.springdoc.api.app7
22

33
import io.swagger.v3.oas.annotations.Parameter
4-
import io.swagger.v3.oas.annotations.parameters.RequestBody
54
import org.springframework.web.bind.annotation.GetMapping
6-
import org.springframework.web.bind.annotation.PostMapping
7-
import org.springframework.web.bind.annotation.RequestMapping
85
import org.springframework.web.bind.annotation.RequestParam
96
import org.springframework.web.bind.annotation.RestController
107

springdoc-openapi-kotlin/src/test/kotlin/test/org/springdoc/api/app9/DemoController.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package test.org.springdoc.api.app9
22

33
import io.swagger.v3.oas.annotations.media.Schema
4-
import org.springframework.web.bind.annotation.*
4+
import org.springframework.web.bind.annotation.GetMapping
5+
import org.springframework.web.bind.annotation.RequestMapping
6+
import org.springframework.web.bind.annotation.RestController
57

68
@RestController
79
@RequestMapping("/api/demo")

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/MultipleOpenApiActuatorResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public MultipleOpenApiActuatorResource(List<GroupedOpenApi> groupedOpenApis, Obj
8383
*/
8484
@Operation(hidden = true)
8585
@GetMapping(value = "/{group}", produces = MediaType.APPLICATION_JSON_VALUE)
86-
public Mono<String> openapiJson(ServerHttpRequest
86+
public Mono<byte[]> openapiJson(ServerHttpRequest
8787
serverHttpRequest, @Value(API_DOCS_URL) String apiDocsUrl,
8888
@PathVariable String group, Locale locale)
8989
throws JsonProcessingException {
@@ -102,7 +102,7 @@ public Mono<String> openapiJson(ServerHttpRequest
102102
*/
103103
@Operation(hidden = true)
104104
@GetMapping(value = "/{group}/yaml", produces = APPLICATION_OPENAPI_YAML)
105-
public Mono<String> openapiYaml(ServerHttpRequest serverHttpRequest,
105+
public Mono<byte[]> openapiYaml(ServerHttpRequest serverHttpRequest,
106106
@Value(DEFAULT_API_DOCS_URL_YAML) String apiDocsUrl, @PathVariable String
107107
group, Locale locale) throws JsonProcessingException {
108108
return getOpenApiResourceOrThrow(group).openapiYaml(serverHttpRequest, apiDocsUrl + DEFAULT_PATH_SEPARATOR + group, locale);

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/MultipleOpenApiWebFluxResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public MultipleOpenApiWebFluxResource(List<GroupedOpenApi> groupedOpenApis, Obje
8282
*/
8383
@Operation(hidden = true)
8484
@GetMapping(value = API_DOCS_URL + "/{group}", produces = MediaType.APPLICATION_JSON_VALUE)
85-
public Mono<String> openapiJson(ServerHttpRequest
85+
public Mono<byte[]> openapiJson(ServerHttpRequest
8686
serverHttpRequest, @Value(API_DOCS_URL) String apiDocsUrl, @PathVariable String
8787
group, Locale locale) throws JsonProcessingException {
8888
return getOpenApiResourceOrThrow(group).openapiJson(serverHttpRequest, apiDocsUrl + DEFAULT_PATH_SEPARATOR + group, locale);
@@ -100,7 +100,7 @@ public Mono<String> openapiJson(ServerHttpRequest
100100
*/
101101
@Operation(hidden = true)
102102
@GetMapping(value = DEFAULT_API_DOCS_URL_YAML + "/{group}", produces = APPLICATION_OPENAPI_YAML)
103-
public Mono<String> openapiYaml(ServerHttpRequest serverHttpRequest,
103+
public Mono<byte[]> openapiYaml(ServerHttpRequest serverHttpRequest,
104104
@Value(DEFAULT_API_DOCS_URL_YAML) String apiDocsUrl, @PathVariable String
105105
group, Locale locale) throws JsonProcessingException {
106106
return getOpenApiResourceOrThrow(group).openapiYaml(serverHttpRequest, apiDocsUrl + DEFAULT_PATH_SEPARATOR + group, locale);

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/OpenApiActuatorResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public OpenApiActuatorResource(ObjectFactory<OpenAPIService> openAPIBuilderObjec
108108
*/
109109
@Operation(hidden = true)
110110
@GetMapping(value = DEFAULT_PATH_SEPARATOR, produces = MediaType.APPLICATION_JSON_VALUE)
111-
public Mono<String> openapiJson(ServerHttpRequest serverHttpRequest, Locale locale)
111+
public Mono<byte[]> openapiJson(ServerHttpRequest serverHttpRequest, Locale locale)
112112
throws JsonProcessingException {
113113
return super.openapiJson(serverHttpRequest, EMPTY, locale);
114114
}
@@ -124,7 +124,7 @@ public Mono<String> openapiJson(ServerHttpRequest serverHttpRequest, Locale loca
124124
*/
125125
@Operation(hidden = true)
126126
@GetMapping(value = DEFAULT_YAML_API_DOCS_ACTUATOR_PATH, produces = APPLICATION_OPENAPI_YAML)
127-
public Mono<String> openapiYaml(ServerHttpRequest serverHttpRequest, Locale locale)
127+
public Mono<byte[]> openapiYaml(ServerHttpRequest serverHttpRequest, Locale locale)
128128
throws JsonProcessingException {
129129
return super.openapiYaml(serverHttpRequest, YAML, locale);
130130
}

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/OpenApiResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public OpenApiResource(ObjectFactory<OpenAPIService> openAPIBuilderObjectFactory
130130
* @return the mono
131131
* @throws JsonProcessingException the json processing exception
132132
*/
133-
protected Mono<String> openapiJson(ServerHttpRequest serverHttpRequest, String apiDocsUrl, Locale locale)
133+
protected Mono<byte[]> openapiJson(ServerHttpRequest serverHttpRequest, String apiDocsUrl, Locale locale)
134134
throws JsonProcessingException {
135135
calculateServerUrl(serverHttpRequest, apiDocsUrl, locale);
136136
OpenAPI openAPI = this.getOpenApi(locale);
@@ -146,7 +146,7 @@ protected Mono<String> openapiJson(ServerHttpRequest serverHttpRequest, String a
146146
* @return the mono
147147
* @throws JsonProcessingException the json processing exception
148148
*/
149-
protected Mono<String> openapiYaml(ServerHttpRequest serverHttpRequest, String apiDocsUrl, Locale locale)
149+
protected Mono<byte[]> openapiYaml(ServerHttpRequest serverHttpRequest, String apiDocsUrl, Locale locale)
150150
throws JsonProcessingException {
151151
calculateServerUrl(serverHttpRequest, apiDocsUrl, locale);
152152
OpenAPI openAPI = this.getOpenApi(locale);

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/OpenApiWebfluxResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public OpenApiWebfluxResource(ObjectFactory<OpenAPIService> openAPIBuilderObject
112112
@Operation(hidden = true)
113113
@GetMapping(value = API_DOCS_URL, produces = MediaType.APPLICATION_JSON_VALUE)
114114
@Override
115-
public Mono<String> openapiJson(ServerHttpRequest serverHttpRequest, @Value(API_DOCS_URL) String apiDocsUrl, Locale locale)
115+
public Mono<byte[]> openapiJson(ServerHttpRequest serverHttpRequest, @Value(API_DOCS_URL) String apiDocsUrl, Locale locale)
116116
throws JsonProcessingException {
117117
return super.openapiJson(serverHttpRequest, apiDocsUrl, locale);
118118
}
@@ -129,7 +129,7 @@ public Mono<String> openapiJson(ServerHttpRequest serverHttpRequest, @Value(API_
129129
@Operation(hidden = true)
130130
@GetMapping(value = DEFAULT_API_DOCS_URL_YAML, produces = APPLICATION_OPENAPI_YAML)
131131
@Override
132-
public Mono<String> openapiYaml(ServerHttpRequest serverHttpRequest,
132+
public Mono<byte[]> openapiYaml(ServerHttpRequest serverHttpRequest,
133133
@Value(DEFAULT_API_DOCS_URL_YAML) String apiDocsUrl, Locale locale) throws JsonProcessingException {
134134
return super.openapiYaml(serverHttpRequest, apiDocsUrl, locale);
135135
}

springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/app81/SpringDocApp81Test.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
package test.org.springdoc.api.app81;
2424

2525
import java.net.URI;
26+
import java.nio.charset.StandardCharsets;
2627
import java.util.ArrayList;
2728
import java.util.Comparator;
2829
import java.util.List;
@@ -69,7 +70,9 @@ public void shouldGenerateOperationIdsDeterministically() throws Exception {
6970
when(request.getURI()).thenReturn(URI.create("http://localhost"));
7071

7172
String expected = getContent("results/app81.json");
72-
String openApi = resource.openapiJson(request, "", Locale.US).block();
73+
byte[] openApiBytes =resource.openapiJson(request, "", Locale.US).block();
74+
String openApi = new String(openApiBytes, StandardCharsets.UTF_8); // for UTF-8 encoding
75+
7376
assertEquals(expected, openApi, true);
7477
}
7578

0 commit comments

Comments
 (0)