Skip to content

Commit 5e5832d

Browse files
authored
Javalin fixes and validation (#20981)
* Fix for problems when a nullable parameter has a default value When a default value is present the parameter is moved to non-nullable. This works because we could replace the null with a default value. This will actually set the default value. * Adds (optional) validation to the beans. Option to set: `useBeanValidation` to `true`. This will insert validation rules from the `jakarta.validation` package much like it does with the spring generator. Aso sneaked in `JsonProperty` annotations in order to more formally adhere to the name in the spec as opposed to configuring ObjectMappers in order to translate names to match the spec. * Update samples * Fix for required headerParams
1 parent 045a9c1 commit 5e5832d

File tree

28 files changed

+233
-5
lines changed

28 files changed

+233
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{{#isContainer}}{{^isPrimitiveType}}{{^isEnum}}
2+
@field:jakarta.validation.Valid{{/isEnum}}{{/isPrimitiveType}}{{/isContainer}}{{!
3+
}}{{^isContainer}}{{^isPrimitiveType}}{{^isNumber}}{{^isUuid}}{{^isDateTime}}
4+
@field:jakarta.validation.Valid{{/isDateTime}}{{/isUuid}}{{/isNumber}}{{/isPrimitiveType}}{{/isContainer}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{{!
2+
format: email
3+
}}{{#isEmail}}
4+
@field:jakarta.validation.constraints.Email{{/isEmail}}{{!
5+
pattern set
6+
}}{{#pattern}}
7+
@field:jakarta.validation.constraints.Pattern(regexp="{{{pattern}}}"{{#vendorExtensions.x-pattern-message}}, message="{{vendorExtensions.x-pattern-message}}"{{/vendorExtensions.x-pattern-message}}){{/pattern}}{{!
8+
minLength && maxLength set
9+
}}{{#minLength}}{{#maxLength}}
10+
@field:jakarta.validation.constraints.Size(min={{minLength}},max={{maxLength}}){{/maxLength}}{{/minLength}}{{!
11+
minLength set, maxLength not
12+
}}{{#minLength}}{{^maxLength}}
13+
@field:jakarta.validation.constraints.Size(min={{minLength}}){{/maxLength}}{{/minLength}}{{!
14+
minLength not set, maxLength set
15+
}}{{^minLength}}{{#maxLength}}
16+
@field:jakarta.validation.constraints.Size(max={{.}}){{/maxLength}}{{/minLength}}{{!
17+
@Size: minItems && maxItems set
18+
}}{{#minItems}}{{#maxItems}}
19+
@field:jakarta.validation.constraints.Size(min={{minItems}},max={{maxItems}}) {{/maxItems}}{{/minItems}}{{!
20+
@Size: minItems set, maxItems not
21+
}}{{#minItems}}{{^maxItems}}
22+
@field:jakarta.validation.constraints.Size(min={{minItems}}){{/maxItems}}{{/minItems}}{{!
23+
@Size: minItems not set && maxItems set
24+
}}{{^minItems}}{{#maxItems}}
25+
@field:jakarta.validation.constraints.Size(max={{.}}){{/maxItems}}{{/minItems}}{{!
26+
check for integer or long / all others=decimal type with @Decimal*
27+
isInteger set
28+
}}{{#isInteger}}{{#minimum}}
29+
@field:jakarta.validation.constraints.Min({{.}}){{/minimum}}{{#maximum}}
30+
@field:jakarta.validation.constraints.Max({{.}}){{/maximum}}{{/isInteger}}{{!
31+
isLong set
32+
}}{{#isLong}}{{#minimum}}
33+
@field:jakarta.validation.constraints.Min({{.}}L){{/minimum}}{{#maximum}}
34+
@field:jakarta.validation.constraints.Max({{.}}L){{/maximum}}{{/isLong}}{{!
35+
Not Integer, not Long => we have a decimal value!
36+
}}{{^isInteger}}{{^isLong}}{{#minimum}}
37+
@field:jakarta.validation.constraints.DecimalMin("{{.}}"){{/minimum}}{{#maximum}}
38+
@field:jakarta.validation.constraints.DecimalMax("{{.}}"){{/maximum}}{{/isLong}}{{/isInteger}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{{#description}}
2+
/* {{{.}}} */
3+
{{/description}}
4+
{{#useBeanValidation}}{{>beanValidation}}{{>beanValidationModel}}{{/useBeanValidation}}
5+
@field:com.fasterxml.jackson.annotation.JsonProperty("{{{baseName}}}")
6+
{{>modelMutable}} {{{name}}}: {{#isEnum}}{{{classname}}}.{{{nameInPascalCase}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{{defaultValue}}}{{^defaultValue}}null{{/defaultValue}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{{#description}}
2+
/* {{{.}}} */
3+
{{/description}}
4+
{{#useBeanValidation}}{{>beanValidation}}{{>beanValidationModel}}{{/useBeanValidation}}
5+
@field:com.fasterxml.jackson.annotation.JsonProperty("{{{baseName}}}")
6+
{{>modelMutable}} {{{name}}}: {{#isEnum}}{{{classname}}}.{{{nameInPascalCase}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}}{{#defaultValue}} = {{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{{#defaultValue}} ?:{{#isInteger}}{{{defaultValue}}}{{/isInteger}}{{#isLong}}{{{defaultValue}}}L{{/isLong}}{{#isShort}}{{{defaultValue}}}.toShort(){{/isShort}}{{#isDouble}}{{{defaultValue}}}.toDouble(){{/isDouble}}{{#isFloat}}{{{defaultValue}}}f{{/isFloat}}{{#isEnum}}{{{dataType}}}.valueOf("{{{defaultValue}}}"){{/isEnum}}{{#isBoolean}}{{{defaultValue}}}{{/isBoolean}}{{#isString}}"{{{defaultValue}}}"{{/isString}}{{#isUuid}}"UUID.fromString({{{defaultValue}}})"{{/isUuid}}{{#isUuid}}"UUID.fromString({{{defaultValue}}})"{{/isUuid}}
2+
{{/defaultValue}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isPathParam}}ctx.pathParamAsClass<{{{dataType}}}>("{{baseName}}").get(){{/isPathParam}}
1+
{{#isPathParam}}ctx.pathParamAsClass<{{{dataType}}}>("{{baseName}}").get(){{>paramDefault}}{{/isPathParam}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isQueryParam}}{{#isArray}}ctx.queryParams("{{baseName}}"){{/isArray}}{{^isArray}}ctx.queryParamAsClass<String>("{{baseName}}").get(){{/isArray}}{{/isQueryParam}}
1+
{{#isQueryParam}}{{#isArray}}ctx.queryParams("{{baseName}}"){{/isArray}}{{^isArray}}ctx.queryParamAsClass<String>("{{baseName}}").get(){{>paramDefault}}{{/isArray}}{{/isQueryParam}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{{#isContainer}}{{^isPrimitiveType}}{{^isEnum}}
2+
@field:jakarta.validation.Valid{{/isEnum}}{{/isPrimitiveType}}{{/isContainer}}{{!
3+
}}{{^isContainer}}{{^isPrimitiveType}}{{^isNumber}}{{^isUuid}}{{^isDateTime}}
4+
@field:jakarta.validation.Valid{{/isDateTime}}{{/isUuid}}{{/isNumber}}{{/isPrimitiveType}}{{/isContainer}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{{!
2+
format: email
3+
}}{{#isEmail}}
4+
@field:jakarta.validation.constraints.Email{{/isEmail}}{{!
5+
pattern set
6+
}}{{#pattern}}
7+
@field:jakarta.validation.constraints.Pattern(regexp="{{{pattern}}}"{{#vendorExtensions.x-pattern-message}}, message="{{vendorExtensions.x-pattern-message}}"{{/vendorExtensions.x-pattern-message}}){{/pattern}}{{!
8+
minLength && maxLength set
9+
}}{{#minLength}}{{#maxLength}}
10+
@field:jakarta.validation.constraints.Size(min={{minLength}},max={{maxLength}}){{/maxLength}}{{/minLength}}{{!
11+
minLength set, maxLength not
12+
}}{{#minLength}}{{^maxLength}}
13+
@field:jakarta.validation.constraints.Size(min={{minLength}}){{/maxLength}}{{/minLength}}{{!
14+
minLength not set, maxLength set
15+
}}{{^minLength}}{{#maxLength}}
16+
@field:jakarta.validation.constraints.Size(max={{.}}){{/maxLength}}{{/minLength}}{{!
17+
@Size: minItems && maxItems set
18+
}}{{#minItems}}{{#maxItems}}
19+
@field:jakarta.validation.constraints.Size(min={{minItems}},max={{maxItems}}) {{/maxItems}}{{/minItems}}{{!
20+
@Size: minItems set, maxItems not
21+
}}{{#minItems}}{{^maxItems}}
22+
@field:jakarta.validation.constraints.Size(min={{minItems}}){{/maxItems}}{{/minItems}}{{!
23+
@Size: minItems not set && maxItems set
24+
}}{{^minItems}}{{#maxItems}}
25+
@field:jakarta.validation.constraints.Size(max={{.}}){{/maxItems}}{{/minItems}}{{!
26+
check for integer or long / all others=decimal type with @Decimal*
27+
isInteger set
28+
}}{{#isInteger}}{{#minimum}}
29+
@field:jakarta.validation.constraints.Min({{.}}){{/minimum}}{{#maximum}}
30+
@field:jakarta.validation.constraints.Max({{.}}){{/maximum}}{{/isInteger}}{{!
31+
isLong set
32+
}}{{#isLong}}{{#minimum}}
33+
@field:jakarta.validation.constraints.Min({{.}}L){{/minimum}}{{#maximum}}
34+
@field:jakarta.validation.constraints.Max({{.}}L){{/maximum}}{{/isLong}}{{!
35+
Not Integer, not Long => we have a decimal value!
36+
}}{{^isInteger}}{{^isLong}}{{#minimum}}
37+
@field:jakarta.validation.constraints.DecimalMin("{{.}}"){{/minimum}}{{#maximum}}
38+
@field:jakarta.validation.constraints.DecimalMax("{{.}}"){{/maximum}}{{/isLong}}{{/isInteger}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{{#description}}
2+
/* {{{.}}} */
3+
{{/description}}
4+
{{#useBeanValidation}}{{>beanValidation}}{{>beanValidationModel}}{{/useBeanValidation}}
5+
@field:com.fasterxml.jackson.annotation.JsonProperty("{{{baseName}}}")
6+
{{>modelMutable}} {{{name}}}: {{#isEnum}}{{{classname}}}.{{{nameInPascalCase}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{{defaultValue}}}{{^defaultValue}}null{{/defaultValue}}

0 commit comments

Comments
 (0)