Skip to content

Commit 8ae85c3

Browse files
committed
ref #3286 - prioritize schema name resolving by ApiModel.value
1 parent 2294fe8 commit 8ae85c3

File tree

3 files changed

+78
-0
lines changed

3 files changed

+78
-0
lines changed

modules/swagger-core/src/main/java/io/swagger/jackson/AbstractModelConverter.java

+18
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
import com.fasterxml.jackson.databind.introspect.Annotated;
1010
import com.fasterxml.jackson.databind.jsontype.NamedType;
1111
import com.fasterxml.jackson.databind.module.SimpleModule;
12+
import io.swagger.annotations.ApiModel;
1213
import io.swagger.annotations.ApiModelProperty;
1314
import io.swagger.converter.ModelConverter;
1415
import io.swagger.converter.ModelConverterContext;
1516
import io.swagger.models.Model;
1617
import io.swagger.models.properties.Property;
18+
import org.apache.commons.lang3.StringUtils;
1719

1820
import javax.xml.bind.annotation.XmlElement;
1921
import java.lang.annotation.Annotation;
@@ -102,6 +104,16 @@ protected String _typeName(JavaType type, BeanDescription beanDesc) {
102104
return name;
103105
}
104106

107+
/**
108+
* whether to resolve schema name by first using AnnotationInspector registered implementations
109+
* defaults to false, override returning `true` to obtain pre-1.5.24 behaviour
110+
*
111+
* @return false
112+
* @since 1.5.24
113+
*/
114+
protected boolean prioritizeAnnotationInspectorSchemaName() {
115+
return false;
116+
}
105117
protected String _findTypeName(JavaType type, BeanDescription beanDesc) {
106118
// First, handle container types; they require recursion
107119
if (type.isArrayType()) {
@@ -122,6 +134,12 @@ protected String _findTypeName(JavaType type, BeanDescription beanDesc) {
122134
beanDesc = _mapper.getSerializationConfig().introspectClassAnnotations(type);
123135
}
124136

137+
if (!prioritizeAnnotationInspectorSchemaName()) {
138+
final ApiModel model = type.getRawClass().getAnnotation(ApiModel.class);
139+
if (model != null && StringUtils.isNotBlank(model.value())) {
140+
return _typeNameResolver.nameForType(type);
141+
}
142+
}
125143
PropertyName rootName = _intr.findRootName(beanDesc.getClassInfo());
126144
if (rootName != null && rootName.hasSimpleName()) {
127145
return rootName.getSimpleName();

modules/swagger-jaxrs/src/test/java/io/swagger/SimpleReaderTest.java

+11
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.swagger.resources.ClassWithExamplePostClass;
3232
import io.swagger.resources.HiddenResource;
3333
import io.swagger.resources.Issue1979Resource;
34+
import io.swagger.resources.Issue3286Resource;
3435
import io.swagger.resources.NicknamedOperation;
3536
import io.swagger.resources.NotValidRootResource;
3637
import io.swagger.resources.Resource1041;
@@ -716,4 +717,14 @@ public void scanClassWithReadOnlyAndEmptyValueParams() {
716717
SerializableParameter allowEmptyParam = (SerializableParameter) swagger.getPath("/fun/allowEmpty").getGet().getParameters().get(0);
717718
assertTrue(allowEmptyParam.getAllowEmptyValue());
718719
}
720+
721+
@Test
722+
public void testTicket3286() {
723+
Swagger swagger = getSwagger(Issue3286Resource.class);
724+
BodyParameter bodyParam = (BodyParameter)swagger.getPath("/fun/{id}").getPost().getParameters().get(1);
725+
assertEquals(bodyParam.getSchema().getReference(), "#/definitions/BookRequest");
726+
assertEquals(swagger.getPath("/fun/{id}").getPost().getResponses().get("200").getResponseSchema().getReference(), "#/definitions/BookResponse");
727+
assertTrue(swagger.getDefinitions().containsKey("BookRequest"));
728+
assertTrue(swagger.getDefinitions().containsKey("BookResponse"));
729+
}
719730
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package io.swagger.resources;
2+
3+
import com.fasterxml.jackson.annotation.JsonRootName;
4+
import io.swagger.annotations.Api;
5+
import io.swagger.annotations.ApiModel;
6+
import io.swagger.annotations.ApiOperation;
7+
import io.swagger.annotations.ApiResponse;
8+
import io.swagger.annotations.ApiResponses;
9+
10+
import javax.ws.rs.POST;
11+
import javax.ws.rs.Path;
12+
import javax.ws.rs.PathParam;
13+
import javax.ws.rs.core.Response;
14+
import javax.xml.bind.annotation.XmlRootElement;
15+
16+
@Api(value = "test")
17+
@Path("fun")
18+
public class Issue3286Resource {
19+
20+
@POST
21+
@Path("/{id}")
22+
@ApiOperation(value = "test")
23+
@ApiResponses(value = {
24+
@ApiResponse(code = 200, message = "Ok", response = BookResponse.class),
25+
@ApiResponse(code = 400, message = "Ko", response = Error.class),
26+
})
27+
public Response test(@PathParam(value = "id") String bookId, BookRequest book) {
28+
return Response.ok().build();
29+
}
30+
31+
32+
@ApiModel(value = "BookResponse", description = "descResponse")
33+
@XmlRootElement(name = "book")
34+
@JsonRootName("book")
35+
public static class BookResponse {
36+
public String foo;
37+
}
38+
39+
@ApiModel(value = "BookRequest", description = "desc")
40+
@XmlRootElement(name = "book")
41+
@JsonRootName("book")
42+
public static class BookRequest {
43+
public String bar;
44+
}
45+
46+
public static class Error {
47+
public String err;
48+
}
49+
}

0 commit comments

Comments
 (0)