Skip to content

Commit c619467

Browse files
committed
fix: Include extended classes and implemented interfaces for JsonValue method search
1 parent dc8785e commit c619467

File tree

6 files changed

+59
-4
lines changed

6 files changed

+59
-4
lines changed

Diff for: modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -1171,9 +1171,7 @@ protected void _addEnumProps(Class<?> propClass, Schema property) {
11711171
final boolean useIndex = _mapper.isEnabled(SerializationFeature.WRITE_ENUMS_USING_INDEX);
11721172
final boolean useToString = _mapper.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
11731173

1174-
Optional<Method> jsonValueMethod = Arrays.stream(propClass.getDeclaredMethods())
1175-
.filter(m -> m.isAnnotationPresent(JsonValue.class))
1176-
.filter(m -> m.getAnnotation(JsonValue.class).value())
1174+
Optional<Method> jsonValueMethod = ReflectionUtils.getAnnotatedMethods(propClass, JsonValue.class).stream()
11771175
.findFirst();
11781176

11791177
Optional<Field> jsonValueField = Arrays.stream(propClass.getDeclaredFields())

Diff for: modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReflectionUtils.java

+23
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,29 @@ public static Optional<Object> safeGet(Field field, Object obj) {
486486
} catch (IllegalAccessException e) {
487487
return Optional.empty();
488488
}
489+
}
489490

491+
public static List<Method> getAnnotatedMethods(Class<?> type, Class<? extends Annotation> annotation) {
492+
List<Method> methods = new ArrayList<>();
493+
for (Class<?> clazz = type; clazz != Object.class; clazz = clazz.getSuperclass()) {
494+
for (Method method : clazz.getDeclaredMethods()) {
495+
if (method.isAnnotationPresent(annotation)) {
496+
methods.add(method);
497+
}
498+
}
499+
}
500+
getAnnotatedMethodsFromInterfaces(type, annotation, methods);
501+
return methods;
502+
}
503+
504+
private static void getAnnotatedMethodsFromInterfaces(Class<?> type, Class<? extends Annotation> annotation, List<Method> methods) {
505+
for (Class<?> iface : type.getInterfaces()) {
506+
for (Method method : iface.getDeclaredMethods()) {
507+
if (method.isAnnotationPresent(annotation)) {
508+
methods.add(method);
509+
}
510+
}
511+
getAnnotatedMethodsFromInterfaces(iface, annotation, methods);
512+
}
490513
}
491514
}

Diff for: modules/swagger-core/src/test/java/io/swagger/v3/core/converting/EnumPropertyTest.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.testng.annotations.Test;
2020

2121
import java.util.Arrays;
22+
import java.util.Collections;
2223
import java.util.Map;
2324

2425
import static org.testng.Assert.assertEquals;
@@ -233,6 +234,11 @@ public void testExtractJacksonEnumFields() {
233234
final Schema sixthEnumProperty = (Schema) model.getProperties().get("sixthEnumValue");
234235
assertTrue(sixthEnumProperty instanceof StringSchema);
235236
final StringSchema sixthStringProperty = (StringSchema) sixthEnumProperty;
236-
assertEquals(sixthEnumProperty.getEnum(), Arrays.asList("one", "two", "three"));
237+
assertEquals(sixthStringProperty.getEnum(), Arrays.asList("one", "two", "three"));
238+
239+
final Schema seventhEnumProperty = (Schema) model.getProperties().get("seventhEnumValue");
240+
assertTrue(seventhEnumProperty instanceof StringSchema);
241+
final StringSchema seventhEnumStringProperty = (StringSchema) seventhEnumProperty;
242+
assertEquals(seventhEnumStringProperty.getEnum(), Collections.singletonList("10"));
237243
}
238244
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.swagger.v3.core.oas.models;
2+
3+
import com.fasterxml.jackson.annotation.JsonValue;
4+
5+
public interface InterfaceWithJacksonValue {
6+
7+
@JsonValue
8+
int getJsonValue();
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
package io.swagger.v3.core.oas.models;
3+
4+
public enum JacksonValueInInterfaceEnum implements InterfaceWithJacksonValue {
5+
6+
TEN(10);
7+
8+
private final int jsonValue;
9+
10+
JacksonValueInInterfaceEnum(int jsonValue) {
11+
this.jsonValue = jsonValue;
12+
}
13+
14+
@Override
15+
public int getJsonValue() {
16+
return jsonValue;
17+
}
18+
}

Diff for: modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithJacksonEnumField.java

+1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ public class ModelWithJacksonEnumField {
1010
public JacksonValueFieldEnum fourthEnumValue;
1111
public JacksonNumberValueFieldEnum fifthEnumValue;
1212
public JacksonValuePrivateEnum sixthEnumValue;
13+
public JacksonValueInInterfaceEnum seventhEnumValue;
1314
}

0 commit comments

Comments
 (0)