Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Commit beb513e

Browse files
authored
support for primitive types (#118)
* support for primitive types * regen html * improvements * more tests * checking against jackson config * default value in RequestParam
1 parent 7eaf585 commit beb513e

29 files changed

+489
-117
lines changed

docs/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1486,7 +1486,7 @@ <h4 id="contributing-building-build"><a class="link" href="#contributing-buildin
14861486
</div>
14871487
<div id="footer">
14881488
<div id="footer-text">
1489-
Last updated 2017-07-31 10:29:18 CEST
1489+
Last updated 2017-07-31 20:33:00 CEST
14901490
</div>
14911491
</div>
14921492
<link rel="stylesheet" href="highlight/styles/github.min.css">

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/constraints/ConstraintAndGroupDescriptionResolver.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public String resolveDescription(Constraint constraint) {
5050
constraintDescription = constraint.getName();
5151
}
5252

53-
List<Class> groups = getGroups(constraint);
53+
List<Class<?>> groups = getGroups(constraint);
5454
if (groups.isEmpty()) {
5555
return constraintDescription;
5656
}
@@ -65,14 +65,14 @@ public String resolveDescription(Constraint constraint) {
6565
}
6666

6767
@Override
68-
public List<Class> getGroups(Constraint constraint) {
68+
public List<Class<?>> getGroups(Constraint constraint) {
6969
Object rawGroups = constraint.getConfiguration().get(GROUPS);
7070
if (!(rawGroups instanceof Class[])) {
7171
return emptyList();
7272
}
73-
Class[] groups = (Class[]) rawGroups;
73+
Class<?>[] groups = (Class[]) rawGroups;
7474

75-
List<Class> result = new ArrayList<>();
75+
List<Class<?>> result = new ArrayList<>();
7676
Collections.addAll(result, groups);
7777
return result;
7878
}

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/constraints/ConstraintReader.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ public interface ConstraintReader {
2424
String CONSTRAINTS_ATTRIBUTE = "constraints";
2525
String OPTIONAL_ATTRIBUTE = "optionals";
2626

27-
boolean isMandatory(Class<?> annotation);
28-
2927
List<String> getConstraintMessages(Class<?> javaBaseClass, String javaFieldName);
3028

3129
List<String> getConstraintMessages(MethodParameter param);

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/constraints/ConstraintReaderImpl.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,10 @@
1717
package capital.scalable.restdocs.constraints;
1818

1919
import static capital.scalable.restdocs.constraints.ConstraintAndGroupDescriptionResolver.VALUE;
20-
import static capital.scalable.restdocs.constraints.SkippableConstraintResolver
21-
.MANDATORY_VALUE_ANNOTATIONS;
2220
import static capital.scalable.restdocs.util.ObjectUtil.arrayToString;
2321
import static java.util.Collections.emptyList;
2422
import static java.util.Collections.singletonList;
2523
import static java.util.Collections.singletonMap;
26-
import static org.apache.commons.lang3.ArrayUtils.contains;
2724
import static org.apache.commons.lang3.StringUtils.isBlank;
2825
import static org.springframework.util.ReflectionUtils.findField;
2926

@@ -55,11 +52,6 @@ public List<String> getOptionalMessages(Class<?> javaBaseClass, String javaField
5552
return skippableConstraintResolver.getOptionalMessages(javaFieldName, javaBaseClass);
5653
}
5754

58-
@Override
59-
public boolean isMandatory(Class<?> annotation) {
60-
return contains(MANDATORY_VALUE_ANNOTATIONS, annotation);
61-
}
62-
6355
@Override
6456
public List<String> getConstraintMessages(Class<?> javaBaseClass, String javaFieldName) {
6557
ConstraintDescriptions constraints = new ConstraintDescriptions(javaBaseClass,

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/constraints/GroupDescriptionResolver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.springframework.restdocs.constraints.Constraint;
2222

2323
public interface GroupDescriptionResolver {
24-
List<Class> getGroups(Constraint constraint);
24+
List<Class<?>> getGroups(Constraint constraint);
2525

26-
String resolveGroupDescription(Class group, String constraintDescription);
26+
String resolveGroupDescription(Class<?> group, String constraintDescription);
2727
}

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/constraints/SkippableConstraintResolver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public List<String> getOptionalMessages(String property, Class<?> clazz) {
7878

7979
for (Constraint constraint : constraints) {
8080
if (isSkippable(constraint)) {
81-
List<Class> groups = getGroups(constraint);
81+
List<Class<?>> groups = getGroups(constraint);
8282

8383
if (groups.isEmpty()) {
8484
defaultOptional = "false";
@@ -97,7 +97,7 @@ public List<String> getOptionalMessages(String property, Class<?> clazz) {
9797
return result;
9898
}
9999

100-
private List<Class> getGroups(Constraint constraint) {
100+
private List<Class<?>> getGroups(Constraint constraint) {
101101
return descriptionResolver.getGroups(constraint);
102102
}
103103

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/jackson/FieldDocumentationGenerator.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import capital.scalable.restdocs.constraints.ConstraintReader;
2323
import capital.scalable.restdocs.javadoc.JavadocReader;
24+
import com.fasterxml.jackson.databind.DeserializationConfig;
2425
import com.fasterxml.jackson.databind.JavaType;
2526
import com.fasterxml.jackson.databind.JsonMappingException;
2627
import com.fasterxml.jackson.databind.ObjectWriter;
@@ -30,12 +31,16 @@
3031
public class FieldDocumentationGenerator {
3132

3233
private final ObjectWriter writer;
34+
private final DeserializationConfig deserializationConfig;
3335
private final JavadocReader javadocReader;
34-
private ConstraintReader constraintReader;
36+
private final ConstraintReader constraintReader;
3537

36-
public FieldDocumentationGenerator(ObjectWriter writer, JavadocReader javadocReader,
38+
public FieldDocumentationGenerator(ObjectWriter writer,
39+
DeserializationConfig deserializationConfig,
40+
JavadocReader javadocReader,
3741
ConstraintReader constraintReader) {
3842
this.writer = writer;
43+
this.deserializationConfig = deserializationConfig;
3944
this.javadocReader = javadocReader;
4045
this.constraintReader = constraintReader;
4146
}
@@ -47,7 +52,7 @@ public List<FieldDescriptor> generateDocumentation(Type type, TypeFactory typeFa
4752

4853
public List<FieldDescriptor> generateDocumentation(JavaType type) throws JsonMappingException {
4954
FieldDocumentationVisitorWrapper visitorWrapper = FieldDocumentationVisitorWrapper.create(
50-
javadocReader, constraintReader);
55+
javadocReader, constraintReader, deserializationConfig);
5156
writer.acceptJsonFormatVisitor(type, visitorWrapper);
5257
return visitorWrapper.getContext().getFields();
5358
}

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/jackson/FieldDocumentationVisitorContext.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static capital.scalable.restdocs.constraints.ConstraintReader.OPTIONAL_ATTRIBUTE;
2121
import static capital.scalable.restdocs.util.FieldUtil.fromGetter;
2222
import static capital.scalable.restdocs.util.FieldUtil.isGetter;
23+
import static capital.scalable.restdocs.util.TypeUtil.isPrimitive;
2324
import static org.apache.commons.lang3.StringUtils.isBlank;
2425
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
2526

@@ -28,18 +29,23 @@
2829

2930
import capital.scalable.restdocs.constraints.ConstraintReader;
3031
import capital.scalable.restdocs.javadoc.JavadocReader;
32+
import com.fasterxml.jackson.databind.DeserializationConfig;
33+
import com.fasterxml.jackson.databind.DeserializationFeature;
3134
import org.springframework.restdocs.payload.FieldDescriptor;
3235
import org.springframework.restdocs.snippet.Attributes.Attribute;
3336

3437
public class FieldDocumentationVisitorContext {
3538
private final List<FieldDescriptor> fields = new ArrayList<>();
36-
private JavadocReader javadocReader;
37-
private ConstraintReader constraintReader;
39+
private final JavadocReader javadocReader;
40+
private final ConstraintReader constraintReader;
41+
private final DeserializationConfig deserializationConfig;
3842

3943
public FieldDocumentationVisitorContext(JavadocReader javadocReader,
40-
ConstraintReader constraintReader) {
44+
ConstraintReader constraintReader,
45+
DeserializationConfig deserializationConfig) {
4146
this.javadocReader = javadocReader;
4247
this.constraintReader = constraintReader;
48+
this.deserializationConfig = deserializationConfig;
4349
}
4450

4551
public List<FieldDescriptor> getFields() {
@@ -87,9 +93,16 @@ private Attribute optionalAttribute(Class<?> javaBaseClass, String javaFieldName
8793
resolveOptionalMessages(javaBaseClass, javaFieldName));
8894
}
8995

90-
private List<String> resolveOptionalMessages(Class<?> javaBaseClass,
91-
String javaFieldName) {
96+
private List<String> resolveOptionalMessages(Class<?> javaBaseClass, String javaFieldName) {
9297
List<String> optionalMessages = new ArrayList<>();
98+
99+
if (isPrimitive(javaBaseClass, javaFieldName)) {
100+
boolean failOnNullForPrimitives = deserializationConfig.hasDeserializationFeatures(
101+
DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES.getMask());
102+
optionalMessages.add("" + !failOnNullForPrimitives);
103+
return optionalMessages;
104+
}
105+
93106
optionalMessages.addAll(constraintReader.getOptionalMessages(javaBaseClass, javaFieldName));
94107

95108
// fallback to field itself if we got a getter and no annotation on it

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/jackson/FieldDocumentationVisitorWrapper.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import capital.scalable.restdocs.constraints.ConstraintReader;
2020
import capital.scalable.restdocs.javadoc.JavadocReader;
21+
import com.fasterxml.jackson.databind.DeserializationConfig;
2122
import com.fasterxml.jackson.databind.JavaType;
2223
import com.fasterxml.jackson.databind.JsonMappingException;
2324
import com.fasterxml.jackson.databind.SerializerProvider;
@@ -52,9 +53,10 @@ public class FieldDocumentationVisitorWrapper implements JsonFormatVisitorWrappe
5253
}
5354

5455
public static FieldDocumentationVisitorWrapper create(JavadocReader javadocReader,
55-
ConstraintReader constraintReader) {
56+
ConstraintReader constraintReader, DeserializationConfig deserializationConfig) {
5657
return new FieldDocumentationVisitorWrapper(
57-
new FieldDocumentationVisitorContext(javadocReader, constraintReader), "", null);
58+
new FieldDocumentationVisitorContext(javadocReader, constraintReader,
59+
deserializationConfig), "", null);
5860
}
5961

6062
@Override

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/payload/AbstractJacksonFieldSnippet.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ protected Collection<FieldDescriptor> createFieldDescriptors(Operation operation
7777
if (signatureType != null) {
7878
try {
7979
for (Type type : resolveActualTypes(signatureType)) {
80-
resolveFieldDescriptors(fieldDescriptors, type, writer, typeFactory,
80+
resolveFieldDescriptors(fieldDescriptors, type, objectMapper,
8181
javadocReader, constraintReader);
8282
}
8383
} catch (JsonMappingException e) {
@@ -121,11 +121,13 @@ private Collection<Type> resolveActualTypes(Type type) {
121121
}
122122

123123
private void resolveFieldDescriptors(Map<String, FieldDescriptor> fieldDescriptors,
124-
Type type, ObjectWriter writer, TypeFactory typeFactory, JavadocReader javadocReader,
124+
Type type, ObjectMapper objectMapper, JavadocReader javadocReader,
125125
ConstraintReader constraintReader) throws JsonMappingException {
126-
FieldDocumentationGenerator generator = new FieldDocumentationGenerator(writer,
127-
javadocReader, constraintReader);
128-
List<FieldDescriptor> descriptors = generator.generateDocumentation(type, typeFactory);
126+
FieldDocumentationGenerator generator = new FieldDocumentationGenerator(
127+
objectMapper.writer(), objectMapper.getDeserializationConfig(), javadocReader,
128+
constraintReader);
129+
List<FieldDescriptor> descriptors = generator.generateDocumentation(type,
130+
objectMapper.getTypeFactory());
129131
for (FieldDescriptor descriptor : descriptors) {
130132
if (fieldDescriptors.get(descriptor.getPath()) == null) {
131133
fieldDescriptors.put(descriptor.getPath(), descriptor);

0 commit comments

Comments
 (0)