diff --git a/src/ActionParameterHandler.ts b/src/ActionParameterHandler.ts index 5c49453d..0bc30401 100644 --- a/src/ActionParameterHandler.ts +++ b/src/ActionParameterHandler.ts @@ -232,7 +232,7 @@ export class ActionParameterHandler { && (value instanceof paramMetadata.targetType); if (isValidationEnabled && shouldValidate) { - const options = paramMetadata.validate instanceof Object ? paramMetadata.validate : this.driver.validationOptions; + const options = Object.assign({}, this.driver.validationOptions, paramMetadata.validate); return validate(value, options) .then(() => value) .catch((validationErrors: ValidationError[]) => { diff --git a/test/functional/class-validator-options.spec.ts b/test/functional/class-validator-options.spec.ts index be925cad..056d5aea 100644 --- a/test/functional/class-validator-options.spec.ts +++ b/test/functional/class-validator-options.spec.ts @@ -158,6 +158,52 @@ describe("parameters auto-validation", () => { }); }); + describe("should merge local validation options with global validation options prioritizing local", () => { + + let requestFilter: any; + beforeEach(() => { + requestFilter = undefined; + }); + + before(() => { + getMetadataArgsStorage().reset(); + + @JsonController() + class ClassTransformUserController { + + @Get("/user") + getUsers(@QueryParam("filter", { validate: { skipMissingProperties: false } }) filter: UserFilter): any { + requestFilter = filter; + const user = new UserModel(); + user.id = 1; + user._firstName = "Umed"; + user._lastName = "Khudoiberdiev"; + return user; + } + + } + }); + + const options: RoutingControllersOptions = { + validation: { + whitelist: true, + skipMissingProperties: true + } + }; + + let expressApp: any, koaApp: any; + before(done => expressApp = createExpressServer(options).listen(3001, done)); + after(done => expressApp.close(done)); + before(done => koaApp = createKoaServer(options).listen(3002, done)); + after(done => koaApp.close(done)); + + assertRequest([3001, 3002], "get", "user?filter={\"keyword\": \"aValidKeyword\", \"notKeyword\": \"Um\", \"__somethingPrivate\": \"blablabla\"}", response => { + expect(response).to.have.status(200); + expect(requestFilter).to.have.property("keyword"); + expect(requestFilter).to.not.have.property("notKeyword"); + }); + }); + describe("should pass the valid param after validation", () => { let requestFilter: any;