Skip to content

Commit 92f11bb

Browse files
RobbinBaauwvojtechhabarta
authored andcommitted
Add support for required @RequestParam (#441)
* Add support for required RequestParam In Spring, RequestParams are required by default, but this wasn't enforced by Typescript-Generator. Now it is. * Added support for defaultValue See required behaviour with defaultValue at https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html
1 parent 5f919da commit 92f11bb

File tree

5 files changed

+45
-10
lines changed

5 files changed

+45
-10
lines changed

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/compiler/ModelCompiler.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@ private TsMethodModel processRestMethod(TsModel tsModel, SymbolTable symbolTable
669669
if (restQueryParam instanceof RestQueryParam.Single) {
670670
final MethodParameterModel queryParam = ((RestQueryParam.Single) restQueryParam).getQueryParam();
671671
final TsType type = typeFromJava(symbolTable, queryParam.getType(), method.getName(), method.getOriginClass());
672-
currentSingles.add(new TsProperty(queryParam.getName(), new TsType.OptionalType(type)));
672+
currentSingles.add(new TsProperty(queryParam.getName(), restQueryParam.required ? type : new TsType.OptionalType(type)));
673673
}
674674
if (restQueryParam instanceof RestQueryParam.Bean) {
675675
final BeanModel queryBean = ((RestQueryParam.Bean) restQueryParam).getBean();
@@ -695,7 +695,9 @@ private TsMethodModel processRestMethod(TsModel tsModel, SymbolTable symbolTable
695695
}
696696
}
697697
flushSingles.run();
698-
queryParameter = new TsParameterModel("queryParams", new TsType.OptionalType(new TsType.IntersectionType(types)));
698+
boolean allQueryParamsOptional = queryParams.stream().noneMatch(queryParam -> queryParam.required);
699+
TsType.IntersectionType queryParamType = new TsType.IntersectionType(types);
700+
queryParameter = new TsParameterModel("queryParams", allQueryParamsOptional ? new TsType.OptionalType(queryParamType) : queryParamType);
699701
parameters.add(queryParameter);
700702
} else {
701703
queryParameter = null;

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/JaxrsApplicationParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ private void parseResourceMethod(Result result, ResourceContext context, Class<?
173173
for (Parameter param : method.getParameters()) {
174174
final QueryParam queryParamAnnotation = param.getAnnotation(QueryParam.class);
175175
if (queryParamAnnotation != null) {
176-
queryParams.add(new RestQueryParam.Single(new MethodParameterModel(queryParamAnnotation.value(), param.getParameterizedType())));
176+
queryParams.add(new RestQueryParam.Single(new MethodParameterModel(queryParamAnnotation.value(), param.getParameterizedType()), false));
177177
foundType(result, param.getParameterizedType(), resourceClass, method.getName());
178178
}
179179
final BeanParam beanParamAnnotation = param.getAnnotation(BeanParam.class);

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/RestQueryParam.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@
44

55
public abstract class RestQueryParam {
66

7+
public boolean required;
8+
9+
RestQueryParam(boolean required) {
10+
this.required = required;
11+
}
12+
713
public static class Single extends RestQueryParam {
814
private final MethodParameterModel queryParam;
915

10-
public Single(MethodParameterModel queryParam) {
16+
public Single(MethodParameterModel queryParam, boolean required) {
17+
super(required);
1118
this.queryParam = queryParam;
1219
}
1320

@@ -19,7 +26,9 @@ public MethodParameterModel getQueryParam() {
1926
public static class Bean extends RestQueryParam {
2027
private final BeanModel bean;
2128

29+
// Only used in JAX-Rs, so optional
2230
public Bean(BeanModel bean) {
31+
super(false);
2332
this.bean = bean;
2433
}
2534

typescript-generator-spring/src/main/java/cz/habarta/typescript/generator/spring/SpringApplicationParser.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.springframework.web.bind.annotation.RequestMethod;
4444
import org.springframework.web.bind.annotation.RequestParam;
4545
import org.springframework.web.bind.annotation.RestController;
46+
import org.springframework.web.bind.annotation.ValueConstants;
4647

4748
public class SpringApplicationParser extends RestApplicationParser {
4849

@@ -273,21 +274,24 @@ private void parseControllerMethod(JaxrsApplicationParser.Result result, JaxrsAp
273274
final List<RestQueryParam> queryParams = new ArrayList<>();
274275
for (Parameter parameter : method.getParameters()) {
275276
if (parameter.getType() == Pageable.class) {
276-
queryParams.add(new RestQueryParam.Single(new MethodParameterModel("page", Long.class)));
277+
queryParams.add(new RestQueryParam.Single(new MethodParameterModel("page", Long.class), false));
277278
foundType(result, Long.class, controllerClass, method.getName());
278279

279-
queryParams.add(new RestQueryParam.Single(new MethodParameterModel("size", Long.class)));
280+
queryParams.add(new RestQueryParam.Single(new MethodParameterModel("size", Long.class), false));
280281
foundType(result, Long.class, controllerClass, method.getName());
281282

282-
queryParams.add(new RestQueryParam.Single(new MethodParameterModel("sort", String.class)));
283+
queryParams.add(new RestQueryParam.Single(new MethodParameterModel("sort", String.class), false));
283284
foundType(result, String.class, controllerClass, method.getName());
284285
} else {
285286
final RequestParam requestParamAnnotation = AnnotationUtils.findAnnotation(parameter, RequestParam.class);
286287
if (requestParamAnnotation != null) {
288+
289+
final boolean isRequired = requestParamAnnotation.required() && requestParamAnnotation.defaultValue().equals(ValueConstants.DEFAULT_NONE);
290+
287291
queryParams.add(new RestQueryParam.Single(new MethodParameterModel(firstOf(
288292
requestParamAnnotation.value(),
289293
parameter.getName()
290-
), parameter.getParameterizedType())));
294+
), parameter.getParameterizedType()), isRequired));
291295
foundType(result, parameter.getParameterizedType(), controllerClass, method.getName());
292296
}
293297
}

typescript-generator-spring/src/test/java/cz/habarta/typescript/generator/spring/SpringTest.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,16 @@ public void testQueryParameters() {
8787
settings.outputFileType = TypeScriptFileType.implementationFile;
8888
settings.generateSpringApplicationClient = true;
8989
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(Controller2.class));
90-
Assert.assertTrue(output.contains("echo(queryParams?: { message?: string; count?: number; }): RestResponse<string>"));
90+
Assert.assertTrue(output.contains("echo(queryParams: { message: string; count?: number; optionalRequestParam?: number; }): RestResponse<string>"));
91+
}
92+
93+
@Test
94+
public void testAllOptionalQueryParameters() {
95+
final Settings settings = TestUtils.settings();
96+
settings.outputFileType = TypeScriptFileType.implementationFile;
97+
settings.generateSpringApplicationClient = true;
98+
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(Controller7.class));
99+
Assert.assertTrue(output.contains("echo(queryParams?: { message?: string; }): RestResponse<string>"));
91100
}
92101

93102
@Test
@@ -149,7 +158,18 @@ public static class Controller2 {
149158
@RequestMapping("/echo")
150159
public String echo(
151160
@RequestParam("message") String message,
152-
@RequestParam(name = "count", defaultValue = "1") Integer count
161+
@RequestParam(name = "count", defaultValue = "1") Integer count,
162+
@RequestParam(required = false) Integer optionalRequestParam
163+
) {
164+
return message;
165+
}
166+
}
167+
168+
@RestController
169+
public static class Controller7 {
170+
@RequestMapping("/echo2")
171+
public String echo(
172+
@RequestParam(required = false) String message
153173
) {
154174
return message;
155175
}

0 commit comments

Comments
 (0)