Skip to content

Commit e682ffe

Browse files
nkwiatkowskinKwiatkowski
andcommitted
fix(core): override micronaut DefaultParameterNameProvider to fix a bug where he uses the metadata to instantiate a bean (#14936)
Co-authored-by: nKwiatkowski <nkwiatkowski@kestra.io>
1 parent ed7c5ea commit e682ffe

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package io.micronaut.configuration.hibernate.validator;
2+
3+
import io.micronaut.context.annotation.Replaces;
4+
import jakarta.inject.Singleton;
5+
import jakarta.validation.ParameterNameProvider;
6+
import java.lang.reflect.Constructor;
7+
import java.lang.reflect.Executable;
8+
import java.lang.reflect.Method;
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
12+
@Singleton
13+
@Replaces(DefaultParameterNameProvider.class)
14+
public class OverrideParameterNameProvider implements ParameterNameProvider {
15+
16+
private final DefaultParameterNameProvider delegate;
17+
18+
public OverrideParameterNameProvider(DefaultParameterNameProvider delegate) {
19+
this.delegate = delegate;
20+
}
21+
22+
@Override
23+
public List<String> getParameterNames(Constructor<?> constructor) {
24+
return normalize(constructor, delegate.getParameterNames(constructor));
25+
}
26+
27+
@Override
28+
public List<String> getParameterNames(Method method) {
29+
return normalize(method, delegate.getParameterNames(method));
30+
}
31+
32+
private List<String> normalize(Executable exec, List<String> names) {
33+
int paramCount = exec.getParameterCount();
34+
35+
if (names.size() == paramCount) {
36+
return names;
37+
}
38+
39+
// Trim extra names (Micronaut internal params leak)
40+
if (names.size() > paramCount) {
41+
return new ArrayList<>(names.subList(0, paramCount));
42+
}
43+
44+
// Pad missing names to avoid Hibernate Validator crash
45+
List<String> normalized = new ArrayList<>(paramCount);
46+
normalized.addAll(names);
47+
48+
for (int i = names.size(); i < paramCount; i++) {
49+
normalized.add("arg" + i);
50+
}
51+
52+
return normalized;
53+
}
54+
}

0 commit comments

Comments
 (0)