Skip to content

Commit a4906f7

Browse files
authored
Merge pull request #3107 from swagger-api/ticket-3074
ref #3074 - include ModelConverter skipped classes in Reader shouldIgnoreClass
2 parents dff2440 + 8c1fabb commit a4906f7

File tree

5 files changed

+110
-14
lines changed

5 files changed

+110
-14
lines changed

modules/swagger-core/src/main/java/io/swagger/v3/core/converter/ModelConverters.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ public ResolvedSchema resolveAsResolvedSchema(AnnotatedType type) {
115115
return resolvedSchema;
116116
}
117117

118+
public boolean isRegisteredAsSkippedClass(String className) {
119+
return skippedClasses.contains(className);
120+
}
121+
118122
private boolean shouldProcess(Type type) {
119123
final Class<?> cls = TypeFactory.defaultInstance().constructType(type).getRawClass();
120124
if (cls.isPrimitive()) {
@@ -126,12 +130,7 @@ private boolean shouldProcess(Type type) {
126130
return false;
127131
}
128132
}
129-
for (String classToSkip : skippedClasses) {
130-
if (className.equals(classToSkip)) {
131-
return false;
132-
}
133-
}
134-
return true;
133+
return !skippedClasses.contains(className);
135134
}
136135

137136
static {

modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/Reader.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ public OpenAPI read(Class<?> cls,
417417
returnType = annotatedMethod.getType();
418418
}
419419

420-
if (shouldIgnoreClass(returnType.getTypeName()) && !returnType.equals(subResource)) {
420+
if (shouldIgnoreClass(returnType.getTypeName()) && !method.getGenericReturnType().equals(subResource)) {
421421
continue;
422422
}
423423
}
@@ -1013,7 +1013,7 @@ private Operation parseMethod(
10131013
}
10141014

10151015
final Class<?> subResource = getSubResourceWithJaxRsSubresourceLocatorSpecs(method);
1016-
if (!shouldIgnoreClass(returnType.getTypeName()) && !returnType.equals(subResource)) {
1016+
if (!shouldIgnoreClass(returnType.getTypeName()) && !method.getGenericReturnType().equals(subResource)) {
10171017
ResolvedSchema resolvedSchema = ModelConverters.getInstance().resolveAsResolvedSchema(new AnnotatedType(returnType).resolveAsRef(true).jsonViewAnnotation(jsonViewAnnotation));
10181018
if (resolvedSchema.schema != null) {
10191019
Schema returnTypeSchema = resolvedSchema.schema;
@@ -1066,9 +1066,14 @@ private boolean shouldIgnoreClass(String className) {
10661066
return true;
10671067
}
10681068
boolean ignore = false;
1069-
ignore = ignore || className.replace("[simple type, class ", "").startsWith("javax.ws.rs.");
1070-
ignore = ignore || className.equalsIgnoreCase("void");
1071-
ignore = ignore || className.equalsIgnoreCase("[simple type, class void]");
1069+
String rawClassName = className;
1070+
if (rawClassName.startsWith("[")) { // jackson JavaType
1071+
rawClassName = className.replace("[simple type, class ", "");
1072+
rawClassName = rawClassName.substring(0, rawClassName.length() -1);
1073+
}
1074+
ignore = ignore || rawClassName.startsWith("javax.ws.rs.");
1075+
ignore = ignore || rawClassName.equalsIgnoreCase("void");
1076+
ignore = ignore || ModelConverters.getInstance().isRegisteredAsSkippedClass(rawClassName);
10721077
return ignore;
10731078
}
10741079

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.swagger.v3.core.converter.AnnotatedType;
55
import io.swagger.v3.core.converter.ModelConverter;
66
import io.swagger.v3.core.converter.ModelConverterContextImpl;
7+
import io.swagger.v3.core.converter.ModelConverters;
78
import io.swagger.v3.core.filter.AbstractSpecFilter;
89
import io.swagger.v3.core.filter.OpenAPISpecFilter;
910
import io.swagger.v3.core.filter.SpecFilter;
@@ -29,6 +30,7 @@
2930
import io.swagger.v3.jaxrs2.resources.RefHeaderResource;
3031
import io.swagger.v3.jaxrs2.resources.RefLinksResource;
3132
import io.swagger.v3.jaxrs2.resources.RefParameter3029Resource;
33+
import io.swagger.v3.jaxrs2.resources.RefParameter3074Resource;
3234
import io.swagger.v3.jaxrs2.resources.RefParameterResource;
3335
import io.swagger.v3.jaxrs2.resources.RefRequestBodyResource;
3436
import io.swagger.v3.jaxrs2.resources.RefResponsesResource;
@@ -2003,4 +2005,17 @@ public void testTicket3082() {
20032005
" type: string\n";
20042006
SerializationMatchers.assertEqualsToYaml(openAPI, yaml);
20052007
}
2008+
2009+
@Test(description = "Filter class return type")
2010+
public void testTicket3074() {
2011+
Reader reader = new Reader(new OpenAPI());
2012+
OpenAPI oasResult = reader.read(RefParameter3074Resource.class);
2013+
SerializationMatchers.assertEqualsToYaml(oasResult, RefParameter3074Resource.EXPECTED_YAML_WITH_WRAPPER);
2014+
2015+
ModelConverters.getInstance().addClassToSkip("io.swagger.v3.jaxrs2.resources.RefParameter3074Resource$Wrapper");
2016+
2017+
reader = new Reader(new OpenAPI());
2018+
oasResult = reader.read(RefParameter3074Resource.class);
2019+
SerializationMatchers.assertEqualsToYaml(oasResult, RefParameter3074Resource.EXPECTED_YAML_WITHOUT_WRAPPER);
2020+
}
20062021
}

modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/RefParameter3029Resource.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22

33
import io.swagger.v3.oas.annotations.Operation;
44
import io.swagger.v3.oas.annotations.Parameter;
5-
import io.swagger.v3.oas.annotations.enums.ParameterIn;
6-
import io.swagger.v3.oas.annotations.media.Schema;
75

86
import javax.ws.rs.GET;
97
import javax.ws.rs.Path;
10-
import javax.ws.rs.QueryParam;
118

129
public class RefParameter3029Resource {
1310

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package io.swagger.v3.jaxrs2.resources;
2+
3+
import io.swagger.v3.oas.annotations.Operation;
4+
import io.swagger.v3.oas.annotations.media.Content;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
7+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
8+
9+
import javax.ws.rs.GET;
10+
import javax.ws.rs.Path;
11+
12+
public class RefParameter3074Resource {
13+
14+
public static final String EXPECTED_YAML_WITHOUT_WRAPPER =
15+
"openapi: 3.0.1\n" +
16+
"paths:\n" +
17+
" /employee:\n" +
18+
" get:\n" +
19+
" summary: Get an employee\n" +
20+
" operationId: getEmployee\n" +
21+
" responses:\n" +
22+
" 200:\n" +
23+
" content:\n" +
24+
" application/json:\n" +
25+
" schema:\n" +
26+
" $ref: '#/components/schemas/Employee'\n" +
27+
" 500:\n" +
28+
" content:\n" +
29+
" application/json:\n" +
30+
" schema:\n" +
31+
" $ref: '#/components/schemas/Error'\n" +
32+
"components:\n" +
33+
" schemas:\n" +
34+
" Employee:\n" +
35+
" type: object\n" +
36+
" Error:\n" +
37+
" type: object";
38+
39+
public static final String EXPECTED_YAML_WITH_WRAPPER = EXPECTED_YAML_WITHOUT_WRAPPER +
40+
"\n Wrapper:\n type: object";
41+
42+
class Wrapper<A> {
43+
final A a;
44+
45+
Wrapper(A a) {
46+
this.a = a;
47+
}
48+
}
49+
50+
class Employee {
51+
int number;
52+
String name;
53+
54+
Employee(int number, String name) {
55+
this.number = number;
56+
this.name = name;
57+
}
58+
}
59+
60+
class Error {
61+
String message;
62+
}
63+
64+
@GET
65+
@Path("/employee")
66+
@Operation(summary = "Get an employee")
67+
@ApiResponses({
68+
@ApiResponse(
69+
responseCode = "200",
70+
content = @Content(schema = @Schema(implementation = Employee.class), mediaType = "application/json")
71+
),
72+
@ApiResponse(
73+
responseCode = "500",
74+
content = @Content(schema = @Schema(implementation = Error.class), mediaType = "application/json")
75+
),
76+
})
77+
public Wrapper getEmployee() {
78+
return new Wrapper<Employee>(new Employee(1, "Michael Suyama"));
79+
}
80+
}

0 commit comments

Comments
 (0)