Skip to content

Commit 55eabb4

Browse files
committed
unnamed example support
1 parent ba2d7f7 commit 55eabb4

File tree

4 files changed

+175
-29
lines changed

4 files changed

+175
-29
lines changed

modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -300,42 +300,64 @@ public static boolean hasArrayAnnotation(io.swagger.v3.oas.annotations.media.Arr
300300
}
301301

302302
public static Optional<Example> getExample(ExampleObject example) {
303+
return getExample(example, false);
304+
}
305+
306+
public static Optional<Example> getExample(ExampleObject example, boolean ignoreName) {
303307
if (example == null) {
304308
return Optional.empty();
305309
}
306-
if (StringUtils.isNotBlank(example.name())) {
307-
Example exampleObject = new Example();
310+
Example exampleObject = new Example();
311+
if (!ignoreName && StringUtils.isNotBlank(example.name())) {
312+
308313
if (StringUtils.isNotBlank(example.name())) {
309314
exampleObject.setDescription(example.name());
310315
}
311-
if (StringUtils.isNotBlank(example.summary())) {
312-
exampleObject.setSummary(example.summary());
313-
}
314-
if (StringUtils.isNotBlank(example.externalValue())) {
315-
exampleObject.setExternalValue(example.externalValue());
316-
}
317-
if (StringUtils.isNotBlank(example.value())) {
318-
try {
319-
exampleObject.setValue(Json.mapper().readTree(example.value()));
320-
} catch (IOException e) {
321-
exampleObject.setValue(example.value());
322-
}
316+
resolveExample(exampleObject, example);
317+
318+
return Optional.of(exampleObject);
319+
} else if (ignoreName){
320+
if (resolveExample(exampleObject, example)) {
321+
return Optional.of(exampleObject);
323322
}
324-
if (StringUtils.isNotBlank(example.ref())) {
325-
exampleObject.set$ref(example.ref());
323+
}
324+
return Optional.empty();
325+
}
326+
327+
private static boolean resolveExample(Example exampleObject, ExampleObject example) {
328+
329+
boolean isEmpty = true;
330+
if (StringUtils.isNotBlank(example.summary())) {
331+
isEmpty = false;
332+
exampleObject.setSummary(example.summary());
333+
}
334+
335+
if (StringUtils.isNotBlank(example.externalValue())) {
336+
isEmpty = false;
337+
exampleObject.setExternalValue(example.externalValue());
338+
}
339+
if (StringUtils.isNotBlank(example.value())) {
340+
isEmpty = false;
341+
try {
342+
exampleObject.setValue(Json.mapper().readTree(example.value()));
343+
} catch (IOException e) {
344+
exampleObject.setValue(example.value());
326345
}
327-
if (example.extensions().length > 0) {
328-
Map<String, Object> extensions = AnnotationsUtils.getExtensions(example.extensions());
329-
if (extensions != null) {
330-
for (String ext : extensions.keySet()) {
331-
exampleObject.addExtension(ext, extensions.get(ext));
332-
}
346+
}
347+
if (StringUtils.isNotBlank(example.ref())) {
348+
isEmpty = false;
349+
exampleObject.set$ref(example.ref());
350+
}
351+
if (example.extensions().length > 0) {
352+
isEmpty = false;
353+
Map<String, Object> extensions = AnnotationsUtils.getExtensions(example.extensions());
354+
if (extensions != null) {
355+
for (String ext : extensions.keySet()) {
356+
exampleObject.addExtension(ext, extensions.get(ext));
333357
}
334358
}
335-
336-
return Optional.of(exampleObject);
337359
}
338-
return Optional.empty();
360+
return !isEmpty;
339361
}
340362

341363
public static Optional<ArraySchema> getArraySchema(io.swagger.v3.oas.annotations.media.ArraySchema arraySchema, JsonView jsonViewAnnotation) {
@@ -1037,8 +1059,12 @@ public static Optional<Content> getContent(io.swagger.v3.oas.annotations.media.C
10371059
}
10381060

10391061
ExampleObject[] examples = annotationContent.examples();
1040-
for (ExampleObject example : examples) {
1041-
getExample(example).ifPresent(exampleObject -> mediaType.addExamples(example.name(), exampleObject));
1062+
if (examples.length == 1 && StringUtils.isBlank(examples[0].name())) {
1063+
getExample(examples[0], true).ifPresent(exampleObject -> mediaType.example(exampleObject.getValue()));
1064+
} else {
1065+
for (ExampleObject example : examples) {
1066+
getExample(example).ifPresent(exampleObject -> mediaType.addExamples(example.name(), exampleObject));
1067+
}
10421068
}
10431069
if (annotationContent.extensions() != null && annotationContent.extensions().length > 0) {
10441070
Map<String, Object> extensions = AnnotationsUtils.getExtensions(annotationContent.extensions());

modules/swagger-core/src/main/java/io/swagger/v3/core/util/ParameterProcessor.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,16 @@ public static Parameter applyAnnotations(
107107
}
108108

109109
Map<String, Example> exampleMap = new HashMap<>();
110-
for (ExampleObject exampleObject : p.examples()) {
111-
AnnotationsUtils.getExample(exampleObject).ifPresent(example -> exampleMap.put(exampleObject.name(), example));
110+
final Object exampleValue;
111+
if (p.examples().length == 1 && StringUtils.isBlank(p.examples()[0].name())) {
112+
Optional<Example> exampleOptional = AnnotationsUtils.getExample(p.examples()[0], true);
113+
if (exampleOptional.isPresent()) {
114+
parameter.setExample(exampleOptional.get());
115+
}
116+
} else {
117+
for (ExampleObject exampleObject : p.examples()) {
118+
AnnotationsUtils.getExample(exampleObject).ifPresent(example -> exampleMap.put(exampleObject.name(), example));
119+
}
112120
}
113121
if (exampleMap.size() > 0) {
114122
parameter.setExamples(exampleMap);

modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.swagger.v3.core.model.ApiDescription;
1313
import io.swagger.v3.core.util.PrimitiveType;
1414
import io.swagger.v3.jaxrs2.matchers.SerializationMatchers;
15+
import io.swagger.v3.jaxrs2.resources.SingleExampleResource;
1516
import io.swagger.v3.jaxrs2.resources.BasicFieldsResource;
1617
import io.swagger.v3.jaxrs2.resources.BookStoreTicket2646;
1718
import io.swagger.v3.jaxrs2.resources.ClassPathParentResource;
@@ -2018,4 +2019,75 @@ public void testTicket3074() {
20182019
oasResult = reader.read(RefParameter3074Resource.class);
20192020
SerializationMatchers.assertEqualsToYaml(oasResult, RefParameter3074Resource.EXPECTED_YAML_WITHOUT_WRAPPER);
20202021
}
2022+
2023+
2024+
@Test(description = "Single Example")
2025+
public void testSingleExample() {
2026+
2027+
Reader reader = new Reader(new OpenAPI());
2028+
OpenAPI openAPI = reader.read(SingleExampleResource.class);
2029+
2030+
String yaml = "openapi: 3.0.1\n" +
2031+
"paths:\n" +
2032+
" /test1:\n" +
2033+
" post:\n" +
2034+
" operationId: test1\n" +
2035+
" requestBody:\n" +
2036+
" content:\n" +
2037+
" application/json:\n" +
2038+
" schema:\n" +
2039+
" $ref: '#/components/schemas/User'\n" +
2040+
" example:\n" +
2041+
" foo: foo\n" +
2042+
" bar: bar\n" +
2043+
" responses:\n" +
2044+
" default:\n" +
2045+
" description: default response\n" +
2046+
" content:\n" +
2047+
" '*/*': {}\n" +
2048+
" /test2:\n" +
2049+
" post:\n" +
2050+
" operationId: test2\n" +
2051+
" requestBody:\n" +
2052+
" content:\n" +
2053+
" application/json:\n" +
2054+
" schema:\n" +
2055+
" $ref: '#/components/schemas/User'\n" +
2056+
" example:\n" +
2057+
" foo: foo\n" +
2058+
" bar: bar\n" +
2059+
" responses:\n" +
2060+
" default:\n" +
2061+
" description: default response\n" +
2062+
" content:\n" +
2063+
" '*/*': {}\n" +
2064+
"components:\n" +
2065+
" schemas:\n" +
2066+
" User:\n" +
2067+
" type: object\n" +
2068+
" properties:\n" +
2069+
" id:\n" +
2070+
" type: integer\n" +
2071+
" format: int64\n" +
2072+
" username:\n" +
2073+
" type: string\n" +
2074+
" firstName:\n" +
2075+
" type: string\n" +
2076+
" lastName:\n" +
2077+
" type: string\n" +
2078+
" email:\n" +
2079+
" type: string\n" +
2080+
" password:\n" +
2081+
" type: string\n" +
2082+
" phone:\n" +
2083+
" type: string\n" +
2084+
" userStatus:\n" +
2085+
" type: integer\n" +
2086+
" description: User Status\n" +
2087+
" format: int32\n" +
2088+
" xml:\n" +
2089+
" name: User\n";
2090+
SerializationMatchers.assertEqualsToYaml(openAPI, yaml);
2091+
}
2092+
20212093
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.swagger.v3.jaxrs2.resources;
2+
3+
import io.swagger.v3.jaxrs2.resources.model.User;
4+
import io.swagger.v3.oas.annotations.Operation;
5+
import io.swagger.v3.oas.annotations.media.Content;
6+
import io.swagger.v3.oas.annotations.media.ExampleObject;
7+
import io.swagger.v3.oas.annotations.media.Schema;
8+
import io.swagger.v3.oas.annotations.parameters.RequestBody;
9+
10+
import javax.ws.rs.POST;
11+
import javax.ws.rs.Path;
12+
import javax.ws.rs.core.Response;
13+
14+
public class SingleExampleResource {
15+
16+
@POST
17+
@Path("/test1")
18+
public Response test1(
19+
@RequestBody(
20+
content = @Content(
21+
mediaType = "application/json",
22+
examples = @ExampleObject(value = "{\"foo\" : \"foo\", \"bar\" : \"bar\"}")
23+
)
24+
) final User user) {
25+
return Response.ok().entity("").build();
26+
}
27+
28+
@POST
29+
@Path("/test2")
30+
@Operation(requestBody = @RequestBody(
31+
content = @Content(
32+
mediaType = "application/json",
33+
schema = @Schema(implementation = User.class),
34+
examples = @ExampleObject(value = "{\"foo\" : \"foo\", \"bar\" : \"bar\"}")
35+
)
36+
))
37+
public Response test2(final User user) {
38+
return Response.ok().entity("").build();
39+
}
40+
}

0 commit comments

Comments
 (0)