1919import static capital .scalable .restdocs .OperationAttributeHelper .getConstraintReader ;
2020import static capital .scalable .restdocs .OperationAttributeHelper .getJavadocReader ;
2121import static capital .scalable .restdocs .OperationAttributeHelper .getObjectMapper ;
22+ import static java .util .Collections .singletonList ;
2223
2324import java .lang .reflect .ParameterizedType ;
2425import java .lang .reflect .Type ;
2526import java .util .ArrayList ;
27+ import java .util .Collection ;
28+ import java .util .LinkedHashMap ;
2629import java .util .List ;
2730import java .util .Map ;
2831
2932import capital .scalable .restdocs .constraints .ConstraintReader ;
3033import capital .scalable .restdocs .jackson .FieldDocumentationGenerator ;
3134import capital .scalable .restdocs .javadoc .JavadocReader ;
3235import capital .scalable .restdocs .snippet .StandardTableSnippet ;
36+ import com .fasterxml .jackson .annotation .JsonSubTypes ;
3337import com .fasterxml .jackson .databind .JsonMappingException ;
3438import com .fasterxml .jackson .databind .ObjectMapper ;
39+ import com .fasterxml .jackson .databind .ObjectWriter ;
40+ import com .fasterxml .jackson .databind .type .TypeFactory ;
3541import org .springframework .core .MethodParameter ;
3642import org .springframework .restdocs .operation .Operation ;
3743import org .springframework .restdocs .payload .FieldDescriptor ;
@@ -47,35 +53,66 @@ protected AbstractJacksonFieldSnippet(String type, Map<String, Object> attribute
4753 super (type + "-fields" , attributes );
4854 }
4955
50- protected List <FieldDescriptor > createFieldDescriptors (Operation operation ,
56+ protected Collection <FieldDescriptor > createFieldDescriptors (Operation operation ,
5157 HandlerMethod handlerMethod ) {
52- List <FieldDescriptor > fieldDescriptors = new ArrayList <>();
58+ ObjectMapper objectMapper = getObjectMapper (operation );
59+ ObjectWriter writer = objectMapper .writer ();
60+ TypeFactory typeFactory = objectMapper .getTypeFactory ();
5361
54- Type type = getType (handlerMethod );
55- if (type != null ) {
56- ObjectMapper objectMapper = getObjectMapper (operation );
57- JavadocReader javadocReader = getJavadocReader (operation );
58- ConstraintReader constraintReader = getConstraintReader (operation );
62+ JavadocReader javadocReader = getJavadocReader (operation );
63+ ConstraintReader constraintReader = getConstraintReader (operation );
5964
60- try {
61- FieldDocumentationGenerator generator = new FieldDocumentationGenerator (
62- objectMapper .writer (), javadocReader , constraintReader );
63-
64- List <FieldDescriptor > descriptors = generator
65- .generateDocumentation (type , objectMapper .getTypeFactory ());
65+ Map <String , FieldDescriptor > fieldDescriptors = new LinkedHashMap <>();
6666
67- fieldDescriptors .addAll (descriptors );
67+ Type signatureType = getType (handlerMethod );
68+ if (signatureType != null ) {
69+ try {
70+ for (Type type : resolveActualTypes (signatureType )) {
71+ resolveFieldDescriptors (fieldDescriptors , type , writer , typeFactory ,
72+ javadocReader , constraintReader );
73+ }
6874 } catch (JsonMappingException e ) {
6975 throw new JacksonFieldProcessingException ("Error while parsing fields" , e );
7076 }
7177 }
7278
73- return fieldDescriptors ;
79+ return fieldDescriptors . values () ;
7480 }
7581
7682 protected Type firstGenericType (MethodParameter param ) {
7783 return ((ParameterizedType ) param .getGenericParameterType ()).getActualTypeArguments ()[0 ];
7884 }
7985
8086 protected abstract Type getType (HandlerMethod method );
87+
88+ private Collection <Type > resolveActualTypes (Type type ) {
89+
90+ if (type instanceof Class ) {
91+ JsonSubTypes jsonSubTypes = (JsonSubTypes ) ((Class ) type ).getAnnotation (
92+ JsonSubTypes .class );
93+ if (jsonSubTypes != null ) {
94+ Collection <Type > types = new ArrayList <>();
95+ for (JsonSubTypes .Type subType : jsonSubTypes .value ()) {
96+ types .add (subType .value ());
97+ }
98+ return types ;
99+ }
100+ }
101+
102+ return singletonList (type );
103+ }
104+
105+ private void resolveFieldDescriptors (Map <String , FieldDescriptor > fieldDescriptors ,
106+ Type type , ObjectWriter writer , TypeFactory typeFactory , JavadocReader javadocReader ,
107+ ConstraintReader constraintReader )
108+ throws JsonMappingException {
109+ FieldDocumentationGenerator generator = new FieldDocumentationGenerator (writer ,
110+ javadocReader , constraintReader );
111+ List <FieldDescriptor > descriptors = generator .generateDocumentation (type , typeFactory );
112+ for (FieldDescriptor descriptor : descriptors ) {
113+ if (fieldDescriptors .get (descriptor .getPath ()) == null ) {
114+ fieldDescriptors .put (descriptor .getPath (), descriptor );
115+ }
116+ }
117+ }
81118}
0 commit comments