Skip to content

Commit 2ec555c

Browse files
committed
Add support validation annotations extensions.
1 parent 47b9836 commit 2ec555c

9 files changed

Lines changed: 809 additions & 64 deletions

File tree

openapi-generator/src/main/java/io/micronaut/openapi/generator/Utils.java

Lines changed: 81 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -156,20 +156,34 @@ private static String genericAnnotations(CodegenProperty prop, boolean isGenerat
156156
return result.toString();
157157
}
158158

159+
var patternMsg = (String) prop.vendorExtensions.get("x-pattern-message");
160+
var sizeMsg = (String) prop.vendorExtensions.get("x-size-message");
161+
var notNullMsg = (String) prop.vendorExtensions.get("x-not-null-message");
162+
var minMsg = (String) prop.vendorExtensions.get("x-min-message");
163+
var maxMsg = (String) prop.vendorExtensions.get("x-max-message");
164+
159165
if (StringUtils.isNotEmpty(prop.pattern) && !prop.isDate && !prop.isDateTime) {
160-
if ("email".equals(type)) {
166+
if ("email".equals(type) || "email".equalsIgnoreCase(prop.dataFormat) || prop.isEmail) {
161167
result.append("@Email(regexp = \"");
162168
} else {
163169
result.append("@Pattern(regexp = \"");
164170
}
165-
result.append(prop.pattern).append("\") ");
171+
result.append(prop.pattern).append("\"");
172+
if (patternMsg != null) {
173+
result.append(", message = \"").append(patternMsg).append("\"");
174+
}
175+
result.append(") ");
166176
}
167177

168178
var containsNotEmpty = false;
169179

170180
if (prop.minLength != null || prop.maxLength != null) {
171181
if (prop.minLength != null && prop.minLength == 1 && prop.maxLength == null && !prop.isNullable) {
172-
result.append("@NotEmpty ");
182+
result.append("@NotEmpty");
183+
if (sizeMsg != null) {
184+
result.append("(message = \"").append(sizeMsg).append("\")");
185+
}
186+
result.append(' ');
173187
containsNotEmpty = true;
174188
} else {
175189
result.append("@Size(");
@@ -182,6 +196,9 @@ private static String genericAnnotations(CodegenProperty prop, boolean isGenerat
182196
}
183197
result.append("max = ").append(prop.maxLength);
184198
}
199+
if (sizeMsg != null) {
200+
result.append(", message = \"").append(sizeMsg).append('"');
201+
}
185202
result.append(") ");
186203
}
187204
}
@@ -201,6 +218,9 @@ private static String genericAnnotations(CodegenProperty prop, boolean isGenerat
201218
}
202219
result.append("max = ").append(prop.maxItems);
203220
}
221+
if (sizeMsg != null) {
222+
result.append(", message = \"").append(sizeMsg).append('"');
223+
}
204224
result.append(") ");
205225
}
206226
}
@@ -211,7 +231,11 @@ private static String genericAnnotations(CodegenProperty prop, boolean isGenerat
211231
result.append("@Nullable ");
212232
}
213233
} else if (!containsNotEmpty) {
214-
result.append("@NotNull ");
234+
result.append("@NotNull");
235+
if (notNullMsg != null) {
236+
result.append("(message = \"").append(notNullMsg).append("\")");
237+
}
238+
result.append(" ");
215239
}
216240
if (StringUtils.isNotEmpty(prop.minimum)) {
217241
try {
@@ -220,21 +244,43 @@ private static String genericAnnotations(CodegenProperty prop, boolean isGenerat
220244
longNumber++;
221245
}
222246
if (longNumber == 0 && StringUtils.isEmpty(prop.maximum)) {
223-
result.append("@PositiveOrZero ");
247+
result.append("@PositiveOrZero");
248+
if (minMsg != null) {
249+
result.append("(message = \"").append(minMsg).append("\")");
250+
}
251+
result.append(" ");
224252
} else if (longNumber == 1 && StringUtils.isEmpty(prop.maximum)) {
225-
result.append("@Positive ");
253+
result.append("@Positive");
254+
if (minMsg != null) {
255+
result.append("(message = \"").append(minMsg).append("\")");
256+
}
257+
result.append(" ");
226258
} else {
227-
result.append("@Min(").append(longNumber).append(") ");
259+
result.append("@Min(");
260+
if (minMsg != null) {
261+
result.append("value = ");
262+
}
263+
result.append(longNumber);
264+
if (prop.isLong) {
265+
result.append("L");
266+
}
267+
if (minMsg != null) {
268+
result.append(", message = \"").append(minMsg).append("\"");
269+
}
270+
result.append(") ");
228271
}
229272
} catch (Exception e) {
230273
result.append("@DecimalMin(");
231-
if (prop.exclusiveMinimum) {
274+
if (prop.exclusiveMinimum || minMsg != null) {
232275
result.append("value = ");
233276
}
234277
result.append('"').append(prop.minimum).append('"');
235278
if (prop.exclusiveMinimum) {
236279
result.append(", inclusive = false");
237280
}
281+
if (minMsg != null) {
282+
result.append(", message = \"").append(minMsg).append("\"");
283+
}
238284
result.append(") ");
239285
}
240286
}
@@ -245,21 +291,44 @@ private static String genericAnnotations(CodegenProperty prop, boolean isGenerat
245291
longNumber--;
246292
}
247293
if (longNumber == 0 && StringUtils.isEmpty(prop.minimum)) {
248-
result.append("@NegativeOrZero ");
294+
result.append("@NegativeOrZero");
295+
if (maxMsg != null) {
296+
result.append("(message = \"").append(maxMsg).append("\")");
297+
}
298+
result.append(" ");
249299
} else if (longNumber == -1 && StringUtils.isEmpty(prop.minimum)) {
250-
result.append("@Negative ");
300+
result.append("@Negative");
301+
if (maxMsg != null) {
302+
result.append("(message = \"").append(maxMsg).append("\")");
303+
}
304+
result.append(" ");
251305
} else {
252-
result.append("@Max(").append(longNumber).append(") ");
306+
result.append("@Max(");
307+
if (maxMsg != null) {
308+
result.append("value = ");
309+
}
310+
result.append(longNumber);
311+
if (prop.isLong) {
312+
result.append("L");
313+
}
314+
if (maxMsg != null) {
315+
result.append(", message = \"").append(maxMsg).append("\"");
316+
}
317+
result.append(") ");
318+
253319
}
254320
} catch (Exception e) {
255321
result.append("@DecimalMax(");
256-
if (prop.exclusiveMaximum) {
322+
if (prop.exclusiveMaximum || maxMsg != null) {
257323
result.append("value = ");
258324
}
259325
result.append('"').append(prop.maximum).append('"');
260326
if (prop.exclusiveMaximum) {
261327
result.append(", inclusive = false");
262328
}
329+
if (maxMsg != null) {
330+
result.append(", message = \"").append(maxMsg).append("\"");
331+
}
263332
result.append(") ");
264333
}
265334
}

