diff --git a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/application.mustache b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/application.mustache index c8a2d02d746..139e83e56cc 100644 --- a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/application.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/application.mustache @@ -17,6 +17,17 @@ play.filters.headers.contentSecurityPolicy=null +{{#useBeanValidation}} +# When using bean validation with the swagger api, the validator will check that every constraint is respected +# This is very useful when testing but could add a lot of overhead if you return a lot of data. Benchmark have +# shown that the time it takes to validate is exponential. +# If this is a concern in your application, or if you don't want to validate the output coming from your API for +# respecting its contract, set the "output" property below to "false". Since there is not a lot of data as input for +# an endpoint, I highly suggest you let the "input" property set to true. +useInputBeanValidation=true +useOutputBeanValidation=true +{{/useBeanValidation}} + {{#handleExceptions}} play.http.errorHandler="swagger.ErrorHandler" {{/handleExceptions}} diff --git a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/conversionBegin.mustache b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/conversionBegin.mustache index ef61e4943bc..69001e01d84 100644 --- a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/conversionBegin.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/conversionBegin.mustache @@ -1 +1 @@ -{{#isBoolean}}Boolean.valueOf({{/isBoolean}}{{#isInteger}}Integer.parseInt({{/isInteger}}{{#isDouble}}Double.parseDouble({{/isDouble}}{{#isLong}}Long.parseLong({{/isLong}}{{#isFloat}}Float.parseFloat({{/isFloat}}{{#isUuid}}UUID.fromString({{/isUuid}}{{#isDateTime}}OffsetDateTime.parse({{/isDateTime}} \ No newline at end of file +{{#isBoolean}}Boolean.valueOf({{/isBoolean}}{{#isInteger}}Integer.parseInt({{/isInteger}}{{#isDouble}}Double.parseDouble({{/isDouble}}{{#isLong}}Long.parseLong({{/isLong}}{{#isFloat}}Float.parseFloat({{/isFloat}}{{#isUuid}}UUID.fromString({{/isUuid}}{{#isDateTime}}OffsetDateTime.parse({{/isDateTime}}{{#isDate}}LocalDate.parse({{/isDate}}{{#isByteArray}}{{/isByteArray}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/conversionEnd.mustache b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/conversionEnd.mustache index ece85da5a28..fc7e52c40e8 100644 --- a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/conversionEnd.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/conversionEnd.mustache @@ -1 +1 @@ -{{#isBoolean}}){{/isBoolean}}{{#isInteger}}){{/isInteger}}{{#isDouble}}){{/isDouble}}{{#isLong}}){{/isLong}}{{#isFloat}}){{/isFloat}}{{#isUuid}}){{/isUuid}}{{#isDateTime}}){{/isDateTime}} \ No newline at end of file +{{#isBoolean}}){{/isBoolean}}{{#isInteger}}){{/isInteger}}{{#isDouble}}){{/isDouble}}{{#isLong}}){{/isLong}}{{#isFloat}}){{/isFloat}}{{#isUuid}}){{/isUuid}}{{#isDateTime}}){{/isDateTime}}{{#isDate}}){{/isDate}}{{#isByteArray}}.getBytes(){{/isByteArray}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/itemConversionBegin.mustache b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/itemConversionBegin.mustache index 42bcc99d36a..962109d36db 100644 --- a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/itemConversionBegin.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/itemConversionBegin.mustache @@ -1 +1 @@ -{{#items.isBoolean}}Boolean.valueOf({{/items.isBoolean}}{{#items.isInteger}}Integer.parseInt({{/items.isInteger}}{{#items.isDouble}}Double.parseDouble({{/items.isDouble}}{{#items.isLong}}Long.parseLong({{/items.isLong}}{{#items.isFloat}}Float.parseFloat({{/items.isFloat}}{{#items.isUuid}}UUID.fromString({{/items.isUuid}}{{#items.isDateTime}}OffsetDateTime.parse({{/items.isDateTime}} \ No newline at end of file +{{#items.isBoolean}}Boolean.valueOf({{/items.isBoolean}}{{#items.isInteger}}Integer.parseInt({{/items.isInteger}}{{#items.isDouble}}Double.parseDouble({{/items.isDouble}}{{#items.isLong}}Long.parseLong({{/items.isLong}}{{#items.isFloat}}Float.parseFloat({{/items.isFloat}}{{#items.isUuid}}UUID.fromString({{/items.isUuid}}{{#items.isDateTime}}OffsetDateTime.parse({{/items.isDateTime}}{{#items.isDate}}LocalDate.parse({{/items.isDate}}{{#isByteArray}}{{/isByteArray}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/itemConversionEnd.mustache b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/itemConversionEnd.mustache index cb202e4325e..771cf4f349d 100644 --- a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/itemConversionEnd.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/itemConversionEnd.mustache @@ -1 +1 @@ -{{#items.isBoolean}}){{/items.isBoolean}}{{#items.isInteger}}){{/items.isInteger}}{{#items.isDouble}}){{/items.isDouble}}{{#items.isLong}}){{/items.isLong}}{{#items.isFloat}}){{/items.isFloat}}{{#items.isUuid}}){{/items.isUuid}}{{#items.isDateTime}}){{/items.isDateTime}} \ No newline at end of file +{{#items.isBoolean}}){{/items.isBoolean}}{{#items.isInteger}}){{/items.isInteger}}{{#items.isDouble}}){{/items.isDouble}}{{#items.isLong}}){{/items.isLong}}{{#items.isFloat}}){{/items.isFloat}}{{#items.isUuid}}){{/items.isUuid}}{{#items.isDateTime}}){{/items.isDateTime}}{{#items.isDate}}){{/items.isDate}}{{#isByteArray}}.getBytes(){{/isByteArray}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/newApiController.mustache b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/newApiController.mustache index 0d7345a93b9..9f20541d056 100644 --- a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/newApiController.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/newApiController.mustache @@ -21,6 +21,7 @@ import com.fasterxml.jackson.core.type.TypeReference; {{#useBeanValidation}} import javax.validation.constraints.*; +import play.Configuration; {{/useBeanValidation}} {{#wrapCalls}} @@ -35,13 +36,19 @@ public class {{classname}}Controller extends Controller { private final {{classname}}ControllerImp{{#useInterfaces}}Interface{{/useInterfaces}} imp; {{/controllerOnly}} private final ObjectMapper mapper; + {{#useBeanValidation}} + private final Configuration configuration; + {{/useBeanValidation}} @Inject - private {{classname}}Controller({{^controllerOnly}}{{classname}}ControllerImp{{#useInterfaces}}Interface{{/useInterfaces}} imp{{/controllerOnly}}) { + private {{classname}}Controller({{#useBeanValidation}}Configuration configuration{{^controllerOnly}}, {{/controllerOnly}}{{/useBeanValidation}}{{^controllerOnly}}{{classname}}ControllerImp{{#useInterfaces}}Interface{{/useInterfaces}} imp{{/controllerOnly}}) { {{^controllerOnly}} this.imp = imp; {{/controllerOnly}} mapper = new ObjectMapper(); + {{#useBeanValidation}} + this.configuration = configuration; + {{/useBeanValidation}} } {{#operation}} @@ -55,12 +62,21 @@ public class {{classname}}Controller extends Controller { if (node{{paramName}} != null) { {{paramName}} = mapper.readValue(node{{paramName}}.toString(), {{#isContainer}}new TypeReference<{{{dataType}}}>(){}{{/isContainer}}{{^isContainer}}{{{dataType}}}.class{{/isContainer}}); {{#useBeanValidation}} - {{#isListContainer}}for ({{{baseType}}} curItem : {{paramName}}) { - curItem.validate(); - }{{/isListContainer}}{{#isMapContainer}}for (Map.Entry entry : {{paramName}}.entrySet()) { - entry.getValue().validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + {{#isListContainer}} + for ({{{baseType}}} curItem : {{paramName}}) { + SwaggerUtils.validate(curItem); + } + {{/isListContainer}} + {{#isMapContainer}} + for (Map.Entry entry : {{paramName}}.entrySet()) { + SwaggerUtils.validate(entry.getValue()); + } + {{/isMapContainer}} + {{^isContainer}} + SwaggerUtils.validate({{paramName}}); + {{/isContainer}} } - {{/isMapContainer}}{{^isContainer}}{{paramName}}.validate();{{/isContainer}} {{/useBeanValidation}} } else { {{#required}} @@ -173,13 +189,30 @@ public class {{classname}}Controller extends Controller { {{/collectionFormat}} {{/headerParams}} {{^controllerOnly}} - {{#returnType}}{{>returnTypesNoVoid}} obj = {{/returnType}}imp.{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});{{#returnType}}{{^isResponseFile}}{{^returnTypeIsPrimitive}}{{#useBeanValidation}} - {{#isListContainer}}for ({{{returnType}}} curItem : obj) { - curItem.validate(); - }{{/isListContainer}}{{#isMapContainer}}for (Map.Entry entry : obj.entrySet()) { - entry.getValue().validate(); + {{#returnType}}{{>returnTypesNoVoid}} obj = {{/returnType}}imp.{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + {{#returnType}} + {{^isResponseFile}} + {{^returnTypeIsPrimitive}} + {{#useBeanValidation}} + if (configuration.getBoolean("useOutputBeanValidation")) { + {{#isListContainer}} + for ({{{returnType}}} curItem : obj) { + SwaggerUtils.validate(curItem); + } + {{/isListContainer}} + {{#isMapContainer}} + for (Map.Entry entry : obj.entrySet()) { + SwaggerUtils.validate(entry.getValue()); + } + {{/isMapContainer}} + {{^returnContainer}} + SwaggerUtils.validate(obj); + {{/returnContainer}} } - {{/isMapContainer}}{{^returnContainer}}obj.validate();{{/returnContainer}}{{/useBeanValidation}}{{/returnTypeIsPrimitive}}{{/isResponseFile}}{{/returnType}} + {{/useBeanValidation}} + {{/returnTypeIsPrimitive}} + {{/isResponseFile}} + {{/returnType}} {{#returnType}} {{^isResponseFile}}JsonNode result = mapper.valueToTree(obj); return ok(result); diff --git a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/pojo.mustache b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/pojo.mustache index 25bb4e49c4a..c7ce1c4dadb 100644 --- a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/pojo.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/pojo.mustache @@ -134,22 +134,4 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali } return o.toString().replace("\n", "\n "); } - - {{#useBeanValidation}} - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation<{{classname}}> contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } - {{/useBeanValidation}} } diff --git a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/swaggerUtils.mustache b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/swaggerUtils.mustache index c03add93e1a..8b472f131d0 100644 --- a/modules/swagger-codegen/src/main/resources/JavaPlayFramework/swaggerUtils.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaPlayFramework/swaggerUtils.mustache @@ -9,6 +9,13 @@ import java.lang.annotation.Target; import java.text.SimpleDateFormat; import java.util.*; +{{#useBeanValidation}} +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; +{{/useBeanValidation}} + public class SwaggerUtils { {{#wrapCalls}} @@ -19,6 +26,24 @@ public class SwaggerUtils { } {{/wrapCalls}} +{{#useBeanValidation}} + public static void validate(T obj) { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + Set> constraintViolations = validator.validate(obj); + if (constraintViolations.size() > 0) { + StringBuilder errors = new StringBuilder(); + for (ConstraintViolation contraintes : constraintViolations) { + errors.append(String.format("%s.%s %s\n", + contraintes.getRootBeanClass().getSimpleName(), + contraintes.getPropertyPath(), + contraintes.getMessage())); + } + throw new RuntimeException("Bean validation : " + errors); + } + } +{{/useBeanValidation}} + public static List parametersToList(String collectionFormat, String[] values){ List params = new ArrayList<>(); diff --git a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Category.java b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Category.java index fb9207f4b5d..9f0206575f5 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Category.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Category.java @@ -92,21 +92,5 @@ public class Category { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/ModelApiResponse.java b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/ModelApiResponse.java index 05911012313..07493e84825 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/ModelApiResponse.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/ModelApiResponse.java @@ -114,21 +114,5 @@ public class ModelApiResponse { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Order.java b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Order.java index 987ef07d460..cdc21f722c9 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Order.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Order.java @@ -215,21 +215,5 @@ public class Order { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Pet.java b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Pet.java index 430bbe805ce..5e5ff376294 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Pet.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Pet.java @@ -234,21 +234,5 @@ public class Pet { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Tag.java b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Tag.java index 709fef2cf11..15a8774252a 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Tag.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/Tag.java @@ -92,21 +92,5 @@ public class Tag { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/User.java b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/User.java index ba41fb76f80..689de768893 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/apimodels/User.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/apimodels/User.java @@ -224,21 +224,5 @@ public class User { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-controller-only/app/controllers/PetApiController.java b/samples/server/petstore/java-play-framework-controller-only/app/controllers/PetApiController.java index 74f975466b1..4ccf6a2aea9 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/controllers/PetApiController.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/controllers/PetApiController.java @@ -18,6 +18,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -25,10 +26,12 @@ import swagger.SwaggerUtils.ApiAction; public class PetApiController extends Controller { private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private PetApiController() { + private PetApiController(Configuration configuration) { mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -38,7 +41,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -98,7 +103,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } diff --git a/samples/server/petstore/java-play-framework-controller-only/app/controllers/StoreApiController.java b/samples/server/petstore/java-play-framework-controller-only/app/controllers/StoreApiController.java index a0cc3e27d57..3482251783b 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/controllers/StoreApiController.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/controllers/StoreApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -24,10 +25,12 @@ import swagger.SwaggerUtils.ApiAction; public class StoreApiController extends Controller { private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private StoreApiController() { + private StoreApiController(Configuration configuration) { mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -52,7 +55,9 @@ public class StoreApiController extends Controller { Order body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Order.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } diff --git a/samples/server/petstore/java-play-framework-controller-only/app/controllers/UserApiController.java b/samples/server/petstore/java-play-framework-controller-only/app/controllers/UserApiController.java index ec0b0d53ef0..862e317a341 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/controllers/UserApiController.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/controllers/UserApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -24,10 +25,12 @@ import swagger.SwaggerUtils.ApiAction; public class UserApiController extends Controller { private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private UserApiController() { + private UserApiController(Configuration configuration) { mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -37,7 +40,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -50,8 +55,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -65,8 +72,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -114,7 +123,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } diff --git a/samples/server/petstore/java-play-framework-controller-only/app/swagger/SwaggerUtils.java b/samples/server/petstore/java-play-framework-controller-only/app/swagger/SwaggerUtils.java index c7d8bd3de9e..d4900e02167 100644 --- a/samples/server/petstore/java-play-framework-controller-only/app/swagger/SwaggerUtils.java +++ b/samples/server/petstore/java-play-framework-controller-only/app/swagger/SwaggerUtils.java @@ -9,6 +9,11 @@ import java.lang.annotation.Target; import java.text.SimpleDateFormat; import java.util.*; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + public class SwaggerUtils { @With(ApiCall.class) @@ -17,6 +22,22 @@ public class SwaggerUtils { public @interface ApiAction { } + public static void validate(T obj) { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + Set> constraintViolations = validator.validate(obj); + if (constraintViolations.size() > 0) { + StringBuilder errors = new StringBuilder(); + for (ConstraintViolation contraintes : constraintViolations) { + errors.append(String.format("%s.%s %s\n", + contraintes.getRootBeanClass().getSimpleName(), + contraintes.getPropertyPath(), + contraintes.getMessage())); + } + throw new RuntimeException("Bean validation : " + errors); + } + } + public static List parametersToList(String collectionFormat, String[] values){ List params = new ArrayList<>(); diff --git a/samples/server/petstore/java-play-framework-controller-only/conf/application.conf b/samples/server/petstore/java-play-framework-controller-only/conf/application.conf index 514ce684a77..c147af52f25 100644 --- a/samples/server/petstore/java-play-framework-controller-only/conf/application.conf +++ b/samples/server/petstore/java-play-framework-controller-only/conf/application.conf @@ -17,6 +17,15 @@ play.filters.headers.contentSecurityPolicy=null +# When using bean validation with the swagger api, the validator will check that every constraint is respected +# This is very useful when testing but could add a lot of overhead if you return a lot of data. Benchmark have +# shown that the time it takes to validate is exponential. +# If this is a concern in your application, or if you don't want to validate the output coming from your API for +# respecting its contract, set the "output" property below to "false". Since there is not a lot of data as input for +# an endpoint, I highly suggest you let the "input" property set to true. +useInputBeanValidation=true +useOutputBeanValidation=true + play.http.errorHandler="swagger.ErrorHandler" ## Akka diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/AdditionalPropertiesClass.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/AdditionalPropertiesClass.java index 7ad3b29d780..0d1d7a1fd98 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/AdditionalPropertiesClass.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/AdditionalPropertiesClass.java @@ -112,21 +112,5 @@ public class AdditionalPropertiesClass { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Animal.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Animal.java index 0b52bbf6382..2202fe1078e 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Animal.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Animal.java @@ -95,21 +95,5 @@ public class Animal { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/AnimalFarm.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/AnimalFarm.java index 44f4227ba5d..13a90b97be2 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/AnimalFarm.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/AnimalFarm.java @@ -51,21 +51,5 @@ public class AnimalFarm extends ArrayList { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayOfArrayOfNumberOnly.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayOfArrayOfNumberOnly.java index 19f3a4841b4..ebeb622cd16 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayOfArrayOfNumberOnly.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayOfArrayOfNumberOnly.java @@ -82,21 +82,5 @@ public class ArrayOfArrayOfNumberOnly { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayOfNumberOnly.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayOfNumberOnly.java index 4d232db89ef..193c2f77177 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayOfNumberOnly.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayOfNumberOnly.java @@ -82,21 +82,5 @@ public class ArrayOfNumberOnly { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayTest.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayTest.java index 3fc13073c1a..80cefa109d6 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayTest.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ArrayTest.java @@ -143,21 +143,5 @@ public class ArrayTest { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Capitalization.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Capitalization.java index 1469630f874..f78ceeb9d0b 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Capitalization.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Capitalization.java @@ -180,21 +180,5 @@ public class Capitalization { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Cat.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Cat.java index ad587a0540e..a87f399d687 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Cat.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Cat.java @@ -72,21 +72,5 @@ public class Cat extends Animal { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Category.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Category.java index 572cd6ef3d2..c2a4222a8aa 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Category.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Category.java @@ -92,21 +92,5 @@ public class Category { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ClassModel.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ClassModel.java index 37313d2860b..ee8cd40ca40 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ClassModel.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ClassModel.java @@ -70,21 +70,5 @@ public class ClassModel { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Client.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Client.java index 8e4618db6b6..f14be52cf46 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Client.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Client.java @@ -70,21 +70,5 @@ public class Client { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Dog.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Dog.java index bd7ad700daa..27e3f5fdb25 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Dog.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Dog.java @@ -72,21 +72,5 @@ public class Dog extends Animal { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/EnumArrays.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/EnumArrays.java index a8f126b5124..a82c9ee422d 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/EnumArrays.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/EnumArrays.java @@ -164,21 +164,5 @@ public class EnumArrays { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/EnumTest.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/EnumTest.java index 165a4b02a0e..8b202da4f10 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/EnumTest.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/EnumTest.java @@ -233,21 +233,5 @@ public class EnumTest { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/FormatTest.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/FormatTest.java index b3293abc73b..5e70176abc7 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/FormatTest.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/FormatTest.java @@ -369,21 +369,5 @@ public class FormatTest { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/HasOnlyReadOnly.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/HasOnlyReadOnly.java index bc1644d165c..17d09b40692 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/HasOnlyReadOnly.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/HasOnlyReadOnly.java @@ -92,21 +92,5 @@ public class HasOnlyReadOnly { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/MapTest.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/MapTest.java index 3d8ced1fc41..7cd05af295f 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/MapTest.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/MapTest.java @@ -143,21 +143,5 @@ public class MapTest { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/MixedPropertiesAndAdditionalPropertiesClass.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/MixedPropertiesAndAdditionalPropertiesClass.java index 3d8314f1e1c..e52678fa5c4 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/MixedPropertiesAndAdditionalPropertiesClass.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/MixedPropertiesAndAdditionalPropertiesClass.java @@ -131,21 +131,5 @@ public class MixedPropertiesAndAdditionalPropertiesClass { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Model200Response.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Model200Response.java index 7e63d2a2ab9..1e0db95e010 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Model200Response.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Model200Response.java @@ -92,21 +92,5 @@ public class Model200Response { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ModelApiResponse.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ModelApiResponse.java index bdb4c3b1a35..a5505482e08 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ModelApiResponse.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ModelApiResponse.java @@ -114,21 +114,5 @@ public class ModelApiResponse { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ModelReturn.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ModelReturn.java index cab65161aae..89d3a0e25ff 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ModelReturn.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ModelReturn.java @@ -70,21 +70,5 @@ public class ModelReturn { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Name.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Name.java index 94466b89fbf..b17faa3cc5c 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Name.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Name.java @@ -137,21 +137,5 @@ public class Name { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/NumberOnly.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/NumberOnly.java index 4c56adea5c6..a54fece6268 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/NumberOnly.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/NumberOnly.java @@ -72,21 +72,5 @@ public class NumberOnly { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Order.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Order.java index ba0144ec429..50990892750 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Order.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Order.java @@ -215,21 +215,5 @@ public class Order { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/OuterComposite.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/OuterComposite.java index 78288a15e3b..92a8ca4c95a 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/OuterComposite.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/OuterComposite.java @@ -116,21 +116,5 @@ public class OuterComposite { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Pet.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Pet.java index d1abd7c48aa..aaa139c566d 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Pet.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Pet.java @@ -234,21 +234,5 @@ public class Pet { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ReadOnlyFirst.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ReadOnlyFirst.java index 1a3e4e7fcc2..693aa7eba34 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ReadOnlyFirst.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/ReadOnlyFirst.java @@ -92,21 +92,5 @@ public class ReadOnlyFirst { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/SpecialModelName.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/SpecialModelName.java index fa827dbd77f..ff398610850 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/SpecialModelName.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/SpecialModelName.java @@ -70,21 +70,5 @@ public class SpecialModelName { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Tag.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Tag.java index 033f9d61bd7..5426c883569 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Tag.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/Tag.java @@ -92,21 +92,5 @@ public class Tag { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/User.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/User.java index a479bb5e5f0..0308cc92681 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/User.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/apimodels/User.java @@ -224,21 +224,5 @@ public class User { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/AnotherFakeApiController.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/AnotherFakeApiController.java index 6164019070f..a81d96a90a7 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/AnotherFakeApiController.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/AnotherFakeApiController.java @@ -16,6 +16,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -24,11 +25,13 @@ public class AnotherFakeApiController extends Controller { private final AnotherFakeApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private AnotherFakeApiController(AnotherFakeApiControllerImpInterface imp) { + private AnotherFakeApiController(Configuration configuration, AnotherFakeApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -38,12 +41,16 @@ public class AnotherFakeApiController extends Controller { Client body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Client.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } Client obj = imp.testSpecialTags(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiController.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiController.java index d9bcaed20a5..0fcefacfa3b 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiController.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiController.java @@ -20,6 +20,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -28,11 +29,13 @@ public class FakeApiController extends Controller { private final FakeApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private FakeApiController(FakeApiControllerImpInterface imp) { + private FakeApiController(Configuration configuration, FakeApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -42,7 +45,9 @@ public class FakeApiController extends Controller { Boolean body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Boolean.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { body = null; } @@ -57,12 +62,16 @@ public class FakeApiController extends Controller { OuterComposite body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), OuterComposite.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { body = null; } OuterComposite obj = imp.fakeOuterCompositeSerialize(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -73,12 +82,16 @@ public class FakeApiController extends Controller { BigDecimal body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), BigDecimal.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { body = null; } BigDecimal obj = imp.fakeOuterNumberSerialize(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -89,7 +102,9 @@ public class FakeApiController extends Controller { String body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), String.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { body = null; } @@ -104,12 +119,16 @@ public class FakeApiController extends Controller { Client body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Client.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } Client obj = imp.testClientModel(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -182,14 +201,14 @@ public class FakeApiController extends Controller { String valuebinary = (request().body().asMultipartFormData().asFormUrlEncoded().get("binary"))[0]; byte[] binary; if (valuebinary != null) { - binary = valuebinary; + binary = valuebinary.getBytes(); } else { binary = null; } String valuedate = (request().body().asMultipartFormData().asFormUrlEncoded().get("date"))[0]; LocalDate date; if (valuedate != null) { - date = valuedate; + date = LocalDate.parse(valuedate); } else { date = null; } @@ -280,6 +299,22 @@ public class FakeApiController extends Controller { return ok(); } + @ApiAction + public Result testInlineAdditionalProperties() throws Exception { + JsonNode nodeparam = request().body().asJson(); + Object param; + if (nodeparam != null) { + param = mapper.readValue(nodeparam.toString(), Object.class); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(param); + } + } else { + throw new IllegalArgumentException("'param' parameter is required"); + } + imp.testInlineAdditionalProperties(param); + return ok(); + } + @ApiAction public Result testJsonFormData() throws Exception { String valueparam = (request().body().asMultipartFormData().asFormUrlEncoded().get("param"))[0]; diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiControllerImp.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiControllerImp.java index 36a6affba94..8756c4226c3 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiControllerImp.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiControllerImp.java @@ -56,6 +56,12 @@ public class FakeApiControllerImp implements FakeApiControllerImpInterface { } + @Override + public void testInlineAdditionalProperties(Object param) throws Exception { + //Do your magic!!! + + } + @Override public void testJsonFormData(String param, String param2) throws Exception { //Do your magic!!! diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiControllerImpInterface.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiControllerImpInterface.java index 210755319d2..48828746e09 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiControllerImpInterface.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeApiControllerImpInterface.java @@ -29,6 +29,8 @@ public interface FakeApiControllerImpInterface { void testEnumParameters(List enumFormStringArray, String enumFormString, List enumHeaderStringArray, String enumHeaderString, List enumQueryStringArray, String enumQueryString, Integer enumQueryInteger, Double enumQueryDouble) throws Exception; + void testInlineAdditionalProperties(Object param) throws Exception; + void testJsonFormData(String param, String param2) throws Exception; } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeClassnameTags123ApiController.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeClassnameTags123ApiController.java index 785c5da877f..89c227fa5db 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeClassnameTags123ApiController.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/FakeClassnameTags123ApiController.java @@ -16,6 +16,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -24,11 +25,13 @@ public class FakeClassnameTags123ApiController extends Controller { private final FakeClassnameTags123ApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private FakeClassnameTags123ApiController(FakeClassnameTags123ApiControllerImpInterface imp) { + private FakeClassnameTags123ApiController(Configuration configuration, FakeClassnameTags123ApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -38,12 +41,16 @@ public class FakeClassnameTags123ApiController extends Controller { Client body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Client.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } Client obj = imp.testClassname(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/PetApiController.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/PetApiController.java index 2ecdbcbdc0b..cab362abda5 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/PetApiController.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/PetApiController.java @@ -18,6 +18,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -26,11 +27,13 @@ public class PetApiController extends Controller { private final PetApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private PetApiController(PetApiControllerImpInterface imp) { + private PetApiController(Configuration configuration, PetApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -40,7 +43,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -74,8 +79,10 @@ public class PetApiController extends Controller { status.add(curParam); } List obj = imp.findPetsByStatus(status); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -94,8 +101,10 @@ public class PetApiController extends Controller { tags.add(curParam); } List obj = imp.findPetsByTags(tags); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -104,7 +113,9 @@ public class PetApiController extends Controller { @ApiAction public Result getPetById(Long petId) throws Exception { Pet obj = imp.getPetById(petId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -115,7 +126,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -154,7 +167,9 @@ public class PetApiController extends Controller { } Http.MultipartFormData.FilePart file = request().body().asMultipartFormData().getFile("file"); ModelApiResponse obj = imp.uploadFile(petId, additionalMetadata, file); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/StoreApiController.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/StoreApiController.java index 8254d1f992e..c94c5aa111a 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/StoreApiController.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/StoreApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -25,11 +26,13 @@ public class StoreApiController extends Controller { private final StoreApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private StoreApiController(StoreApiControllerImpInterface imp) { + private StoreApiController(Configuration configuration, StoreApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -49,7 +52,9 @@ public class StoreApiController extends Controller { @ApiAction public Result getOrderById( @Min(1) @Max(5)Long orderId) throws Exception { Order obj = imp.getOrderById(orderId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -60,12 +65,16 @@ public class StoreApiController extends Controller { Order body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Order.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } Order obj = imp.placeOrder(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/UserApiController.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/UserApiController.java index b0676d8e3d5..245d076858a 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/UserApiController.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/controllers/UserApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -25,11 +26,13 @@ public class UserApiController extends Controller { private final UserApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private UserApiController(UserApiControllerImpInterface imp) { + private UserApiController(Configuration configuration, UserApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -39,7 +42,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -53,8 +58,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -69,8 +76,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -88,7 +97,9 @@ public class UserApiController extends Controller { @ApiAction public Result getUserByName(String username) throws Exception { User obj = imp.getUserByName(username); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -126,7 +137,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/app/swagger/SwaggerUtils.java b/samples/server/petstore/java-play-framework-fake-endpoints/app/swagger/SwaggerUtils.java index c7d8bd3de9e..d4900e02167 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/app/swagger/SwaggerUtils.java +++ b/samples/server/petstore/java-play-framework-fake-endpoints/app/swagger/SwaggerUtils.java @@ -9,6 +9,11 @@ import java.lang.annotation.Target; import java.text.SimpleDateFormat; import java.util.*; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + public class SwaggerUtils { @With(ApiCall.class) @@ -17,6 +22,22 @@ public class SwaggerUtils { public @interface ApiAction { } + public static void validate(T obj) { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + Set> constraintViolations = validator.validate(obj); + if (constraintViolations.size() > 0) { + StringBuilder errors = new StringBuilder(); + for (ConstraintViolation contraintes : constraintViolations) { + errors.append(String.format("%s.%s %s\n", + contraintes.getRootBeanClass().getSimpleName(), + contraintes.getPropertyPath(), + contraintes.getMessage())); + } + throw new RuntimeException("Bean validation : " + errors); + } + } + public static List parametersToList(String collectionFormat, String[] values){ List params = new ArrayList<>(); diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/conf/application.conf b/samples/server/petstore/java-play-framework-fake-endpoints/conf/application.conf index a361b74d38e..46ce4312dd3 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/conf/application.conf +++ b/samples/server/petstore/java-play-framework-fake-endpoints/conf/application.conf @@ -17,6 +17,15 @@ play.filters.headers.contentSecurityPolicy=null +# When using bean validation with the swagger api, the validator will check that every constraint is respected +# This is very useful when testing but could add a lot of overhead if you return a lot of data. Benchmark have +# shown that the time it takes to validate is exponential. +# If this is a concern in your application, or if you don't want to validate the output coming from your API for +# respecting its contract, set the "output" property below to "false". Since there is not a lot of data as input for +# an endpoint, I highly suggest you let the "input" property set to true. +useInputBeanValidation=true +useOutputBeanValidation=true + play.http.errorHandler="swagger.ErrorHandler" ## Akka diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/conf/routes b/samples/server/petstore/java-play-framework-fake-endpoints/conf/routes index d3094cd2441..6a342645b5d 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/conf/routes +++ b/samples/server/petstore/java-play-framework-fake-endpoints/conf/routes @@ -16,6 +16,7 @@ POST /v2/fake/outer/string controllers.FakeApiController PATCH /v2/fake controllers.FakeApiController.testClientModel() POST /v2/fake controllers.FakeApiController.testEndpointParameters() GET /v2/fake controllers.FakeApiController.testEnumParameters() +POST /v2/fake/inline-additionalProperties controllers.FakeApiController.testInlineAdditionalProperties() GET /v2/fake/jsonFormData controllers.FakeApiController.testJsonFormData() #Functions for FakeClassnameTags123 API diff --git a/samples/server/petstore/java-play-framework-fake-endpoints/public/swagger.json b/samples/server/petstore/java-play-framework-fake-endpoints/public/swagger.json index 52a10430087..368be2e2b4d 100644 --- a/samples/server/petstore/java-play-framework-fake-endpoints/public/swagger.json +++ b/samples/server/petstore/java-play-framework-fake-endpoints/public/swagger.json @@ -1088,6 +1088,34 @@ "x-accepts" : "application/json" } }, + "/fake/inline-additionalProperties" : { + "post" : { + "tags" : [ "fake" ], + "summary" : "test inline additionalProperties", + "description" : "", + "operationId" : "testInlineAdditionalProperties", + "consumes" : [ "application/json" ], + "parameters" : [ { + "in" : "body", + "name" : "param", + "description" : "request body", + "required" : true, + "schema" : { + "type" : "object", + "additionalProperties" : { + "type" : "string" + } + } + } ], + "responses" : { + "200" : { + "description" : "successful operation" + } + }, + "x-contentType" : "application/json", + "x-accepts" : "application/json" + } + }, "/another-fake/dummy" : { "patch" : { "tags" : [ "$another-fake?" ], diff --git a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Category.java b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Category.java index 399a6f2646a..44eb3a6bf7a 100644 --- a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Category.java +++ b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Category.java @@ -91,6 +91,5 @@ public class Category { } return o.toString().replace("\n", "\n "); } - } diff --git a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/ModelApiResponse.java b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/ModelApiResponse.java index 9b3b2fc7e92..81a2333008b 100644 --- a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/ModelApiResponse.java +++ b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/ModelApiResponse.java @@ -113,6 +113,5 @@ public class ModelApiResponse { } return o.toString().replace("\n", "\n "); } - } diff --git a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Order.java b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Order.java index 873a6aebd25..2290a967e4b 100644 --- a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Order.java +++ b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Order.java @@ -213,6 +213,5 @@ public class Order { } return o.toString().replace("\n", "\n "); } - } diff --git a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Pet.java b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Pet.java index e6adacc5d5c..ec14d76b41f 100644 --- a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Pet.java +++ b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Pet.java @@ -229,6 +229,5 @@ public class Pet { } return o.toString().replace("\n", "\n "); } - } diff --git a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Tag.java b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Tag.java index cc8a86828f0..80b1d783b33 100644 --- a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Tag.java +++ b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/Tag.java @@ -91,6 +91,5 @@ public class Tag { } return o.toString().replace("\n", "\n "); } - } diff --git a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/User.java b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/User.java index 5fc613edfbe..221a9f30591 100644 --- a/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/User.java +++ b/samples/server/petstore/java-play-framework-no-bean-validation/app/apimodels/User.java @@ -223,6 +223,5 @@ public class User { } return o.toString().replace("\n", "\n "); } - } diff --git a/samples/server/petstore/java-play-framework-no-bean-validation/app/swagger/SwaggerUtils.java b/samples/server/petstore/java-play-framework-no-bean-validation/app/swagger/SwaggerUtils.java index c7d8bd3de9e..831a59d70be 100644 --- a/samples/server/petstore/java-play-framework-no-bean-validation/app/swagger/SwaggerUtils.java +++ b/samples/server/petstore/java-play-framework-no-bean-validation/app/swagger/SwaggerUtils.java @@ -9,6 +9,7 @@ import java.lang.annotation.Target; import java.text.SimpleDateFormat; import java.util.*; + public class SwaggerUtils { @With(ApiCall.class) @@ -17,6 +18,7 @@ public class SwaggerUtils { public @interface ApiAction { } + public static List parametersToList(String collectionFormat, String[] values){ List params = new ArrayList<>(); diff --git a/samples/server/petstore/java-play-framework-no-bean-validation/conf/application.conf b/samples/server/petstore/java-play-framework-no-bean-validation/conf/application.conf index a361b74d38e..21e3331bf27 100644 --- a/samples/server/petstore/java-play-framework-no-bean-validation/conf/application.conf +++ b/samples/server/petstore/java-play-framework-no-bean-validation/conf/application.conf @@ -17,6 +17,7 @@ play.filters.headers.contentSecurityPolicy=null + play.http.errorHandler="swagger.ErrorHandler" ## Akka diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Category.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Category.java index fb9207f4b5d..9f0206575f5 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Category.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Category.java @@ -92,21 +92,5 @@ public class Category { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/ModelApiResponse.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/ModelApiResponse.java index 05911012313..07493e84825 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/ModelApiResponse.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/ModelApiResponse.java @@ -114,21 +114,5 @@ public class ModelApiResponse { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Order.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Order.java index 987ef07d460..cdc21f722c9 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Order.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Order.java @@ -215,21 +215,5 @@ public class Order { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Pet.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Pet.java index 430bbe805ce..5e5ff376294 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Pet.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Pet.java @@ -234,21 +234,5 @@ public class Pet { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Tag.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Tag.java index 709fef2cf11..15a8774252a 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Tag.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/Tag.java @@ -92,21 +92,5 @@ public class Tag { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/User.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/User.java index ba41fb76f80..689de768893 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/User.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/apimodels/User.java @@ -224,21 +224,5 @@ public class User { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/PetApiController.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/PetApiController.java index c5fc05efb60..9422ed10ca0 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/PetApiController.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/PetApiController.java @@ -19,6 +19,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -27,11 +28,13 @@ public class PetApiController extends Controller { private final PetApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private PetApiController(PetApiControllerImpInterface imp) { + private PetApiController(Configuration configuration, PetApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -41,7 +44,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -75,8 +80,10 @@ public class PetApiController extends Controller { status.add(curParam); } List obj = imp.findPetsByStatus(status); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -95,8 +102,10 @@ public class PetApiController extends Controller { tags.add(curParam); } List obj = imp.findPetsByTags(tags); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -105,7 +114,9 @@ public class PetApiController extends Controller { @ApiAction public Result getPetById(Long petId) { Pet obj = imp.getPetById(petId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -116,7 +127,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -155,7 +168,9 @@ public class PetApiController extends Controller { } Http.MultipartFormData.FilePart file = request().body().asMultipartFormData().getFile("file"); ModelApiResponse obj = imp.uploadFile(petId, additionalMetadata, file); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/StoreApiController.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/StoreApiController.java index 147561498ea..e98dea01e40 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/StoreApiController.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/StoreApiController.java @@ -18,6 +18,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -26,11 +27,13 @@ public class StoreApiController extends Controller { private final StoreApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private StoreApiController(StoreApiControllerImpInterface imp) { + private StoreApiController(Configuration configuration, StoreApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -50,7 +53,9 @@ public class StoreApiController extends Controller { @ApiAction public Result getOrderById( @Min(1) @Max(5)Long orderId) { Order obj = imp.getOrderById(orderId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -61,12 +66,16 @@ public class StoreApiController extends Controller { Order body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Order.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } Order obj = imp.placeOrder(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/UserApiController.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/UserApiController.java index a0e94c65233..2afd562c7c8 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/UserApiController.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/controllers/UserApiController.java @@ -18,6 +18,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -26,11 +27,13 @@ public class UserApiController extends Controller { private final UserApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private UserApiController(UserApiControllerImpInterface imp) { + private UserApiController(Configuration configuration, UserApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -40,7 +43,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -54,8 +59,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -70,8 +77,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -89,7 +98,9 @@ public class UserApiController extends Controller { @ApiAction public Result getUserByName(String username) { User obj = imp.getUserByName(username); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -127,7 +138,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/app/swagger/SwaggerUtils.java b/samples/server/petstore/java-play-framework-no-exception-handling/app/swagger/SwaggerUtils.java index c7d8bd3de9e..d4900e02167 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/app/swagger/SwaggerUtils.java +++ b/samples/server/petstore/java-play-framework-no-exception-handling/app/swagger/SwaggerUtils.java @@ -9,6 +9,11 @@ import java.lang.annotation.Target; import java.text.SimpleDateFormat; import java.util.*; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + public class SwaggerUtils { @With(ApiCall.class) @@ -17,6 +22,22 @@ public class SwaggerUtils { public @interface ApiAction { } + public static void validate(T obj) { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + Set> constraintViolations = validator.validate(obj); + if (constraintViolations.size() > 0) { + StringBuilder errors = new StringBuilder(); + for (ConstraintViolation contraintes : constraintViolations) { + errors.append(String.format("%s.%s %s\n", + contraintes.getRootBeanClass().getSimpleName(), + contraintes.getPropertyPath(), + contraintes.getMessage())); + } + throw new RuntimeException("Bean validation : " + errors); + } + } + public static List parametersToList(String collectionFormat, String[] values){ List params = new ArrayList<>(); diff --git a/samples/server/petstore/java-play-framework-no-exception-handling/conf/application.conf b/samples/server/petstore/java-play-framework-no-exception-handling/conf/application.conf index 9b6a9566c96..2b8e956dae5 100644 --- a/samples/server/petstore/java-play-framework-no-exception-handling/conf/application.conf +++ b/samples/server/petstore/java-play-framework-no-exception-handling/conf/application.conf @@ -17,6 +17,15 @@ play.filters.headers.contentSecurityPolicy=null +# When using bean validation with the swagger api, the validator will check that every constraint is respected +# This is very useful when testing but could add a lot of overhead if you return a lot of data. Benchmark have +# shown that the time it takes to validate is exponential. +# If this is a concern in your application, or if you don't want to validate the output coming from your API for +# respecting its contract, set the "output" property below to "false". Since there is not a lot of data as input for +# an endpoint, I highly suggest you let the "input" property set to true. +useInputBeanValidation=true +useOutputBeanValidation=true + ## Akka # https://www.playframework.com/documentation/latest/ScalaAkka#Configuration diff --git a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Category.java b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Category.java index fb9207f4b5d..9f0206575f5 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Category.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Category.java @@ -92,21 +92,5 @@ public class Category { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/ModelApiResponse.java b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/ModelApiResponse.java index 05911012313..07493e84825 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/ModelApiResponse.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/ModelApiResponse.java @@ -114,21 +114,5 @@ public class ModelApiResponse { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Order.java b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Order.java index 987ef07d460..cdc21f722c9 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Order.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Order.java @@ -215,21 +215,5 @@ public class Order { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Pet.java b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Pet.java index 430bbe805ce..5e5ff376294 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Pet.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Pet.java @@ -234,21 +234,5 @@ public class Pet { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Tag.java b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Tag.java index 709fef2cf11..15a8774252a 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Tag.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/Tag.java @@ -92,21 +92,5 @@ public class Tag { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/User.java b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/User.java index ba41fb76f80..689de768893 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/apimodels/User.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/apimodels/User.java @@ -224,21 +224,5 @@ public class User { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-interface/app/controllers/PetApiController.java b/samples/server/petstore/java-play-framework-no-interface/app/controllers/PetApiController.java index e1f3f0b0a21..eb522b1f8f5 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/controllers/PetApiController.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/controllers/PetApiController.java @@ -18,6 +18,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -26,11 +27,13 @@ public class PetApiController extends Controller { private final PetApiControllerImp imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private PetApiController(PetApiControllerImp imp) { + private PetApiController(Configuration configuration, PetApiControllerImp imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -40,7 +43,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -74,8 +79,10 @@ public class PetApiController extends Controller { status.add(curParam); } List obj = imp.findPetsByStatus(status); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -94,8 +101,10 @@ public class PetApiController extends Controller { tags.add(curParam); } List obj = imp.findPetsByTags(tags); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -104,7 +113,9 @@ public class PetApiController extends Controller { @ApiAction public Result getPetById(Long petId) throws Exception { Pet obj = imp.getPetById(petId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -115,7 +126,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -154,7 +167,9 @@ public class PetApiController extends Controller { } Http.MultipartFormData.FilePart file = request().body().asMultipartFormData().getFile("file"); ModelApiResponse obj = imp.uploadFile(petId, additionalMetadata, file); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-no-interface/app/controllers/StoreApiController.java b/samples/server/petstore/java-play-framework-no-interface/app/controllers/StoreApiController.java index 2c0b41176ce..e5829bb4d81 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/controllers/StoreApiController.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/controllers/StoreApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -25,11 +26,13 @@ public class StoreApiController extends Controller { private final StoreApiControllerImp imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private StoreApiController(StoreApiControllerImp imp) { + private StoreApiController(Configuration configuration, StoreApiControllerImp imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -49,7 +52,9 @@ public class StoreApiController extends Controller { @ApiAction public Result getOrderById( @Min(1) @Max(5)Long orderId) throws Exception { Order obj = imp.getOrderById(orderId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -60,12 +65,16 @@ public class StoreApiController extends Controller { Order body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Order.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } Order obj = imp.placeOrder(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-no-interface/app/controllers/UserApiController.java b/samples/server/petstore/java-play-framework-no-interface/app/controllers/UserApiController.java index 05f0a4eefed..8bb48133af9 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/controllers/UserApiController.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/controllers/UserApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -25,11 +26,13 @@ public class UserApiController extends Controller { private final UserApiControllerImp imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private UserApiController(UserApiControllerImp imp) { + private UserApiController(Configuration configuration, UserApiControllerImp imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -39,7 +42,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -53,8 +58,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -69,8 +76,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -88,7 +97,9 @@ public class UserApiController extends Controller { @ApiAction public Result getUserByName(String username) throws Exception { User obj = imp.getUserByName(username); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -126,7 +137,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } diff --git a/samples/server/petstore/java-play-framework-no-interface/app/swagger/SwaggerUtils.java b/samples/server/petstore/java-play-framework-no-interface/app/swagger/SwaggerUtils.java index c7d8bd3de9e..d4900e02167 100644 --- a/samples/server/petstore/java-play-framework-no-interface/app/swagger/SwaggerUtils.java +++ b/samples/server/petstore/java-play-framework-no-interface/app/swagger/SwaggerUtils.java @@ -9,6 +9,11 @@ import java.lang.annotation.Target; import java.text.SimpleDateFormat; import java.util.*; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + public class SwaggerUtils { @With(ApiCall.class) @@ -17,6 +22,22 @@ public class SwaggerUtils { public @interface ApiAction { } + public static void validate(T obj) { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + Set> constraintViolations = validator.validate(obj); + if (constraintViolations.size() > 0) { + StringBuilder errors = new StringBuilder(); + for (ConstraintViolation contraintes : constraintViolations) { + errors.append(String.format("%s.%s %s\n", + contraintes.getRootBeanClass().getSimpleName(), + contraintes.getPropertyPath(), + contraintes.getMessage())); + } + throw new RuntimeException("Bean validation : " + errors); + } + } + public static List parametersToList(String collectionFormat, String[] values){ List params = new ArrayList<>(); diff --git a/samples/server/petstore/java-play-framework-no-interface/conf/application.conf b/samples/server/petstore/java-play-framework-no-interface/conf/application.conf index 514ce684a77..c147af52f25 100644 --- a/samples/server/petstore/java-play-framework-no-interface/conf/application.conf +++ b/samples/server/petstore/java-play-framework-no-interface/conf/application.conf @@ -17,6 +17,15 @@ play.filters.headers.contentSecurityPolicy=null +# When using bean validation with the swagger api, the validator will check that every constraint is respected +# This is very useful when testing but could add a lot of overhead if you return a lot of data. Benchmark have +# shown that the time it takes to validate is exponential. +# If this is a concern in your application, or if you don't want to validate the output coming from your API for +# respecting its contract, set the "output" property below to "false". Since there is not a lot of data as input for +# an endpoint, I highly suggest you let the "input" property set to true. +useInputBeanValidation=true +useOutputBeanValidation=true + play.http.errorHandler="swagger.ErrorHandler" ## Akka diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Category.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Category.java index fb9207f4b5d..9f0206575f5 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Category.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Category.java @@ -92,21 +92,5 @@ public class Category { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/ModelApiResponse.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/ModelApiResponse.java index 05911012313..07493e84825 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/ModelApiResponse.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/ModelApiResponse.java @@ -114,21 +114,5 @@ public class ModelApiResponse { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Order.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Order.java index 987ef07d460..cdc21f722c9 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Order.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Order.java @@ -215,21 +215,5 @@ public class Order { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Pet.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Pet.java index 430bbe805ce..5e5ff376294 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Pet.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Pet.java @@ -234,21 +234,5 @@ public class Pet { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Tag.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Tag.java index 709fef2cf11..15a8774252a 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Tag.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/Tag.java @@ -92,21 +92,5 @@ public class Tag { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/User.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/User.java index ba41fb76f80..689de768893 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/User.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/apimodels/User.java @@ -224,21 +224,5 @@ public class User { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/PetApiController.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/PetApiController.java index 2ecdbcbdc0b..cab362abda5 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/PetApiController.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/PetApiController.java @@ -18,6 +18,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -26,11 +27,13 @@ public class PetApiController extends Controller { private final PetApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private PetApiController(PetApiControllerImpInterface imp) { + private PetApiController(Configuration configuration, PetApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -40,7 +43,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -74,8 +79,10 @@ public class PetApiController extends Controller { status.add(curParam); } List obj = imp.findPetsByStatus(status); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -94,8 +101,10 @@ public class PetApiController extends Controller { tags.add(curParam); } List obj = imp.findPetsByTags(tags); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -104,7 +113,9 @@ public class PetApiController extends Controller { @ApiAction public Result getPetById(Long petId) throws Exception { Pet obj = imp.getPetById(petId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -115,7 +126,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -154,7 +167,9 @@ public class PetApiController extends Controller { } Http.MultipartFormData.FilePart file = request().body().asMultipartFormData().getFile("file"); ModelApiResponse obj = imp.uploadFile(petId, additionalMetadata, file); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/StoreApiController.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/StoreApiController.java index 8254d1f992e..c94c5aa111a 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/StoreApiController.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/StoreApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -25,11 +26,13 @@ public class StoreApiController extends Controller { private final StoreApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private StoreApiController(StoreApiControllerImpInterface imp) { + private StoreApiController(Configuration configuration, StoreApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -49,7 +52,9 @@ public class StoreApiController extends Controller { @ApiAction public Result getOrderById( @Min(1) @Max(5)Long orderId) throws Exception { Order obj = imp.getOrderById(orderId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -60,12 +65,16 @@ public class StoreApiController extends Controller { Order body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Order.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } Order obj = imp.placeOrder(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/UserApiController.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/UserApiController.java index b0676d8e3d5..245d076858a 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/UserApiController.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/controllers/UserApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -25,11 +26,13 @@ public class UserApiController extends Controller { private final UserApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private UserApiController(UserApiControllerImpInterface imp) { + private UserApiController(Configuration configuration, UserApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -39,7 +42,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -53,8 +58,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -69,8 +76,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -88,7 +97,9 @@ public class UserApiController extends Controller { @ApiAction public Result getUserByName(String username) throws Exception { User obj = imp.getUserByName(username); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -126,7 +137,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/app/swagger/SwaggerUtils.java b/samples/server/petstore/java-play-framework-no-swagger-ui/app/swagger/SwaggerUtils.java index c7d8bd3de9e..d4900e02167 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/app/swagger/SwaggerUtils.java +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/app/swagger/SwaggerUtils.java @@ -9,6 +9,11 @@ import java.lang.annotation.Target; import java.text.SimpleDateFormat; import java.util.*; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + public class SwaggerUtils { @With(ApiCall.class) @@ -17,6 +22,22 @@ public class SwaggerUtils { public @interface ApiAction { } + public static void validate(T obj) { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + Set> constraintViolations = validator.validate(obj); + if (constraintViolations.size() > 0) { + StringBuilder errors = new StringBuilder(); + for (ConstraintViolation contraintes : constraintViolations) { + errors.append(String.format("%s.%s %s\n", + contraintes.getRootBeanClass().getSimpleName(), + contraintes.getPropertyPath(), + contraintes.getMessage())); + } + throw new RuntimeException("Bean validation : " + errors); + } + } + public static List parametersToList(String collectionFormat, String[] values){ List params = new ArrayList<>(); diff --git a/samples/server/petstore/java-play-framework-no-swagger-ui/conf/application.conf b/samples/server/petstore/java-play-framework-no-swagger-ui/conf/application.conf index a361b74d38e..46ce4312dd3 100644 --- a/samples/server/petstore/java-play-framework-no-swagger-ui/conf/application.conf +++ b/samples/server/petstore/java-play-framework-no-swagger-ui/conf/application.conf @@ -17,6 +17,15 @@ play.filters.headers.contentSecurityPolicy=null +# When using bean validation with the swagger api, the validator will check that every constraint is respected +# This is very useful when testing but could add a lot of overhead if you return a lot of data. Benchmark have +# shown that the time it takes to validate is exponential. +# If this is a concern in your application, or if you don't want to validate the output coming from your API for +# respecting its contract, set the "output" property below to "false". Since there is not a lot of data as input for +# an endpoint, I highly suggest you let the "input" property set to true. +useInputBeanValidation=true +useOutputBeanValidation=true + play.http.errorHandler="swagger.ErrorHandler" ## Akka diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Category.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Category.java index fb9207f4b5d..9f0206575f5 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Category.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Category.java @@ -92,21 +92,5 @@ public class Category { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/ModelApiResponse.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/ModelApiResponse.java index 05911012313..07493e84825 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/ModelApiResponse.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/ModelApiResponse.java @@ -114,21 +114,5 @@ public class ModelApiResponse { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Order.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Order.java index 987ef07d460..cdc21f722c9 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Order.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Order.java @@ -215,21 +215,5 @@ public class Order { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Pet.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Pet.java index 430bbe805ce..5e5ff376294 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Pet.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Pet.java @@ -234,21 +234,5 @@ public class Pet { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Tag.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Tag.java index 709fef2cf11..15a8774252a 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Tag.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/Tag.java @@ -92,21 +92,5 @@ public class Tag { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/User.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/User.java index ba41fb76f80..689de768893 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/User.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/apimodels/User.java @@ -224,21 +224,5 @@ public class User { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/PetApiController.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/PetApiController.java index 7b393595452..ef0030703c6 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/PetApiController.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/PetApiController.java @@ -18,6 +18,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; @@ -25,11 +26,13 @@ public class PetApiController extends Controller { private final PetApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private PetApiController(PetApiControllerImpInterface imp) { + private PetApiController(Configuration configuration, PetApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -39,7 +42,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -73,8 +78,10 @@ public class PetApiController extends Controller { status.add(curParam); } List obj = imp.findPetsByStatus(status); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -93,8 +100,10 @@ public class PetApiController extends Controller { tags.add(curParam); } List obj = imp.findPetsByTags(tags); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -103,7 +112,9 @@ public class PetApiController extends Controller { public Result getPetById(Long petId) throws Exception { Pet obj = imp.getPetById(petId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -114,7 +125,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -153,7 +166,9 @@ public class PetApiController extends Controller { } Http.MultipartFormData.FilePart file = request().body().asMultipartFormData().getFile("file"); ModelApiResponse obj = imp.uploadFile(petId, additionalMetadata, file); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/StoreApiController.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/StoreApiController.java index 964e48e91a0..16a3e3c8efa 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/StoreApiController.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/StoreApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; @@ -24,11 +25,13 @@ public class StoreApiController extends Controller { private final StoreApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private StoreApiController(StoreApiControllerImpInterface imp) { + private StoreApiController(Configuration configuration, StoreApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -48,7 +51,9 @@ public class StoreApiController extends Controller { public Result getOrderById( @Min(1) @Max(5)Long orderId) throws Exception { Order obj = imp.getOrderById(orderId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -59,12 +64,16 @@ public class StoreApiController extends Controller { Order body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Order.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } Order obj = imp.placeOrder(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/UserApiController.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/UserApiController.java index 06b4ef13b65..596ce528fff 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/UserApiController.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/controllers/UserApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; @@ -24,11 +25,13 @@ public class UserApiController extends Controller { private final UserApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private UserApiController(UserApiControllerImpInterface imp) { + private UserApiController(Configuration configuration, UserApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -38,7 +41,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -52,8 +57,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -68,8 +75,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -87,7 +96,9 @@ public class UserApiController extends Controller { public Result getUserByName(String username) throws Exception { User obj = imp.getUserByName(username); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -125,7 +136,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/app/swagger/SwaggerUtils.java b/samples/server/petstore/java-play-framework-no-wrap-calls/app/swagger/SwaggerUtils.java index b00dd30e7e5..4c5ee51c67f 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/app/swagger/SwaggerUtils.java +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/app/swagger/SwaggerUtils.java @@ -9,9 +9,30 @@ import java.lang.annotation.Target; import java.text.SimpleDateFormat; import java.util.*; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + public class SwaggerUtils { + public static void validate(T obj) { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + Set> constraintViolations = validator.validate(obj); + if (constraintViolations.size() > 0) { + StringBuilder errors = new StringBuilder(); + for (ConstraintViolation contraintes : constraintViolations) { + errors.append(String.format("%s.%s %s\n", + contraintes.getRootBeanClass().getSimpleName(), + contraintes.getPropertyPath(), + contraintes.getMessage())); + } + throw new RuntimeException("Bean validation : " + errors); + } + } + public static List parametersToList(String collectionFormat, String[] values){ List params = new ArrayList<>(); diff --git a/samples/server/petstore/java-play-framework-no-wrap-calls/conf/application.conf b/samples/server/petstore/java-play-framework-no-wrap-calls/conf/application.conf index a361b74d38e..46ce4312dd3 100644 --- a/samples/server/petstore/java-play-framework-no-wrap-calls/conf/application.conf +++ b/samples/server/petstore/java-play-framework-no-wrap-calls/conf/application.conf @@ -17,6 +17,15 @@ play.filters.headers.contentSecurityPolicy=null +# When using bean validation with the swagger api, the validator will check that every constraint is respected +# This is very useful when testing but could add a lot of overhead if you return a lot of data. Benchmark have +# shown that the time it takes to validate is exponential. +# If this is a concern in your application, or if you don't want to validate the output coming from your API for +# respecting its contract, set the "output" property below to "false". Since there is not a lot of data as input for +# an endpoint, I highly suggest you let the "input" property set to true. +useInputBeanValidation=true +useOutputBeanValidation=true + play.http.errorHandler="swagger.ErrorHandler" ## Akka diff --git a/samples/server/petstore/java-play-framework/app/apimodels/Category.java b/samples/server/petstore/java-play-framework/app/apimodels/Category.java index fb9207f4b5d..9f0206575f5 100644 --- a/samples/server/petstore/java-play-framework/app/apimodels/Category.java +++ b/samples/server/petstore/java-play-framework/app/apimodels/Category.java @@ -92,21 +92,5 @@ public class Category { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework/app/apimodels/ModelApiResponse.java b/samples/server/petstore/java-play-framework/app/apimodels/ModelApiResponse.java index 05911012313..07493e84825 100644 --- a/samples/server/petstore/java-play-framework/app/apimodels/ModelApiResponse.java +++ b/samples/server/petstore/java-play-framework/app/apimodels/ModelApiResponse.java @@ -114,21 +114,5 @@ public class ModelApiResponse { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework/app/apimodels/Order.java b/samples/server/petstore/java-play-framework/app/apimodels/Order.java index 987ef07d460..cdc21f722c9 100644 --- a/samples/server/petstore/java-play-framework/app/apimodels/Order.java +++ b/samples/server/petstore/java-play-framework/app/apimodels/Order.java @@ -215,21 +215,5 @@ public class Order { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework/app/apimodels/Pet.java b/samples/server/petstore/java-play-framework/app/apimodels/Pet.java index 430bbe805ce..5e5ff376294 100644 --- a/samples/server/petstore/java-play-framework/app/apimodels/Pet.java +++ b/samples/server/petstore/java-play-framework/app/apimodels/Pet.java @@ -234,21 +234,5 @@ public class Pet { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework/app/apimodels/Tag.java b/samples/server/petstore/java-play-framework/app/apimodels/Tag.java index 709fef2cf11..15a8774252a 100644 --- a/samples/server/petstore/java-play-framework/app/apimodels/Tag.java +++ b/samples/server/petstore/java-play-framework/app/apimodels/Tag.java @@ -92,21 +92,5 @@ public class Tag { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework/app/apimodels/User.java b/samples/server/petstore/java-play-framework/app/apimodels/User.java index ba41fb76f80..689de768893 100644 --- a/samples/server/petstore/java-play-framework/app/apimodels/User.java +++ b/samples/server/petstore/java-play-framework/app/apimodels/User.java @@ -224,21 +224,5 @@ public class User { } return o.toString().replace("\n", "\n "); } - - public void validate() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> constraintViolations = validator.validate(this); - if (constraintViolations.size() > 0) { - StringBuilder errors = new StringBuilder(); - for (ConstraintViolation contraintes : constraintViolations) { - errors.append(String.format("%s.%s %s\n", - contraintes.getRootBeanClass().getSimpleName(), - contraintes.getPropertyPath(), - contraintes.getMessage())); - } - throw new RuntimeException("Bean validation : " + errors); - } - } } diff --git a/samples/server/petstore/java-play-framework/app/controllers/PetApiController.java b/samples/server/petstore/java-play-framework/app/controllers/PetApiController.java index 2ecdbcbdc0b..cab362abda5 100644 --- a/samples/server/petstore/java-play-framework/app/controllers/PetApiController.java +++ b/samples/server/petstore/java-play-framework/app/controllers/PetApiController.java @@ -18,6 +18,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -26,11 +27,13 @@ public class PetApiController extends Controller { private final PetApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private PetApiController(PetApiControllerImpInterface imp) { + private PetApiController(Configuration configuration, PetApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -40,7 +43,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -74,8 +79,10 @@ public class PetApiController extends Controller { status.add(curParam); } List obj = imp.findPetsByStatus(status); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -94,8 +101,10 @@ public class PetApiController extends Controller { tags.add(curParam); } List obj = imp.findPetsByTags(tags); - for (Pet curItem : obj) { - curItem.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + for (Pet curItem : obj) { + SwaggerUtils.validate(curItem); + } } JsonNode result = mapper.valueToTree(obj); return ok(result); @@ -104,7 +113,9 @@ public class PetApiController extends Controller { @ApiAction public Result getPetById(Long petId) throws Exception { Pet obj = imp.getPetById(petId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -115,7 +126,9 @@ public class PetApiController extends Controller { Pet body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Pet.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -154,7 +167,9 @@ public class PetApiController extends Controller { } Http.MultipartFormData.FilePart file = request().body().asMultipartFormData().getFile("file"); ModelApiResponse obj = imp.uploadFile(petId, additionalMetadata, file); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework/app/controllers/StoreApiController.java b/samples/server/petstore/java-play-framework/app/controllers/StoreApiController.java index 8254d1f992e..c94c5aa111a 100644 --- a/samples/server/petstore/java-play-framework/app/controllers/StoreApiController.java +++ b/samples/server/petstore/java-play-framework/app/controllers/StoreApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -25,11 +26,13 @@ public class StoreApiController extends Controller { private final StoreApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private StoreApiController(StoreApiControllerImpInterface imp) { + private StoreApiController(Configuration configuration, StoreApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -49,7 +52,9 @@ public class StoreApiController extends Controller { @ApiAction public Result getOrderById( @Min(1) @Max(5)Long orderId) throws Exception { Order obj = imp.getOrderById(orderId); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -60,12 +65,16 @@ public class StoreApiController extends Controller { Order body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), Order.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } Order obj = imp.placeOrder(body); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } diff --git a/samples/server/petstore/java-play-framework/app/controllers/UserApiController.java b/samples/server/petstore/java-play-framework/app/controllers/UserApiController.java index b0676d8e3d5..245d076858a 100644 --- a/samples/server/petstore/java-play-framework/app/controllers/UserApiController.java +++ b/samples/server/petstore/java-play-framework/app/controllers/UserApiController.java @@ -17,6 +17,7 @@ import swagger.SwaggerUtils; import com.fasterxml.jackson.core.type.TypeReference; import javax.validation.constraints.*; +import play.Configuration; import swagger.SwaggerUtils.ApiAction; @@ -25,11 +26,13 @@ public class UserApiController extends Controller { private final UserApiControllerImpInterface imp; private final ObjectMapper mapper; + private final Configuration configuration; @Inject - private UserApiController(UserApiControllerImpInterface imp) { + private UserApiController(Configuration configuration, UserApiControllerImpInterface imp) { this.imp = imp; mapper = new ObjectMapper(); + this.configuration = configuration; } @@ -39,7 +42,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } @@ -53,8 +58,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -69,8 +76,10 @@ public class UserApiController extends Controller { List body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), new TypeReference>(){}); - for (User curItem : body) { - curItem.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + for (User curItem : body) { + SwaggerUtils.validate(curItem); + } } } else { throw new IllegalArgumentException("'body' parameter is required"); @@ -88,7 +97,9 @@ public class UserApiController extends Controller { @ApiAction public Result getUserByName(String username) throws Exception { User obj = imp.getUserByName(username); - obj.validate(); + if (configuration.getBoolean("useOutputBeanValidation")) { + SwaggerUtils.validate(obj); + } JsonNode result = mapper.valueToTree(obj); return ok(result); } @@ -126,7 +137,9 @@ public class UserApiController extends Controller { User body; if (nodebody != null) { body = mapper.readValue(nodebody.toString(), User.class); - body.validate(); + if (configuration.getBoolean("useInputBeanValidation")) { + SwaggerUtils.validate(body); + } } else { throw new IllegalArgumentException("'body' parameter is required"); } diff --git a/samples/server/petstore/java-play-framework/app/swagger/SwaggerUtils.java b/samples/server/petstore/java-play-framework/app/swagger/SwaggerUtils.java index c7d8bd3de9e..d4900e02167 100644 --- a/samples/server/petstore/java-play-framework/app/swagger/SwaggerUtils.java +++ b/samples/server/petstore/java-play-framework/app/swagger/SwaggerUtils.java @@ -9,6 +9,11 @@ import java.lang.annotation.Target; import java.text.SimpleDateFormat; import java.util.*; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + public class SwaggerUtils { @With(ApiCall.class) @@ -17,6 +22,22 @@ public class SwaggerUtils { public @interface ApiAction { } + public static void validate(T obj) { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + Set> constraintViolations = validator.validate(obj); + if (constraintViolations.size() > 0) { + StringBuilder errors = new StringBuilder(); + for (ConstraintViolation contraintes : constraintViolations) { + errors.append(String.format("%s.%s %s\n", + contraintes.getRootBeanClass().getSimpleName(), + contraintes.getPropertyPath(), + contraintes.getMessage())); + } + throw new RuntimeException("Bean validation : " + errors); + } + } + public static List parametersToList(String collectionFormat, String[] values){ List params = new ArrayList<>(); diff --git a/samples/server/petstore/java-play-framework/conf/application.conf b/samples/server/petstore/java-play-framework/conf/application.conf index a361b74d38e..46ce4312dd3 100644 --- a/samples/server/petstore/java-play-framework/conf/application.conf +++ b/samples/server/petstore/java-play-framework/conf/application.conf @@ -17,6 +17,15 @@ play.filters.headers.contentSecurityPolicy=null +# When using bean validation with the swagger api, the validator will check that every constraint is respected +# This is very useful when testing but could add a lot of overhead if you return a lot of data. Benchmark have +# shown that the time it takes to validate is exponential. +# If this is a concern in your application, or if you don't want to validate the output coming from your API for +# respecting its contract, set the "output" property below to "false". Since there is not a lot of data as input for +# an endpoint, I highly suggest you let the "input" property set to true. +useInputBeanValidation=true +useOutputBeanValidation=true + play.http.errorHandler="swagger.ErrorHandler" ## Akka