Skip to content

Commit af5eb31

Browse files
authored
Retrieve bean validation parameter names from Spring MVC / JAX-RS annotations (#105)
Fixes #96
1 parent 76142da commit af5eb31

File tree

17 files changed

+410
-60
lines changed

17 files changed

+410
-60
lines changed

belgif-rest-problem-it/belgif-rest-problem-jakarta-ee-it/src/main/java/io/github/belgif/rest/problem/Frontend.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,20 @@ public interface Frontend {
5656

5757
@GET
5858
@Path("/beanValidation/queryParameter")
59-
Response beanValidationQueryParameter(@QueryParam("param") @NotNull @Positive Integer param,
60-
@QueryParam("other") @Size(max = 5) String other);
59+
Response beanValidationQueryParameter(@QueryParam("param") @NotNull @Positive Integer p,
60+
@QueryParam("other") @Size(max = 5) String o);
6161

6262
@GET
6363
@Path("/beanValidation/headerParameter")
64-
Response beanValidationHeaderParameter(@HeaderParam("param") @NotNull @Positive Integer param);
64+
Response beanValidationHeaderParameter(@HeaderParam("param") @NotNull @Positive Integer p);
6565

6666
@GET
6767
@Path("/beanValidation/pathParameter/inherited/{param}")
68-
Response beanValidationPathParameterInherited(@PathParam("param") @NotNull @Positive Integer param);
68+
Response beanValidationPathParameterInherited(@PathParam("param") @NotNull @Positive Integer p);
6969

7070
@GET
7171
@Path("/beanValidation/pathParameter/overridden/{param}")
72-
Response beanValidationPathParameterOverridden(@PathParam("param") @NotNull @Positive Integer param);
72+
Response beanValidationPathParameterOverridden(@PathParam("param") @NotNull @Positive Integer p);
7373

7474
@POST
7575
@Path("/beanValidation/body")

belgif-rest-problem-it/belgif-rest-problem-jakarta-ee-it/src/main/java/io/github/belgif/rest/problem/FrontendImpl.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -190,31 +190,31 @@ public Response unmappedFromBackend(@QueryParam("client") Client client) {
190190
}
191191

192192
@Override
193-
public Response beanValidationQueryParameter(Integer param, String other) {
194-
return Response.ok("param: " + param + ", other: " + other).build();
193+
public Response beanValidationQueryParameter(Integer p, String o) {
194+
return Response.ok("param: " + p + ", other: " + o).build();
195195
}
196196

197197
@Override
198-
public Response beanValidationHeaderParameter(Integer param) {
199-
return Response.ok("param: " + param).build();
198+
public Response beanValidationHeaderParameter(Integer p) {
199+
return Response.ok("param: " + p).build();
200200
}
201201

202202
@GET
203203
@Path("/beanValidation/pathParameter/class/{param}")
204-
public Response beanValidationPathParameter(@PathParam("param") @NotNull @Positive Integer param) {
205-
return Response.ok("param: " + param).build();
204+
public Response beanValidationPathParameter(@PathParam("param") @NotNull @Positive Integer p) {
205+
return Response.ok("param: " + p).build();
206206
}
207207

208208
@Override
209-
public Response beanValidationPathParameterInherited(Integer param) {
210-
return Response.ok("param: " + param).build();
209+
public Response beanValidationPathParameterInherited(Integer p) {
210+
return Response.ok("param: " + p).build();
211211
}
212212

213213
@Override
214214
@GET
215215
@Path("/beanValidation/pathParameter/overridden")
216-
public Response beanValidationPathParameterOverridden(@QueryParam("param") @NotNull @Positive Integer param) {
217-
return Response.ok("param: " + param).build();
216+
public Response beanValidationPathParameterOverridden(@QueryParam("param") @NotNull @Positive Integer p) {
217+
return Response.ok("param: " + p).build();
218218
}
219219

220220
@Override

belgif-rest-problem-it/belgif-rest-problem-java-ee-it/src/main/java/io/github/belgif/rest/problem/Frontend.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,20 @@ public interface Frontend {
5656

5757
@GET
5858
@Path("/beanValidation/queryParameter")
59-
Response beanValidationQueryParameter(@QueryParam("param") @NotNull @Positive Integer param,
60-
@QueryParam("other") @Size(max = 5) String other);
59+
Response beanValidationQueryParameter(@QueryParam("param") @NotNull @Positive Integer p,
60+
@QueryParam("other") @Size(max = 5) String o);
6161

6262
@GET
6363
@Path("/beanValidation/headerParameter")
64-
Response beanValidationHeaderParameter(@HeaderParam("param") @NotNull @Positive Integer param);
64+
Response beanValidationHeaderParameter(@HeaderParam("param") @NotNull @Positive Integer p);
6565

6666
@GET
6767
@Path("/beanValidation/pathParameter/inherited/{param}")
68-
Response beanValidationPathParameterInherited(@PathParam("param") @NotNull @Positive Integer param);
68+
Response beanValidationPathParameterInherited(@PathParam("param") @NotNull @Positive Integer p);
6969

7070
@GET
7171
@Path("/beanValidation/pathParameter/overridden/{param}")
72-
Response beanValidationPathParameterOverridden(@PathParam("param") @NotNull @Positive Integer param);
72+
Response beanValidationPathParameterOverridden(@PathParam("param") @NotNull @Positive Integer p);
7373

7474
@POST
7575
@Path("/beanValidation/body")

belgif-rest-problem-it/belgif-rest-problem-java-ee-it/src/main/java/io/github/belgif/rest/problem/FrontendImpl.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -189,31 +189,31 @@ public Response unmappedFromBackend(@QueryParam("client") Client client) {
189189
}
190190

191191
@Override
192-
public Response beanValidationQueryParameter(Integer param, String other) {
193-
return Response.ok("param: " + param + ", other: " + other).build();
192+
public Response beanValidationQueryParameter(Integer p, String o) {
193+
return Response.ok("param: " + p + ", other: " + o).build();
194194
}
195195

196196
@Override
197-
public Response beanValidationHeaderParameter(Integer param) {
198-
return Response.ok("header: " + param).build();
197+
public Response beanValidationHeaderParameter(Integer p) {
198+
return Response.ok("header: " + p).build();
199199
}
200200

201201
@GET
202202
@Path("/beanValidation/pathParameter/class/{param}")
203-
public Response beanValidationPathParameter(@PathParam("param") @NotNull @Positive Integer param) {
204-
return Response.ok("param: " + param).build();
203+
public Response beanValidationPathParameter(@PathParam("param") @NotNull @Positive Integer p) {
204+
return Response.ok("param: " + p).build();
205205
}
206206

207207
@Override
208-
public Response beanValidationPathParameterInherited(Integer param) {
209-
return Response.ok("param: " + param).build();
208+
public Response beanValidationPathParameterInherited(Integer p) {
209+
return Response.ok("param: " + p).build();
210210
}
211211

212212
@Override
213213
@GET
214214
@Path("/beanValidation/pathParameter/overridden")
215-
public Response beanValidationPathParameterOverridden(@QueryParam("param") @NotNull @Positive Integer param) {
216-
return Response.ok("param: " + param).build();
215+
public Response beanValidationPathParameterOverridden(@QueryParam("param") @NotNull @Positive Integer p) {
216+
return Response.ok("param: " + p).build();
217217
}
218218

219219
@Override

belgif-rest-problem-it/belgif-rest-problem-spring-boot-2-it/src/main/java/io/github/belgif/rest/problem/ControllerInterface.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ public interface ControllerInterface {
1515

1616
@GetMapping("/beanValidation/pathParameter/inherited/{param}")
1717
ResponseEntity<String> beanValidationPathParameterInherited(
18-
@PathVariable("param") @Positive @NotNull Integer param);
18+
@PathVariable("param") @Positive @NotNull Integer p);
1919

2020
@GetMapping("/beanValidation/pathParameter/overridden/{param}")
2121
ResponseEntity<String> beanValidationPathParameterOverridden(
22-
@PathVariable("param") @Positive @NotNull Integer param);
22+
@PathVariable("param") @Positive @NotNull Integer p);
2323

2424
}

belgif-rest-problem-it/belgif-rest-problem-spring-boot-2-it/src/main/java/io/github/belgif/rest/problem/FrontendController.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -150,32 +150,32 @@ public void unmappedFromBackend(@RequestParam("client") Client client) {
150150

151151
@GetMapping("/beanValidation/queryParameter")
152152
public ResponseEntity<String> beanValidationQueryParameter(
153-
@RequestParam("param") @Positive @NotNull Integer param,
154-
@RequestParam("other") @Size(max = 5) String other) {
155-
return ResponseEntity.ok("param: " + param + ", other: " + other);
153+
@RequestParam("param") @Positive @NotNull Integer p,
154+
@RequestParam @Size(max = 5) String other) {
155+
return ResponseEntity.ok("param: " + p + ", other: " + other);
156156
}
157157

158158
@GetMapping("/beanValidation/headerParameter")
159159
public ResponseEntity<String> beanValidationHeaderParameter(
160-
@RequestHeader("param") @Positive @NotNull Integer param) {
161-
return ResponseEntity.ok("param: " + param);
160+
@RequestHeader("param") @Positive @NotNull Integer p) {
161+
return ResponseEntity.ok("param: " + p);
162162
}
163163

164164
@GetMapping("/beanValidation/pathParameter/class/{param}")
165165
public ResponseEntity<String> beanValidationPathParameter(
166-
@PathVariable("param") @Positive @NotNull Integer param) {
167-
return ResponseEntity.ok("param: " + param);
166+
@PathVariable("param") @Positive @NotNull Integer p) {
167+
return ResponseEntity.ok("param: " + p);
168168
}
169169

170170
@Override
171-
public ResponseEntity<String> beanValidationPathParameterInherited(Integer param) {
172-
return ResponseEntity.ok("param: " + param);
171+
public ResponseEntity<String> beanValidationPathParameterInherited(Integer p) {
172+
return ResponseEntity.ok("param: " + p);
173173
}
174174

175175
@Override
176176
@GetMapping("/beanValidation/pathParameter/overridden")
177-
public ResponseEntity<String> beanValidationPathParameterOverridden(@RequestParam Integer param) {
178-
return ResponseEntity.ok("param: " + param);
177+
public ResponseEntity<String> beanValidationPathParameterOverridden(@RequestParam("param") Integer p) {
178+
return ResponseEntity.ok("param: " + p);
179179
}
180180

181181
@PostMapping("/beanValidation/body")
@@ -194,8 +194,8 @@ public ResponseEntity<String> beanValidationBodyInheritance(@Valid @RequestBody
194194
}
195195

196196
@PostMapping("/beanValidation/queryParameter/nested")
197-
public ResponseEntity<String> beanValidationQueryParameterNested(@Valid Model param) {
198-
return ResponseEntity.ok("param: " + param);
197+
public ResponseEntity<String> beanValidationQueryParameterNested(@Valid Model p) {
198+
return ResponseEntity.ok("param: " + p);
199199
}
200200

201201
}

belgif-rest-problem-it/belgif-rest-problem-spring-boot-3-it/src/main/java/io/github/belgif/rest/problem/ControllerInterface.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ public interface ControllerInterface {
1515

1616
@GetMapping("/beanValidation/pathParameter/inherited/{param}")
1717
ResponseEntity<String> beanValidationPathParameterInherited(
18-
@PathVariable("param") @Positive @NotNull Integer param);
18+
@PathVariable("param") @Positive @NotNull Integer p);
1919

2020
@GetMapping("/beanValidation/pathParameter/overridden/{param}")
2121
ResponseEntity<String> beanValidationPathParameterOverridden(
22-
@PathVariable("param") @Positive @NotNull Integer param);
22+
@PathVariable("param") @Positive @NotNull Integer p);
2323

2424
}

belgif-rest-problem-it/belgif-rest-problem-spring-boot-3-it/src/main/java/io/github/belgif/rest/problem/FrontendController.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -170,32 +170,32 @@ public void unmappedFromBackend(@RequestParam("client") Client client) {
170170

171171
@GetMapping("/beanValidation/queryParameter")
172172
public ResponseEntity<String> beanValidationQueryParameter(
173-
@RequestParam("param") @Positive @NotNull Integer param,
174-
@RequestParam("other") @Size(max = 5) String other) {
175-
return ResponseEntity.ok("param: " + param + ", other: " + other);
173+
@RequestParam("param") @Positive @NotNull Integer p,
174+
@RequestParam @Size(max = 5) String other) {
175+
return ResponseEntity.ok("param: " + p + ", other: " + other);
176176
}
177177

178178
@GetMapping("/beanValidation/headerParameter")
179179
public ResponseEntity<String> beanValidationHeaderParameter(
180-
@RequestHeader("param") @Positive @NotNull Integer param) {
181-
return ResponseEntity.ok("param: " + param);
180+
@RequestHeader("param") @Positive @NotNull Integer p) {
181+
return ResponseEntity.ok("param: " + p);
182182
}
183183

184184
@GetMapping("/beanValidation/pathParameter/class/{param}")
185185
public ResponseEntity<String> beanValidationPathParameter(
186-
@PathVariable("param") @Positive @NotNull Integer param) {
187-
return ResponseEntity.ok("param: " + param);
186+
@PathVariable("param") @Positive @NotNull Integer p) {
187+
return ResponseEntity.ok("param: " + p);
188188
}
189189

190190
@Override
191-
public ResponseEntity<String> beanValidationPathParameterInherited(Integer param) {
192-
return ResponseEntity.ok("param: " + param);
191+
public ResponseEntity<String> beanValidationPathParameterInherited(Integer p) {
192+
return ResponseEntity.ok("param: " + p);
193193
}
194194

195195
@Override
196196
@GetMapping("/beanValidation/pathParameter/overridden")
197-
public ResponseEntity<String> beanValidationPathParameterOverridden(@RequestParam Integer param) {
198-
return ResponseEntity.ok("param: " + param);
197+
public ResponseEntity<String> beanValidationPathParameterOverridden(@RequestParam("param") Integer p) {
198+
return ResponseEntity.ok("param: " + p);
199199
}
200200

201201
@PostMapping("/beanValidation/body")
@@ -214,8 +214,8 @@ public ResponseEntity<String> beanValidationBodyInheritance(@Valid @RequestBody
214214
}
215215

216216
@PostMapping("/beanValidation/queryParameter/nested")
217-
public ResponseEntity<String> beanValidationQueryParameterNested(@Valid Model param) {
218-
return ResponseEntity.ok("param: " + param);
217+
public ResponseEntity<String> beanValidationQueryParameterNested(@Valid Model p) {
218+
return ResponseEntity.ok("param: " + p);
219219
}
220220

221221
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package io.github.belgif.rest.problem.jaxrs;
2+
3+
import java.lang.annotation.Annotation;
4+
import java.lang.reflect.Constructor;
5+
import java.lang.reflect.Executable;
6+
import java.lang.reflect.Method;
7+
import java.lang.reflect.Parameter;
8+
import java.util.Arrays;
9+
import java.util.List;
10+
import java.util.concurrent.ConcurrentHashMap;
11+
import java.util.stream.Collectors;
12+
13+
import javax.validation.ParameterNameProvider;
14+
import javax.ws.rs.CookieParam;
15+
import javax.ws.rs.FormParam;
16+
import javax.ws.rs.HeaderParam;
17+
import javax.ws.rs.MatrixParam;
18+
import javax.ws.rs.PathParam;
19+
import javax.ws.rs.QueryParam;
20+
import javax.ws.rs.ext.Provider;
21+
22+
/**
23+
* A ParameterNameProvider that retrieves the parameter name from JAX-RS annotations (if present).
24+
*
25+
* @see ParameterNameProvider
26+
*/
27+
@Provider
28+
public class JaxRsParameterNameProvider implements ParameterNameProvider {
29+
30+
private static final ConcurrentHashMap<Executable, List<String>> PARAMETER_NAME_CACHE = new ConcurrentHashMap<>();
31+
32+
@Override
33+
public List<String> getParameterNames(Constructor<?> constructor) {
34+
return PARAMETER_NAME_CACHE.computeIfAbsent(constructor, this::getParameterNames);
35+
}
36+
37+
@Override
38+
public List<String> getParameterNames(Method method) {
39+
return PARAMETER_NAME_CACHE.computeIfAbsent(method, this::getParameterNames);
40+
}
41+
42+
private List<String> getParameterNames(Executable executable) {
43+
return Arrays.stream(executable.getParameters())
44+
.map(this::getParameterName)
45+
.collect(Collectors.toList());
46+
}
47+
48+
private String getParameterName(Parameter parameter) {
49+
Annotation[] annotations = parameter.getAnnotations();
50+
for (Annotation annotation : annotations) {
51+
if (annotation instanceof QueryParam) {
52+
return ((QueryParam) annotation).value();
53+
} else if (annotation instanceof PathParam) {
54+
return ((PathParam) annotation).value();
55+
} else if (annotation instanceof HeaderParam) {
56+
return ((HeaderParam) annotation).value();
57+
} else if (annotation instanceof CookieParam) {
58+
return ((CookieParam) annotation).value();
59+
} else if (annotation instanceof FormParam) {
60+
return ((FormParam) annotation).value();
61+
} else if (annotation instanceof MatrixParam) {
62+
return ((MatrixParam) annotation).value();
63+
}
64+
}
65+
return parameter.getName();
66+
}
67+
68+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<validation-config xmlns="http://xmlns.jcp.org/xml/ns/validation/configuration"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/validation/configuration http://xmlns.jcp.org/xml/ns/validation/configuration/validation-configuration-2.0.xsd"
5+
version="2.0">
6+
7+
<parameter-name-provider>io.github.belgif.rest.problem.jaxrs.JaxRsParameterNameProvider</parameter-name-provider>
8+
9+
</validation-config>

0 commit comments

Comments
 (0)