openapi-generator/src/main/resources/templates/java-micronaut/common/params/validation.mustache

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
{{^isNullable}}
3838
{{#required}}
3939
{{^isReadOnly}}
40-
@NotNull
40+
@NotNull{{#vendorExtensions.x-not-null-message}}(message = "{{{.}}}"){{/vendorExtensions.x-not-null-message}}
4141
{{/isReadOnly}}
4242
{{/required}}
4343
{{/isNullable}}
@@ -50,63 +50,63 @@
5050
{{/isContainer}}
5151
{{!Pattern}}
5252
{{#pattern}}
53-
{{^isByteArray}}{{^isDate}}{{^isDateTime}}
54-
@Pattern(regexp = "{{{pattern}}}")
55-
{{/isDateTime}}{{/isDate}}{{/isByteArray}}
53+
{{^isEmail}}{{^isByteArray}}{{^isDate}}{{^isDateTime}}
54+
@Pattern(regexp = "{{{pattern}}}"{{#vendorExtensions.x-pattern-message}}, message = "{{{.}}}"{{/vendorExtensions.x-pattern-message}})
55+
{{/isDateTime}}{{/isDate}}{{/isByteArray}}{{/isEmail}}
5656
{{/pattern}}
5757
{{!Min length && max length}}
5858
{{#minLength}}
5959
{{#maxLength}}
60-
@Size(min = {{minLength}}, max = {{maxLength}})
60+
@Size(min = {{minLength}}, max = {{maxLength}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
6161
{{/maxLength}}
6262
{{/minLength}}
6363
{{#minLength}}{{^maxLength}}
64-
@Size(min = {{minLength}})
64+
@Size(min = {{minLength}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
6565
{{/maxLength}}{{/minLength}}
6666
{{^minLength}}{{#maxLength}}
67-
@Size(max = {{maxLength}})
67+
@Size(max = {{maxLength}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
6868
{{/maxLength}}{{/minLength}}
6969
{{!Size}}
7070
{{#minItems}}{{#maxItems}}
71-
@Size(min = {{minItems}}, max = {{maxItems}})
71+
@Size(min = {{minItems}}, max = {{maxItems}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
7272
{{/maxItems}}{{/minItems}}
7373
{{#minItems}}{{^maxItems}}
74-
@Size(min = {{minItems}})
74+
@Size(min = {{minItems}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
7575
{{/maxItems}}{{/minItems}}
7676
{{^minItems}}{{#maxItems}}
77-
@Size(max = {{maxItems}})
77+
@Size(max = {{maxItems}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
7878
{{/maxItems}}{{/minItems}}
7979
{{!Email}}
8080
{{#isEmail}}
81-
@Email
81+
@Email{{#pattern}}(regexp = "{{{pattern}}}"{{#vendorExtensions.x-pattern-message}}, message = "{{{.}}}"{{/vendorExtensions.x-pattern-message}}){{/pattern}}{{^pattern}}{{#vendorExtensions.x-pattern-message}}(message = "{{{.}}}"){{/vendorExtensions.x-pattern-message}}{{/pattern}}
8282
{{/isEmail}}
8383
{{!check for integer or long / all others=decimal type with @Decimal isInteger set}}
8484
{{#isInteger}}
8585
{{#minimum}}
86-
@Min({{minimum}})
86+
@Min({{#vendorExtensions.x-min-message}}value = {{/vendorExtensions.x-min-message}}{{{.}}}{{#vendorExtensions.x-min-message}}, message = "{{{.}}}"{{/vendorExtensions.x-min-message}})
8787
{{/minimum}}
8888
{{#maximum}}
89-
@Max({{maximum}})
89+
@Max({{#vendorExtensions.x-max-message}}value = {{/vendorExtensions.x-max-message}}{{{.}}}{{#vendorExtensions.x-max-message}}, message = "{{{.}}}"{{/vendorExtensions.x-max-message}})
9090
{{/maximum}}
9191
{{/isInteger}}
9292
{{!isLong set}}
9393
{{#isLong}}
9494
{{#minimum}}
95-
@Min({{minimum}}L)
95+
@Min({{#vendorExtensions.x-min-message}}value = {{/vendorExtensions.x-min-message}}{{{.}}}L{{#vendorExtensions.x-min-message}}, message = "{{{.}}}"{{/vendorExtensions.x-min-message}})
9696
{{/minimum}}
9797
{{#maximum}}
98-
@Max({{maximum}}L)
98+
@Max({{#vendorExtensions.x-max-message}}value = {{/vendorExtensions.x-max-message}}{{{.}}}L{{#vendorExtensions.x-max-message}}, message = "{{{.}}}"{{/vendorExtensions.x-max-message}})
9999
{{/maximum}}
100100
{{/isLong}}
101101
{{!Not Integer, not Long => we have a decimal value!}}
102102
{{^isInteger}}
103103
{{^isLong}}{{!minimum for decimal value}}
104104
{{#minimum}}
105-
@DecimalMin({{#exclusiveMinimum}}value = {{/exclusiveMinimum}}"{{minimum}}"{{#exclusiveMinimum}}, inclusive = false{{/exclusiveMinimum}})
105+
@DecimalMin({{#exclusiveMinimum}}value = {{/exclusiveMinimum}}{{^exclusiveMinimum}}{{#vendorExtensions.x-min-message}}value = {{/vendorExtensions.x-min-message}}{{/exclusiveMinimum}}"{{minimum}}"{{#exclusiveMinimum}}, inclusive = false{{/exclusiveMinimum}}{{#vendorExtensions.x-min-message}}, message = "{{{.}}}"{{/vendorExtensions.x-min-message}})
106106
{{/minimum}}
107107
{{!maximal for decimal value}}
108108
{{#maximum}}
109-
@DecimalMax({{#exclusiveMaximum}}value = {{/exclusiveMaximum}}"{{maximum}}"{{#exclusiveMaximum}}, inclusive = false{{/exclusiveMaximum}})
109+
@DecimalMax({{#exclusiveMaximum}}value = {{/exclusiveMaximum}}{{^exclusiveMaximum}}{{#vendorExtensions.x-max-message}}value = {{/vendorExtensions.x-max-message}}{{/exclusiveMaximum}}"{{maximum}}"{{#exclusiveMaximum}}, inclusive = false{{/exclusiveMaximum}}{{#vendorExtensions.x-max-message}}, message = "{{{.}}}"{{/vendorExtensions.x-max-message}})
110110
{{/maximum}}
111111
{{/isLong}}
112112
{{/isInteger}}

openapi-generator/src/main/resources/templates/kotlin-micronaut/common/params/validation.mustache

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
{{^isNullable}}
1818
{{#required}}
1919
{{^isReadOnly}}
20-
@NotNull
20+
@NotNull{{#vendorExtensions.x-not-null-message}}(message = "{{{.}}}"){{/vendorExtensions.x-not-null-message}}
2121
{{/isReadOnly}}
2222
{{/required}}
2323
{{/isNullable}}
@@ -30,63 +30,63 @@
3030
{{/isContainer}}
3131
{{!Pattern}}
3232
{{#pattern}}
33-
{{^isByteArray}}{{^isDate}}{{^isDateTime}}
34-
@Pattern(regexp = "{{{pattern}}}")
35-
{{/isDateTime}}{{/isDate}}{{/isByteArray}}
33+
{{^isEmail}}{{^isByteArray}}{{^isDate}}{{^isDateTime}}
34+
@Pattern(regexp = "{{{pattern}}}"{{#vendorExtensions.x-pattern-message}}, message = "{{{.}}}"{{/vendorExtensions.x-pattern-message}})
35+
{{/isDateTime}}{{/isDate}}{{/isByteArray}}{{/isEmail}}
3636
{{/pattern}}
3737
{{!Min length && max length}}
3838
{{#minLength}}
3939
{{#maxLength}}
40-
@Size(min = {{minLength}}, max = {{maxLength}})
40+
@Size(min = {{minLength}}, max = {{maxLength}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
4141
{{/maxLength}}
4242
{{/minLength}}
4343
{{#minLength}}{{^maxLength}}
44-
@Size(min = {{minLength}})
44+
@Size(min = {{minLength}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
4545
{{/maxLength}}{{/minLength}}
4646
{{^minLength}}{{#maxLength}}
47-
@Size(max = {{maxLength}})
47+
@Size(max = {{maxLength}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
4848
{{/maxLength}}{{/minLength}}
4949
{{!Size}}
5050
{{#minItems}}{{#maxItems}}
51-
@Size(min = {{minItems}}, max = {{maxItems}})
51+
@Size(min = {{minItems}}, max = {{maxItems}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
5252
{{/maxItems}}{{/minItems}}
5353
{{#minItems}}{{^maxItems}}
54-
@Size(min = {{minItems}})
54+
@Size(min = {{minItems}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
5555
{{/maxItems}}{{/minItems}}
5656
{{^minItems}}{{#maxItems}}
57-
@Size(max = {{maxItems}})
57+
@Size(max = {{maxItems}}{{#vendorExtensions.x-size-message}}, message = "{{{.}}}"{{/vendorExtensions.x-size-message}})
5858
{{/maxItems}}{{/minItems}}
5959
{{!Email}}
6060
{{#isEmail}}
61-
@Email
61+
@Email{{#pattern}}(regexp = "{{{pattern}}}"{{#vendorExtensions.x-pattern-message}}, message = "{{{.}}}"{{/vendorExtensions.x-pattern-message}}){{/pattern}}{{^pattern}}{{#vendorExtensions.x-pattern-message}}(message = "{{{.}}}"){{/vendorExtensions.x-pattern-message}}{{/pattern}}
6262
{{/isEmail}}
6363
{{!check for integer or long / all others=decimal type with @Decimal isInteger set}}
6464
{{#isInteger}}
6565
{{#minimum}}
66-
@Min({{minimum}})
66+
@Min({{#vendorExtensions.x-min-message}}value = {{/vendorExtensions.x-min-message}}{{{.}}}{{#vendorExtensions.x-min-message}}, message = "{{{.}}}"{{/vendorExtensions.x-min-message}})
6767
{{/minimum}}
6868
{{#maximum}}
69-
@Max({{maximum}})
69+
@Max({{#vendorExtensions.x-max-message}}value = {{/vendorExtensions.x-max-message}}{{{.}}}{{#vendorExtensions.x-max-message}}, message = "{{{.}}}"{{/vendorExtensions.x-max-message}})
7070
{{/maximum}}
7171
{{/isInteger}}
7272
{{!isLong set}}
7373
{{#isLong}}
7474
{{#minimum}}
75-
@Min({{minimum}}L)
75+
@Min({{#vendorExtensions.x-min-message}}value = {{/vendorExtensions.x-min-message}}{{{.}}}L{{#vendorExtensions.x-min-message}}, message = "{{{.}}}"{{/vendorExtensions.x-min-message}})
7676
{{/minimum}}
7777
{{#maximum}}
78-
@Max({{maximum}}L)
78+
@Max({{#vendorExtensions.x-max-message}}value = {{/vendorExtensions.x-max-message}}{{{.}}}L{{#vendorExtensions.x-max-message}}, message = "{{{.}}}"{{/vendorExtensions.x-max-message}})
7979
{{/maximum}}
8080
{{/isLong}}
8181
{{!Not Integer, not Long => we have a decimal value!}}
8282
{{^isInteger}}
8383
{{^isLong}}{{!minimum for decimal value}}
8484
{{#minimum}}
85-
@DecimalMin({{#exclusiveMinimum}}value = {{/exclusiveMinimum}}"{{minimum}}"{{#exclusiveMinimum}}, inclusive = false{{/exclusiveMinimum}})
85+
@DecimalMin({{#exclusiveMinimum}}value = {{/exclusiveMinimum}}{{^exclusiveMinimum}}{{#vendorExtensions.x-min-message}}value = {{/vendorExtensions.x-min-message}}{{/exclusiveMinimum}}"{{minimum}}"{{#exclusiveMinimum}}, inclusive = false{{/exclusiveMinimum}}{{#vendorExtensions.x-min-message}}, message = "{{{.}}}"{{/vendorExtensions.x-min-message}})
8686
{{/minimum}}
8787
{{!maximal for decimal value}}
8888
{{#maximum}}
89-
@DecimalMax({{#exclusiveMaximum}}value = {{/exclusiveMaximum}}"{{maximum}}"{{#exclusiveMaximum}}, inclusive = false{{/exclusiveMaximum}})
89+
@DecimalMax({{#exclusiveMaximum}}value = {{/exclusiveMaximum}}{{^exclusiveMaximum}}{{#vendorExtensions.x-max-message}}value = {{/vendorExtensions.x-max-message}}{{/exclusiveMaximum}}"{{maximum}}"{{#exclusiveMaximum}}, inclusive = false{{/exclusiveMaximum}}{{#vendorExtensions.x-max-message}}, message = "{{{.}}}"{{/vendorExtensions.x-max-message}})
9090
{{/maximum}}
9191
{{/isLong}}
9292
{{/isInteger}}

0 commit comments

Comments
 (0)