From 18ba90f5acd85b1eab5a0bc5f85b8db370f74103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20C=C3=B4t=C3=A9?= Date: Fri, 27 Oct 2017 10:48:27 -0400 Subject: [PATCH] [JavaPlayFramework] Add parameters for beanValidation in the application.conf + fix bugs (#6794) * Add configuration to split input and output bean validations. When useBeanValidation is used, the variable are created in the application.conf file and can be tweaked by environment. For example, dev and stage can have true to both but only have input in prod. * Refactor of mustache tags for more clarity * sample generation with refactor * Fix a couple of bugs with the fake-endpoint yaml but there is still 2 cases where it doesn't work. --- .../JavaPlayFramework/application.mustache | 11 ++++ .../conversionBegin.mustache | 2 +- .../JavaPlayFramework/conversionEnd.mustache | 2 +- .../itemConversionBegin.mustache | 2 +- .../itemConversionEnd.mustache | 2 +- .../newApiController.mustache | 57 +++++++++++++++---- .../resources/JavaPlayFramework/pojo.mustache | 18 ------ .../JavaPlayFramework/swaggerUtils.mustache | 25 ++++++++ .../app/apimodels/Category.java | 16 ------ .../app/apimodels/ModelApiResponse.java | 16 ------ .../app/apimodels/Order.java | 16 ------ .../app/apimodels/Pet.java | 16 ------ .../app/apimodels/Tag.java | 16 ------ .../app/apimodels/User.java | 16 ------ .../app/controllers/PetApiController.java | 13 ++++- .../app/controllers/StoreApiController.java | 9 ++- .../app/controllers/UserApiController.java | 25 +++++--- .../app/swagger/SwaggerUtils.java | 21 +++++++ .../conf/application.conf | 9 +++ .../apimodels/AdditionalPropertiesClass.java | 16 ------ .../app/apimodels/Animal.java | 16 ------ .../app/apimodels/AnimalFarm.java | 16 ------ .../apimodels/ArrayOfArrayOfNumberOnly.java | 16 ------ .../app/apimodels/ArrayOfNumberOnly.java | 16 ------ .../app/apimodels/ArrayTest.java | 16 ------ .../app/apimodels/Capitalization.java | 16 ------ .../app/apimodels/Cat.java | 16 ------ .../app/apimodels/Category.java | 16 ------ .../app/apimodels/ClassModel.java | 16 ------ .../app/apimodels/Client.java | 16 ------ .../app/apimodels/Dog.java | 16 ------ .../app/apimodels/EnumArrays.java | 16 ------ .../app/apimodels/EnumTest.java | 16 ------ .../app/apimodels/FormatTest.java | 16 ------ .../app/apimodels/HasOnlyReadOnly.java | 16 ------ .../app/apimodels/MapTest.java | 16 ------ ...ropertiesAndAdditionalPropertiesClass.java | 16 ------ .../app/apimodels/Model200Response.java | 16 ------ .../app/apimodels/ModelApiResponse.java | 16 ------ .../app/apimodels/ModelReturn.java | 16 ------ .../app/apimodels/Name.java | 16 ------ .../app/apimodels/NumberOnly.java | 16 ------ .../app/apimodels/Order.java | 16 ------ .../app/apimodels/OuterComposite.java | 16 ------ .../app/apimodels/Pet.java | 16 ------ .../app/apimodels/ReadOnlyFirst.java | 16 ------ .../app/apimodels/SpecialModelName.java | 16 ------ .../app/apimodels/Tag.java | 16 ------ .../app/apimodels/User.java | 16 ------ .../controllers/AnotherFakeApiController.java | 13 ++++- .../app/controllers/FakeApiController.java | 57 +++++++++++++++---- .../app/controllers/FakeApiControllerImp.java | 6 ++ .../FakeApiControllerImpInterface.java | 2 + .../FakeClassnameTags123ApiController.java | 13 ++++- .../app/controllers/PetApiController.java | 33 ++++++++--- .../app/controllers/StoreApiController.java | 17 ++++-- .../app/controllers/UserApiController.java | 29 +++++++--- .../app/swagger/SwaggerUtils.java | 21 +++++++ .../conf/application.conf | 9 +++ .../conf/routes | 1 + .../public/swagger.json | 28 +++++++++ .../app/apimodels/Category.java | 1 - .../app/apimodels/ModelApiResponse.java | 1 - .../app/apimodels/Order.java | 1 - .../app/apimodels/Pet.java | 1 - .../app/apimodels/Tag.java | 1 - .../app/apimodels/User.java | 1 - .../app/swagger/SwaggerUtils.java | 2 + .../conf/application.conf | 1 + .../app/apimodels/Category.java | 16 ------ .../app/apimodels/ModelApiResponse.java | 16 ------ .../app/apimodels/Order.java | 16 ------ .../app/apimodels/Pet.java | 16 ------ .../app/apimodels/Tag.java | 16 ------ .../app/apimodels/User.java | 16 ------ .../app/controllers/PetApiController.java | 33 ++++++++--- .../app/controllers/StoreApiController.java | 17 ++++-- .../app/controllers/UserApiController.java | 29 +++++++--- .../app/swagger/SwaggerUtils.java | 21 +++++++ .../conf/application.conf | 9 +++ .../app/apimodels/Category.java | 16 ------ .../app/apimodels/ModelApiResponse.java | 16 ------ .../app/apimodels/Order.java | 16 ------ .../app/apimodels/Pet.java | 16 ------ .../app/apimodels/Tag.java | 16 ------ .../app/apimodels/User.java | 16 ------ .../app/controllers/PetApiController.java | 33 ++++++++--- .../app/controllers/StoreApiController.java | 17 ++++-- .../app/controllers/UserApiController.java | 29 +++++++--- .../app/swagger/SwaggerUtils.java | 21 +++++++ .../conf/application.conf | 9 +++ .../app/apimodels/Category.java | 16 ------ .../app/apimodels/ModelApiResponse.java | 16 ------ .../app/apimodels/Order.java | 16 ------ .../app/apimodels/Pet.java | 16 ------ .../app/apimodels/Tag.java | 16 ------ .../app/apimodels/User.java | 16 ------ .../app/controllers/PetApiController.java | 33 ++++++++--- .../app/controllers/StoreApiController.java | 17 ++++-- .../app/controllers/UserApiController.java | 29 +++++++--- .../app/swagger/SwaggerUtils.java | 21 +++++++ .../conf/application.conf | 9 +++ .../app/apimodels/Category.java | 16 ------ .../app/apimodels/ModelApiResponse.java | 16 ------ .../app/apimodels/Order.java | 16 ------ .../app/apimodels/Pet.java | 16 ------ .../app/apimodels/Tag.java | 16 ------ .../app/apimodels/User.java | 16 ------ .../app/controllers/PetApiController.java | 33 ++++++++--- .../app/controllers/StoreApiController.java | 17 ++++-- .../app/controllers/UserApiController.java | 29 +++++++--- .../app/swagger/SwaggerUtils.java | 21 +++++++ .../conf/application.conf | 9 +++ .../app/apimodels/Category.java | 16 ------ .../app/apimodels/ModelApiResponse.java | 16 ------ .../app/apimodels/Order.java | 16 ------ .../app/apimodels/Pet.java | 16 ------ .../app/apimodels/Tag.java | 16 ------ .../app/apimodels/User.java | 16 ------ .../app/controllers/PetApiController.java | 33 ++++++++--- .../app/controllers/StoreApiController.java | 17 ++++-- .../app/controllers/UserApiController.java | 29 +++++++--- .../app/swagger/SwaggerUtils.java | 21 +++++++ .../java-play-framework/conf/application.conf | 9 +++ 124 files changed, 784 insertions(+), 1251 deletions(-) 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