Skip to content

Commit 225024e

Browse files
committed
Negated a potential NPE that was caused be HTTP methods that had a
similar structure to accessor methods.
1 parent c533cb1 commit 225024e

File tree

3 files changed

+83
-4
lines changed

3 files changed

+83
-4
lines changed

java2typescript-jackson/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@
4343
<artifactId>jackson-annotations</artifactId>
4444
<version>${jackson.core.version}</version>
4545
</dependency>
46+
<dependency>
47+
<groupId>javax.ws.rs</groupId>
48+
<artifactId>jsr311-api</artifactId>
49+
<version>1.1.1</version>
50+
</dependency>
4651
<dependency>
4752
<groupId>com.fasterxml.jackson.core</groupId>
4853
<artifactId>jackson-core</artifactId>

java2typescript-jackson/src/main/java/java2typescript/jackson/module/visitors/TSJsonObjectFormatVisitor.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,22 @@
2424
import java.beans.PropertyDescriptor;
2525
import java.beans.Transient;
2626
import java.lang.reflect.Method;
27+
import java.util.ArrayList;
28+
import java.util.List;
29+
import java.util.regex.Pattern;
30+
2731
import java2typescript.jackson.module.grammar.AnyType;
2832
import java2typescript.jackson.module.grammar.FunctionType;
2933
import java2typescript.jackson.module.grammar.ClassType;
3034
import java2typescript.jackson.module.grammar.TypeDeclarationType;
3135
import java2typescript.jackson.module.grammar.VoidType;
3236
import java2typescript.jackson.module.grammar.base.AbstractType;
3337

38+
import javax.ws.rs.DELETE;
39+
import javax.ws.rs.GET;
40+
import javax.ws.rs.POST;
41+
import javax.ws.rs.PUT;
42+
3443
import com.fasterxml.jackson.databind.BeanProperty;
3544
import com.fasterxml.jackson.databind.JavaType;
3645
import com.fasterxml.jackson.databind.JsonMappingException;
@@ -51,6 +60,7 @@
5160
public class TSJsonObjectFormatVisitor extends ABaseTSJsonFormatVisitor<ClassType> implements JsonObjectFormatVisitor {
5261

5362
private Class clazz;
63+
private List<String> blackListField = new ArrayList<String>();
5464

5565
public TSJsonObjectFormatVisitor(ABaseTSJsonFormatVisitor<?> parentHolder, String className, Class clazz, Configuration conf) {
5666
super(parentHolder, conf);
@@ -59,7 +69,9 @@ public TSJsonObjectFormatVisitor(ABaseTSJsonFormatVisitor<?> parentHolder, Strin
5969
}
6070

6171
private void addField(String name, AbstractType fieldType) {
62-
type.getFields().put(name, fieldType);
72+
if (!blackListField.contains(name)) {
73+
type.getFields().put(name, fieldType);
74+
}
6375
}
6476

6577
private boolean isAccessorMethod(Method method, BeanInfo beanInfo) {
@@ -74,6 +86,21 @@ private boolean isAccessorMethod(Method method, BeanInfo beanInfo) {
7486
return false;
7587
}
7688

89+
private void blackListUnnecessaryFieldMethods(Method method) {
90+
Pattern getSearcher = Pattern.compile("^get.*");
91+
Pattern setSearcher = Pattern.compile("^set.*");
92+
93+
String ignoredField = method.getName().toLowerCase();
94+
95+
if (getSearcher.matcher(method.getName()).matches()) {
96+
ignoredField = ignoredField.replaceFirst("^get","");
97+
blackListField.add(ignoredField);
98+
} else if (setSearcher.matcher(method.getName()).matches()) {
99+
ignoredField = ignoredField.replaceFirst("^set","");
100+
blackListField.add(ignoredField);
101+
}
102+
}
103+
77104
void addPublicMethods() {
78105

79106
for (Method method : this.clazz.getDeclaredMethods()) {
@@ -83,6 +110,28 @@ void addPublicMethods() {
83110
continue;
84111
}
85112

113+
//Don't exclude accessors
114+
if (method.getAnnotation(GET.class) != null) {
115+
addMethod(method);
116+
blackListUnnecessaryFieldMethods(method);
117+
continue;
118+
}
119+
if (method.getAnnotation(POST.class) != null) {
120+
addMethod(method);
121+
blackListUnnecessaryFieldMethods(method);
122+
continue;
123+
}
124+
if (method.getAnnotation(PUT.class) != null) {
125+
addMethod(method);
126+
blackListUnnecessaryFieldMethods(method);
127+
continue;
128+
}
129+
if (method.getAnnotation(DELETE.class) != null) {
130+
addMethod(method);
131+
blackListUnnecessaryFieldMethods(method);
132+
continue;
133+
}
134+
86135
// Exclude accessors
87136
try {
88137
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);

java2typescript-jaxrs/src/test/java/java2typescript/jaxrs/DescriptorGeneratorTest.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,23 +46,33 @@ static class MyObject {
4646
}
4747

4848
@Path("/")
49-
static private interface ExampleService {
49+
class ExampleService {
5050

5151
@Path("/{id}")
5252
@POST
5353
public String aPostMethod(//
5454
@QueryParam("q1") String queryParam, //
5555
@PathParam("id") String id, //
5656
@FormParam("formParam") Integer formParam, //
57-
String postPayload);
57+
String postPayload){
58+
return "test";
59+
}
5860

5961
@Path("/{id}")
6062
@GET
6163
public void aGetMethod(//
6264
@QueryParam("q1") String queryParam, //
6365
@PathParam("id") String id, //
6466
@FormParam("formParam") Integer formParam, //
65-
MyObject postPayload);
67+
MyObject postPayload){
68+
69+
}
70+
71+
@Path("/random")
72+
@GET
73+
public int getRandom() {
74+
return 4;
75+
}
6676

6777
}
6878

@@ -92,4 +102,19 @@ public void testTypescriptGenerate() throws JsonGenerationException, JsonMapping
92102
Module tsModule = descGen.generateTypeScript("modName");
93103
tsModule.write(out);
94104
}
105+
106+
@Test
107+
public void testTypescriptGenerateWithExample() throws JsonGenerationException, JsonMappingException, IOException {
108+
109+
ServiceDescriptorGenerator descGen = new ServiceDescriptorGenerator(
110+
Collections.singletonList(ExampleService.class));
111+
112+
ObjectMapper mapper = new ObjectMapper();
113+
SimpleModule module = new SimpleModule("custom-mapping");
114+
115+
mapper.registerModule(module);
116+
117+
Module tsModule = descGen.generateTypeScript("modName");
118+
tsModule.write(out);
119+
}
95120
}

0 commit comments

Comments
 (0)