You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2019/11/21 09:23:01 UTC

[servicecomb-toolkit] 01/10: SCB-1580 Configurable oas style check rules Make ValidatorFactory create validators by options

This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit c104cba3c064a1a1b2cca604976ffdddde2ffbee
Author: Daniel Qian <ch...@gmail.com>
AuthorDate: Tue Nov 19 18:56:04 2019 +0800

    SCB-1580 Configurable oas style check rules
    Make ValidatorFactory create validators by options
---
 .../servicecomb/toolkit/cli/CheckStyleBase.java    |  22 ++--
 .../config/ComponentsValidatorConfiguration.java   |  68 ------------
 .../config/EncodingValidatorConfiguration.java     |  33 ------
 .../config/HeaderValidatorConfiguration.java       |  33 ------
 .../config/InfoValidatorConfiguration.java         |  33 ------
 .../config/OpenApiValidatorConfiguration.java      |  45 --------
 .../config/OperationValidatorConfiguration.java    |  52 ---------
 .../config/ParameterValidatorConfiguration.java    |  53 ---------
 .../config/PathsValidatorConfiguration.java        |  33 ------
 .../config/RequestBodyValidatorConfiguration.java  |  33 ------
 .../config/ResponseValidatorConfiguration.java     |  33 ------
 .../config/SchemaValidatorConfiguration.java       |  38 -------
 .../config/TagValidatorConfiguration.java          |  45 --------
 .../config/ValidatorConfigurationsTest.java        |  68 ------------
 .../factory/DefaultComponentsValidatorFactory.java | 121 +++++++++++++++------
 .../factory/DefaultEncodingValidatorFactory.java   |  26 +++--
 .../factory/DefaultHeaderValidatorFactory.java     |  24 ++--
 .../factory/DefaultInfoValidatorFactory.java       |  22 ++--
 .../factory/DefaultMediaTypeValidatorFactory.java  |  15 +--
 .../factory/DefaultOasSpecValidatorFactory.java    |   5 +-
 .../factory/DefaultOpenApiValidatorFactory.java    |  66 ++++++-----
 .../factory/DefaultOperationValidatorFactory.java  |  68 +++++++++---
 .../factory/DefaultParameterValidatorFactory.java  |  67 +++++++++---
 .../factory/DefaultPathItemValidatorFactory.java   |  15 +--
 .../factory/DefaultPathsValidatorFactory.java      |  25 +++--
 .../DefaultRequestBodyValidatorFactory.java        |  24 ++--
 .../factory/DefaultResponseValidatorFactory.java   |  28 +++--
 .../factory/DefaultResponsesValidatorFactory.java  |  13 ++-
 .../factory/DefaultSchemaValidatorFactory.java     |  35 ++++--
 .../DefaultSecuritySchemeValidatorFactory.java     |   9 +-
 .../factory/DefaultServerValidatorFactory.java     |   9 +-
 .../factory/DefaultTagValidatorFactory.java        |  45 ++++++--
 .../factory/ValidatorFactoryComponents.java}       |   2 +-
 .../ComponentsCallbacksKeysCaseValidator.java}     |  34 +++---
 .../ComponentsExamplesKeysCaseValidator.java}      |  34 +++---
 .../ComponentsHeadersKeysCaseValidator.java}       |  34 +++---
 .../components/ComponentsKeysValidators.java       |  59 ----------
 .../ComponentsLinksKeysCaseValidator.java}         |  34 +++---
 .../ComponentsParametersKeysCaseValidator.java}    |  34 +++---
 .../ComponentsRequestBodiesKeysCaseValidator.java} |  34 +++---
 .../ComponentsResponsesKeysCaseValidator.java}     |  34 +++---
 .../ComponentsSchemasKeysCaseValidator.java}       |  34 +++---
 ...omponentsSecuritySchemesKeysCaseValidator.java} |  34 +++---
 ....java => EncodingHeadersKeysCaseValidator.java} |  27 +++--
 .../header/HeaderDescriptionRequiredValidator.java |   6 +-
 .../info/InfoDescriptionRequiredValidator.java     |  11 +-
 ...or.java => OpenApiSecuritySizeEqValidator.java} |  31 ++++--
 ...dator.java => OpenApiTagsSizeGteValidator.java} |  25 +++--
 ...idator.java => OpenApiVersionGteValidator.java} |  23 +++-
 ...alidator.java => OperationIdCaseValidator.java} |  28 +++--
 ...r.java => OperationServersSizeEqValidator.java} |  32 ++++--
 .../OperationSummaryRequiredValidator.java         |   7 +-
 .../operation/OperationTagsReferenceValidator.java |  19 ++--
 ...ator.java => OperationTagsSizeEqValidator.java} |  25 +++--
 .../ParameterDescriptionRequiredValidator.java     |   3 +
 ....java => ParameterNameCookieCaseValidator.java} |  30 +++--
 ....java => ParameterNameHeaderCaseValidator.java} |  29 +++--
 ...or.java => ParameterNamePathCaseValidator.java} |  29 +++--
 ...r.java => ParameterNameQueryCaseValidator.java} |  29 +++--
 ...seValidator.java => PathsKeyCaseValidator.java} |  37 ++++---
 .../RequestBodyDescriptionRequiredValidator.java   |   3 +
 ....java => ResponseHeadersKeysCaseValidator.java} |  27 +++--
 ...java => SchemaPropertiesKeysCaseValidator.java} |  28 +++--
 ...ator.java => SchemaTitleRequiredValidator.java} |  33 +++---
 .../tag/TagDescriptionRequiredValidator.java       |   5 +-
 ...ator.java => TagMustBeReferencedValidator.java} |  16 ++-
 ...aseValidator.java => TagNameCaseValidator.java} |  28 +++--
 .../DefaultComponentsValidatorFactoryTest.java     |  12 +-
 .../DefaultEncodingValidatorFactoryTest.java       |  12 +-
 .../factory/DefaultHeaderValidatorFactoryTest.java |  12 +-
 .../factory/DefaultInfoValidatorFactoryTest.java   |  12 +-
 .../DefaultMediaTypeValidatorFactoryTest.java      |  12 +-
 .../DefaultOasSpecValidatorFactoryTest.java        |   8 +-
 .../DefaultOpenApiValidatorFactoryTest.java        |  12 +-
 .../DefaultOperationValidatorFactoryTest.java      |  12 +-
 .../DefaultParameterValidatorFactoryTest.java      |  12 +-
 .../DefaultPathItemValidatorFactoryTest.java       |  12 +-
 .../factory/DefaultPathsValidatorFactoryTest.java  |  12 +-
 .../DefaultRequestBodyValidatorFactoryTest.java    |  12 +-
 .../DefaultResponseValidatorFactoryTest.java       |  12 +-
 .../DefaultResponsesValidatorFactoryTest.java      |  12 +-
 .../factory/DefaultSchemaValidatorFactoryTest.java |  12 +-
 .../DefaultSecuritySchemeValidatorFactoryTest.java |  12 +-
 .../factory/DefaultServerValidatorFactoryTest.java |  12 +-
 .../factory/DefaultTagValidatorFactoryTest.java    |  12 +-
 .../validator/OasStyleCheckTestBase.java}          |  27 +++--
 ... ComponentsCallbacksKeysCaseValidatorTest.java} |  40 ++-----
 ...> ComponentsExamplesKeysCaseValidatorTest.java} |  41 ++-----
 ...=> ComponentsHeadersKeysCaseValidatorTest.java} |  42 ++-----
 ...a => ComponentsLinksKeysCaseValidatorTest.java} |  42 ++-----
 ...ComponentsParametersKeysCaseValidatorTest.java} |  42 ++-----
 ...ponentsRequestBodiesKeysCaseValidatorTest.java} |  42 ++-----
 ... ComponentsResponsesKeysCaseValidatorTest.java} |  42 ++-----
 ...=> ComponentsSchemasKeysCaseValidatorTest.java} |  42 ++-----
 ...nentsSecuritySchemesKeysCaseValidatorTest.java} |  49 ++++-----
 .../EncodingHeadersKeysCaseValidatorTest.java      | 120 ++++++++++++++++++++
 .../HeaderDescriptionRequiredValidatorTest.java    |  33 ++----
 .../info/InfoDescriptionRequiredValidatorTest.java |  33 ++----
 ...ava => OpenApiSecuritySizeEqValidatorTest.java} |  41 +++----
 ...t.java => OpenApiTagsSizeGteValidatorTest.java} |  35 ++----
 ...st.java => OpenApiVersionGteValidatorTest.java} |  36 ++----
 ...Test.java => OperationIdCaseValidatorTest.java} |  37 ++-----
 ...va => OperationServersSizeEqValidatorTest.java} |  36 ++----
 .../OperationSummaryRequiredValidatorTest.java     |  34 ++----
 .../OperationTagsReferenceValidatorTest.java       |  36 ++----
 ....java => OperationTagsSizeEqValidatorTest.java} |  36 ++----
 .../ParameterDescriptionRequiredValidatorTest.java |  33 ++----
 ...a => ParameterNameCookieCaseValidatorTest.java} |  39 +++----
 ...a => ParameterNameHeaderCaseValidatorTest.java} |  39 +++----
 ...ava => ParameterNamePathCaseValidatorTest.java} |  39 +++----
 ...va => ParameterNameQueryCaseValidatorTest.java} |  39 +++----
 ...torTest.java => PathsKeyCaseValidatorTest.java} |  40 +++----
 ...equestBodyDescriptionRequiredValidatorTest.java |  35 ++----
 .../ResponseHeadersKeysCaseValidatorTest.java}     |  64 +++++------
 ... => SchemaPropertiesKeysCaseValidatorTest.java} |  74 +++++++------
 ....java => SchemaTitleRequiredValidatorTest.java} |  37 +++----
 .../tag/TagDescriptionRequiredValidatorTest.java   |  33 ++----
 ....java => TagMustBeReferencedValidatorTest.java} |  35 ++----
 ...atorTest.java => TagNameCaseValidatorTest.java} |  38 +++----
 ...petstore-security-schemes-upper-camel-case.yaml |  52 +++++++++
 .../petstore-encoding-headers-key-case-1.yaml      |  48 ++++++++
 .../petstore-encoding-headers-key-case-2.yaml      |  43 ++++++++
 .../petstore-encoding-headers-key-case-3.yaml      |  51 +++++++++
 .../petstore-encoding-headers-key-case-4.yaml      |  52 +++++++++
 .../petstore-response-headers-key-case.yaml        |  44 ++++++++
 .../servicecomb/toolkit/oasv/FactoryOptions.java   |  48 ++++++++
 .../factory/DiffValidatorCreationOptions.java      |   5 +
 .../toolkit/oasv/util/StringCaseUtils.java         |  12 ++
 .../factory/OasObjectValidatorFactory.java         |   3 +-
 .../factory/OasSpecValidatorFactory.java           |   3 +-
 .../encoding/EncodingHeadersKeysValidator.java     |   6 +-
 .../response/ResponseHeadersKeysValidator.java     |   8 +-
 .../toolkit/oasv/util/StringCaseUtilsTest.java     |  12 +-
 .../validation/test/OasValidatorTestBaseNew.java}  |  46 ++++----
 134 files changed, 2023 insertions(+), 2157 deletions(-)

diff --git a/cli/src/main/java/org/apache/servicecomb/toolkit/cli/CheckStyleBase.java b/cli/src/main/java/org/apache/servicecomb/toolkit/cli/CheckStyleBase.java
index 393d97d..0048a6f 100644
--- a/cli/src/main/java/org/apache/servicecomb/toolkit/cli/CheckStyleBase.java
+++ b/cli/src/main/java/org/apache/servicecomb/toolkit/cli/CheckStyleBase.java
@@ -17,16 +17,14 @@
 
 package org.apache.servicecomb.toolkit.cli;
 
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-
+import io.airlift.airline.Arguments;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.parser.core.models.SwaggerParseResult;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
 import org.apache.servicecomb.toolkit.oasv.compliance.ComplianceCheckParser;
-import org.apache.servicecomb.toolkit.oasv.compliance.factory.DefaultOasSpecValidatorFactory;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
@@ -35,9 +33,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
-import io.airlift.airline.Arguments;
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.parser.core.models.SwaggerParseResult;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
 
 public class CheckStyleBase implements Runnable {
 
@@ -88,10 +87,11 @@ public class CheckStyleBase implements Runnable {
 
   private OasSpecValidator createOasSpecValidator() {
     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
-        DefaultOasSpecValidatorFactory.class.getPackage().getName());
+        ValidatorFactoryComponents.class);
     try {
       OasSpecValidatorFactory oasSpecValidatorFactory = ctx.getBean(OasSpecValidatorFactory.class);
-      return oasSpecValidatorFactory.create();
+      // TODO load options
+      return oasSpecValidatorFactory.create(null);
     } finally {
       ctx.close();
     }
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ComponentsValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ComponentsValidatorConfiguration.java
deleted file mode 100755
index 6acd7fe..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ComponentsValidatorConfiguration.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class ComponentsValidatorConfiguration {
-
-  @Bean
-  public ComponentsValidator componentsCallbacksUpperCamelCaseValidator() {
-    return ComponentsKeysValidators.CALLBACKS_UPPER_CAMEL_CASE_VALIDATOR;
-  }
-
-  @Bean
-  public ComponentsValidator componentsExamplesUpperCamelCaseValidator() {
-    return ComponentsKeysValidators.EXAMPLES_UPPER_CAMEL_CASE_VALIDATOR;
-  }
-
-  @Bean
-  public ComponentsValidator componentsHeadersUpperHyphenCaseValidator() {
-    return ComponentsKeysValidators.HEADERS_UPPER_HYPHEN_CASE_VALIDATOR;
-  }
-
-  @Bean
-  public ComponentsValidator componentsLinksUpperCamelCaseValidator() {
-    return ComponentsKeysValidators.LINKS_UPPER_CAMEL_CASE_VALIDATOR;
-  }
-
-  @Bean
-  public ComponentsValidator componentsParametersUpperCamelCaseValidator() {
-    return ComponentsKeysValidators.PARAMETERS_UPPER_CAMEL_CASE_VALIDATOR;
-  }
-
-  @Bean
-  public ComponentsValidator componentsRequestBodiesUpperCamelCaseValidator() {
-    return ComponentsKeysValidators.REQUEST_BODIES_UPPER_CAMEL_CASE_VALIDATOR;
-  }
-
-  @Bean
-  public ComponentsValidator componentsResponsesUpperCamelCaseValidator() {
-    return ComponentsKeysValidators.RESPONSES_UPPER_CAMEL_CASE_VALIDATOR;
-  }
-
-  @Bean
-  public ComponentsValidator componentsSchemasUpperCamelCaseValidator() {
-    return ComponentsKeysValidators.SCHEMAS_UPPER_CAMEL_CASE_VALIDATOR;
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/EncodingValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/EncodingValidatorConfiguration.java
deleted file mode 100755
index 508bce8..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/EncodingValidatorConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.encoding.EncodingKeysValidators;
-import org.apache.servicecomb.toolkit.oasv.validation.api.EncodingValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class EncodingValidatorConfiguration {
-
-  @Bean
-  public EncodingValidator encodingHeadersUpperHyphenCaseValidator() {
-    return EncodingKeysValidators.HEADERS_UPPER_HYPHEN_CASE_VALIDATOR;
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/HeaderValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/HeaderValidatorConfiguration.java
deleted file mode 100755
index ec5c215..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/HeaderValidatorConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.header.HeaderDescriptionRequiredValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.HeaderValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class HeaderValidatorConfiguration {
-
-  @Bean
-  public HeaderValidator headerDescriptionRequiredValidator() {
-    return new HeaderDescriptionRequiredValidator();
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/InfoValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/InfoValidatorConfiguration.java
deleted file mode 100755
index 924878a..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/InfoValidatorConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.info.InfoDescriptionRequiredValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.InfoValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class InfoValidatorConfiguration {
-
-  @Bean
-  public InfoValidator infoDescriptionRequiredValidator() {
-    return new InfoDescriptionRequiredValidator();
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/OpenApiValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/OpenApiValidatorConfiguration.java
deleted file mode 100755
index affe351..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/OpenApiValidatorConfiguration.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi.OpenApiSecurityEmptyValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi.OpenApiTagNotEmptyValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi.OpenApiVersionValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class OpenApiValidatorConfiguration {
-
-  @Bean
-  public OpenApiValidator openApiTagNotEmptyValidator() {
-    return new OpenApiTagNotEmptyValidator();
-  }
-
-  @Bean
-  public OpenApiValidator openApiVersionValidator() {
-    return new OpenApiVersionValidator();
-  }
-
-  @Bean
-  public OpenApiValidator openApiSecurityEmptyValidator() {
-    return new OpenApiSecurityEmptyValidator();
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/OperationValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/OperationValidatorConfiguration.java
deleted file mode 100755
index e00784f..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/OperationValidatorConfiguration.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.operation.*;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class OperationValidatorConfiguration {
-
-  @Bean
-  public OperationValidator operationIdLowerCamelCaseValidator() {
-    return new OperationIdLowerCamelCaseValidator();
-  }
-
-  @Bean
-  public OperationValidator operationSummaryRequiredValidator() {
-    return new OperationSummaryRequiredValidator();
-  }
-
-  @Bean
-  public OperationValidator operationTagsOnlyOneValidator() {
-    return new OperationTagsOnlyOneValidator();
-  }
-
-  @Bean
-  public OperationValidator operationTagsReferenceValidator() {
-    return new OperationTagsReferenceValidator();
-  }
-
-  @Bean
-  public OperationValidator operationServersEmptyValidator() {
-    return new OperationServersEmptyValidator();
-  }
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ParameterValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ParameterValidatorConfiguration.java
deleted file mode 100755
index 065131d..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ParameterValidatorConfiguration.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter.*;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class ParameterValidatorConfiguration {
-
-  @Bean
-  public ParameterValidator parameterCookieLowerCamelCaseValidator() {
-    return new ParameterCookieLowerCamelCaseValidator();
-  }
-
-  @Bean
-  public ParameterValidator parameterHeaderUpperHyphenCaseValidator() {
-    return new ParameterHeaderUpperHyphenCaseValidator();
-  }
-
-  @Bean
-  public ParameterValidator parameterPathLowerCamelCaseValidator() {
-    return new ParameterPathLowerCamelCaseValidator();
-  }
-
-  @Bean
-  public ParameterValidator parameterQueryLowerCamelCaseValidator() {
-    return new ParameterQueryLowerCamelCaseValidator();
-  }
-
-  @Bean
-  public ParameterValidator parameterDescriptionRequiredValidator() {
-    return new ParameterDescriptionRequiredValidator();
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/PathsValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/PathsValidatorConfiguration.java
deleted file mode 100755
index 6581d82..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/PathsValidatorConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.paths.PathsLowerCamelCaseValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.PathsValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class PathsValidatorConfiguration {
-
-  @Bean
-  public PathsValidator pathsLowerCamelCaseValidator() {
-    return new PathsLowerCamelCaseValidator();
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/RequestBodyValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/RequestBodyValidatorConfiguration.java
deleted file mode 100755
index ecd0bc8..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/RequestBodyValidatorConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.requestbody.RequestBodyDescriptionRequiredValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.RequestBodyValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class RequestBodyValidatorConfiguration {
-
-  @Bean
-  public RequestBodyValidator requestBodyDescriptionRequiredValidator() {
-    return new RequestBodyDescriptionRequiredValidator();
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ResponseValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ResponseValidatorConfiguration.java
deleted file mode 100755
index d192733..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ResponseValidatorConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.response.ResponseKeysValidators;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ResponseValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class ResponseValidatorConfiguration {
-
-  @Bean
-  public ResponseValidator responseHeadersUpperHyphenCaseValidator() {
-    return ResponseKeysValidators.HEADERS_UPPER_HYPHEN_CASE_VALIDATOR;
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/SchemaValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/SchemaValidatorConfiguration.java
deleted file mode 100755
index 7aad01b..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/SchemaValidatorConfiguration.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.schema.SchemaKeysValidators;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.schema.SchemaTitleValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.SchemaValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class SchemaValidatorConfiguration {
-
-  @Bean
-  public SchemaValidator schemaTitleValidator() {
-    return new SchemaTitleValidator();
-  }
-
-  @Bean
-  public SchemaValidator schemaPropertiesLowerCamelCaseValidator() {
-    return SchemaKeysValidators.PROPERTIES_LOWER_CAMEL_CASE_VALIDATOR;
-  }
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/TagValidatorConfiguration.java b/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/TagValidatorConfiguration.java
deleted file mode 100755
index e402d03..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/config/TagValidatorConfiguration.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.tag.TagDescriptionRequiredValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.tag.TagNameUpperCamelCaseValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.tag.TagReferenceValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.TagValidator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class TagValidatorConfiguration {
-
-  @Bean
-  public TagValidator tagDescriptionRequiredValidator() {
-    return new TagDescriptionRequiredValidator();
-  }
-
-  @Bean
-  public TagValidator tagNameUpperCamelCaseValidator() {
-    return new TagNameUpperCamelCaseValidator();
-  }
-
-  @Bean
-  public TagValidator tagReferenceValidator() {
-    return new TagReferenceValidator();
-  }
-
-}
diff --git a/oas-validator/oas-validator-compliance-spring/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ValidatorConfigurationsTest.java b/oas-validator/oas-validator-compliance-spring/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ValidatorConfigurationsTest.java
deleted file mode 100644
index dda31f8..0000000
--- a/oas-validator/oas-validator-compliance-spring/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/config/ValidatorConfigurationsTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.config;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.EncodingValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.HeaderValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.InfoValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.PathsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.RequestBodyValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.SchemaValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.TagValidator;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.BeansException;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-@SpringBootApplication
-public class ValidatorConfigurationsTest implements ApplicationContextAware {
-
-  private ApplicationContext applicationContext;
-
-  @Test
-  public void testConfigurations() {
-    assertThat(applicationContext.getBeansOfType(ComponentsValidator.class)).hasSize(14);
-    assertThat(applicationContext.getBeansOfType(EncodingValidator.class)).hasSize(2);
-    assertThat(applicationContext.getBeansOfType(HeaderValidator.class)).hasSize(2);
-    assertThat(applicationContext.getBeansOfType(InfoValidator.class)).hasSize(1);
-    assertThat(applicationContext.getBeansOfType(OpenApiValidator.class)).hasSize(8);
-    assertThat(applicationContext.getBeansOfType(OperationValidator.class)).hasSize(8);
-    assertThat(applicationContext.getBeansOfType(ParameterValidator.class)).hasSize(7);
-    assertThat(applicationContext.getBeansOfType(PathsValidator.class)).hasSize(2);
-    assertThat(applicationContext.getBeansOfType(RequestBodyValidator.class)).hasSize(2);
-    assertThat(applicationContext.getBeansOfType(SchemaValidator.class)).hasSize(2);
-    assertThat(applicationContext.getBeansOfType(TagValidator.class)).hasSize(3);
-  }
-
-  @Override
-  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-    this.applicationContext = applicationContext;
-  }
-}
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultComponentsValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultComponentsValidatorFactory.java
index 2ff27b5..1fb4fe2 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultComponentsValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultComponentsValidatorFactory.java
@@ -17,27 +17,17 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.components.*;
+import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.factory.*;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.*;
+import org.springframework.stereotype.Component;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.ComponentsValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.HeaderValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.ParameterValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.RequestBodyValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.ResponseValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.SchemaValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.SecuritySchemeValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsHeadersValuesValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsParametersValuesValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsRequestBodiesValuesValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsResponsesValuesValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsSchemasValuesValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsSecuritySchemesValuesValidator;
-import org.springframework.stereotype.Component;
-
 
 @Component
 public class DefaultComponentsValidatorFactory implements ComponentsValidatorFactory {
@@ -70,27 +60,92 @@ public class DefaultComponentsValidatorFactory implements ComponentsValidatorFac
   }
 
   @Override
-  public List<ComponentsValidator> create() {
+  public List<ComponentsValidator> create(FactoryOptions options) {
     List<ComponentsValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new ComponentsHeadersValuesValidator(headerValidatorFactory.create()));
-    validators.add(new ComponentsParametersValuesValidator(parameterValidatorFactory.create()));
-    validators.add(new ComponentsRequestBodiesValuesValidator(requestBodyValidatorFactory.create()));
-    validators.add(new ComponentsResponsesValuesValidator(responseValidatorFactory.create()));
-    validators.add(new ComponentsSchemasValuesValidator(schemaValidatorFactory.create()));
-    validators.add(new ComponentsSecuritySchemesValuesValidator(securitySchemeValidatorFactory.create()));
+    validators.add(new ComponentsHeadersValuesValidator(headerValidatorFactory.create(options)));
+    validators.add(new ComponentsParametersValuesValidator(parameterValidatorFactory.create(options)));
+    validators.add(new ComponentsRequestBodiesValuesValidator(requestBodyValidatorFactory.create(options)));
+    validators.add(new ComponentsResponsesValuesValidator(responseValidatorFactory.create(options)));
+    validators.add(new ComponentsSchemasValuesValidator(schemaValidatorFactory.create(options)));
+    validators.add(new ComponentsSecuritySchemesValuesValidator(securitySchemeValidatorFactory.create(options)));
 
     // concretes
-    validators.add(ComponentsKeysValidators.CALLBACKS_UPPER_CAMEL_CASE_VALIDATOR);
-    validators.add(ComponentsKeysValidators.EXAMPLES_UPPER_CAMEL_CASE_VALIDATOR);
-    validators.add(ComponentsKeysValidators.HEADERS_UPPER_HYPHEN_CASE_VALIDATOR);
-    validators.add(ComponentsKeysValidators.LINKS_UPPER_CAMEL_CASE_VALIDATOR);
-    validators.add(ComponentsKeysValidators.PARAMETERS_UPPER_CAMEL_CASE_VALIDATOR);
-    validators.add(ComponentsKeysValidators.REQUEST_BODIES_UPPER_CAMEL_CASE_VALIDATOR);
-    validators.add(ComponentsKeysValidators.RESPONSES_UPPER_CAMEL_CASE_VALIDATOR);
-    validators.add(ComponentsKeysValidators.SCHEMAS_UPPER_CAMEL_CASE_VALIDATOR);
-
+    addComponentsCallbacksKeysCaseValidator(validators, options);
+    addComponentsExamplesKeysCaseValidator(validators, options);
+    addComponentsHeadersKeysCaseValidator(validators, options);
+    addComponentsLinksKeysCaseValidator(validators, options);
+    addComponentsParametersKeysCaseValidator(validators, options);
+    addComponentsRequestBodiesKeysCaseValidator(validators, options);
+    addComponentsResponsesKeysCaseValidator(validators, options);
+    addComponentsSchemasKeysCaseValidator(validators, options);
+    addComponentsSecuritySchemesKeysCaseValidator(validators, options);
     return Collections.unmodifiableList(validators);
   }
+
+  private void addComponentsCallbacksKeysCaseValidator(List<ComponentsValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ComponentsCallbacksKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ComponentsCallbacksKeysCaseValidator(expectedCase));
+    }
+  }
+
+  private void addComponentsExamplesKeysCaseValidator(List<ComponentsValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ComponentsExamplesKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ComponentsExamplesKeysCaseValidator(expectedCase));
+    }
+  }
+
+  private void addComponentsHeadersKeysCaseValidator(List<ComponentsValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ComponentsHeadersKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ComponentsHeadersKeysCaseValidator(expectedCase));
+    }
+  }
+
+  private void addComponentsLinksKeysCaseValidator(List<ComponentsValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ComponentsLinksKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ComponentsLinksKeysCaseValidator(expectedCase));
+    }
+  }
+
+  private void addComponentsParametersKeysCaseValidator(List<ComponentsValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ComponentsParametersKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ComponentsParametersKeysCaseValidator(expectedCase));
+    }
+  }
+
+  private void addComponentsRequestBodiesKeysCaseValidator(List<ComponentsValidator> validators,
+      FactoryOptions options) {
+    String expectedCase = options.getString(ComponentsRequestBodiesKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ComponentsRequestBodiesKeysCaseValidator(expectedCase));
+    }
+  }
+
+  private void addComponentsResponsesKeysCaseValidator(List<ComponentsValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ComponentsResponsesKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ComponentsResponsesKeysCaseValidator(expectedCase));
+    }
+  }
+
+  private void addComponentsSchemasKeysCaseValidator(List<ComponentsValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ComponentsSchemasKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ComponentsSchemasKeysCaseValidator(expectedCase));
+    }
+  }
+
+  private void addComponentsSecuritySchemesKeysCaseValidator(List<ComponentsValidator> validators,
+      FactoryOptions options) {
+    String expectedCase = options.getString(ComponentsSecuritySchemesKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ComponentsSecuritySchemesKeysCaseValidator(expectedCase));
+    }
+  }
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultEncodingValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultEncodingValidatorFactory.java
index 8b62a11..5e96347 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultEncodingValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultEncodingValidatorFactory.java
@@ -17,17 +17,18 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.encoding.EncodingKeysValidators;
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.encoding.EncodingHeadersKeysCaseValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.EncodingValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.EncodingValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.HeaderValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.encoding.EncodingHeadersValuesValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultEncodingValidatorFactory implements EncodingValidatorFactory {
 
@@ -39,16 +40,23 @@ public class DefaultEncodingValidatorFactory implements EncodingValidatorFactory
   }
 
   @Override
-  public List<EncodingValidator> create() {
+  public List<EncodingValidator> create(FactoryOptions options) {
 
     List<EncodingValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new EncodingHeadersValuesValidator(headerValidatorFactory.create()));
+    validators.add(new EncodingHeadersValuesValidator(headerValidatorFactory.create(options)));
 
     // concrete
-    validators.add(EncodingKeysValidators.HEADERS_UPPER_HYPHEN_CASE_VALIDATOR);
-
+    addEncodingHeadersKeysCaseValidator(validators, options);
     return Collections.unmodifiableList(validators);
   }
+
+  private void addEncodingHeadersKeysCaseValidator(List<EncodingValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(EncodingHeadersKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new EncodingHeadersKeysCaseValidator(expectedCase));
+    }
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultHeaderValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultHeaderValidatorFactory.java
index 13ef15d..6a0230e 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultHeaderValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultHeaderValidatorFactory.java
@@ -17,10 +17,7 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.compliance.validator.header.HeaderDescriptionRequiredValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.HeaderValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.HeaderValidatorFactory;
@@ -28,6 +25,10 @@ import org.apache.servicecomb.toolkit.oasv.validation.factory.SchemaValidatorFac
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.header.HeaderSchemaValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultHeaderValidatorFactory implements HeaderValidatorFactory {
 
@@ -39,16 +40,23 @@ public class DefaultHeaderValidatorFactory implements HeaderValidatorFactory {
   }
 
   @Override
-  public List<HeaderValidator> create() {
+  public List<HeaderValidator> create(FactoryOptions options) {
 
     List<HeaderValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new HeaderSchemaValidator(schemaValidatorFactory.create()));
+    validators.add(new HeaderSchemaValidator(schemaValidatorFactory.create(options)));
 
     // concretes
-    validators.add(new HeaderDescriptionRequiredValidator());
-
+    addHeaderDescriptionRequiredValidator(validators, options);
     return Collections.unmodifiableList(validators);
   }
+
+  private void addHeaderDescriptionRequiredValidator(List<HeaderValidator> validators, FactoryOptions options) {
+    Boolean required = options.getBoolean(HeaderDescriptionRequiredValidator.CONFIG_KEY);
+    if (Boolean.TRUE.equals(required)) {
+      validators.add(new HeaderDescriptionRequiredValidator());
+    }
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultInfoValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultInfoValidatorFactory.java
index 2564208..19f1756 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultInfoValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultInfoValidatorFactory.java
@@ -17,26 +17,32 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.compliance.validator.info.InfoDescriptionRequiredValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.InfoValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.InfoValidatorFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultInfoValidatorFactory implements InfoValidatorFactory {
 
   @Override
-  public List<InfoValidator> create() {
-    ArrayList<InfoValidator> validators = new ArrayList<>();
+  public List<InfoValidator> create(FactoryOptions options) {
+    List<InfoValidator> validators = new ArrayList<>();
 
     // concretes
-    validators.add(new InfoDescriptionRequiredValidator());
-
+    addInfoDescriptionRequiredValidator(validators, options);
     return Collections.unmodifiableList(validators);
   }
 
+  private void addInfoDescriptionRequiredValidator(List<InfoValidator> validators, FactoryOptions options) {
+    Boolean required = options.getBoolean(InfoDescriptionRequiredValidator.CONFIG_KEY);
+    if (Boolean.TRUE.equals(required)) {
+      validators.add(new InfoDescriptionRequiredValidator());
+    }
+  }
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultMediaTypeValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultMediaTypeValidatorFactory.java
index 3a760ba..eeb0273 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultMediaTypeValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultMediaTypeValidatorFactory.java
@@ -17,10 +17,7 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.validation.api.MediaTypeValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.EncodingValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.MediaTypeValidatorFactory;
@@ -29,6 +26,10 @@ import org.apache.servicecomb.toolkit.oasv.validation.skeleton.mediatype.MediaTy
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.mediatype.MediaTypeSchemaValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultMediaTypeValidatorFactory implements MediaTypeValidatorFactory {
 
@@ -44,13 +45,13 @@ public class DefaultMediaTypeValidatorFactory implements MediaTypeValidatorFacto
   }
 
   @Override
-  public List<MediaTypeValidator> create() {
+  public List<MediaTypeValidator> create(FactoryOptions options) {
 
     List<MediaTypeValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new MediaTypeSchemaValidator(schemaValidatorFactory.create()));
-    validators.add(new MediaTypeEncodingValidator(encodingValidatorFactory.create()));
+    validators.add(new MediaTypeSchemaValidator(schemaValidatorFactory.create(options)));
+    validators.add(new MediaTypeEncodingValidator(encodingValidatorFactory.create(options)));
 
     return Collections.unmodifiableList(validators);
   }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOasSpecValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOasSpecValidatorFactory.java
index c866fc1..967f9ab 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOasSpecValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOasSpecValidatorFactory.java
@@ -17,6 +17,7 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.validation.api.DefaultOasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.OasSpecValidatorFactory;
@@ -34,8 +35,8 @@ public class DefaultOasSpecValidatorFactory implements OasSpecValidatorFactory {
   }
 
   @Override
-  public OasSpecValidator create() {
-    return new DefaultOasSpecValidator(openApiValidatorFactory.create());
+  public OasSpecValidator create(FactoryOptions options) {
+    return new DefaultOasSpecValidator(openApiValidatorFactory.create(options));
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOpenApiValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOpenApiValidatorFactory.java
index ff1a9c7..a580b42 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOpenApiValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOpenApiValidatorFactory.java
@@ -17,27 +17,19 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi.OpenApiSecuritySizeEqValidator;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi.OpenApiTagsSizeGteValidator;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi.OpenApiVersionGteValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.factory.*;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.openapi.*;
+import org.springframework.stereotype.Component;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi.OpenApiSecurityEmptyValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi.OpenApiTagNotEmptyValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi.OpenApiVersionValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.ComponentsValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.InfoValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.OpenApiValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.PathsValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.ServerValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.factory.TagValidatorFactory;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.openapi.OpenApiComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.openapi.OpenApiInfoValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.openapi.OpenApiPathsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.openapi.OpenApiServersValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.openapi.OpenApiTagsValidator;
-import org.springframework.stereotype.Component;
-
 @Component
 public class DefaultOpenApiValidatorFactory implements OpenApiValidatorFactory {
 
@@ -65,22 +57,44 @@ public class DefaultOpenApiValidatorFactory implements OpenApiValidatorFactory {
   }
 
   @Override
-  public List<OpenApiValidator> create() {
+  public List<OpenApiValidator> create(FactoryOptions options) {
 
     List<OpenApiValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new OpenApiTagsValidator(tagValidatorFactory.create()));
-    validators.add(new OpenApiInfoValidator(infoValidatorFactory.create()));
-    validators.add(new OpenApiPathsValidator(pathsValidatorFactory.create()));
-    validators.add(new OpenApiComponentsValidator(componentsValidatorFactory.create()));
-    validators.add(new OpenApiServersValidator(serverValidatorFactory.create()));
+    validators.add(new OpenApiTagsValidator(tagValidatorFactory.create(options)));
+    validators.add(new OpenApiInfoValidator(infoValidatorFactory.create(options)));
+    validators.add(new OpenApiPathsValidator(pathsValidatorFactory.create(options)));
+    validators.add(new OpenApiComponentsValidator(componentsValidatorFactory.create(options)));
+    validators.add(new OpenApiServersValidator(serverValidatorFactory.create(options)));
 
     // concretes
-    validators.add(new OpenApiSecurityEmptyValidator());
-    validators.add(new OpenApiTagNotEmptyValidator());
-    validators.add(new OpenApiVersionValidator());
+    addOpenApiSecuritySizeValidator(validators, options);
+    addOpenApiTagsSizeValidator(validators, options);
+    addOpenApiVersionGteValidator(validators, options);
 
     return Collections.unmodifiableList(validators);
   }
+
+  private void addOpenApiSecuritySizeValidator(List<OpenApiValidator> validators, FactoryOptions options) {
+    Integer size = options.getInteger(OpenApiSecuritySizeEqValidator.CONFIG_KEY);
+    if (size != null) {
+      validators.add(new OpenApiSecuritySizeEqValidator(size));
+    }
+  }
+
+  private void addOpenApiTagsSizeValidator(List<OpenApiValidator> validators, FactoryOptions options) {
+    Integer size = options.getInteger(OpenApiTagsSizeGteValidator.CONFIG_KEY);
+    if (size != null) {
+      validators.add(new OpenApiTagsSizeGteValidator(size));
+    }
+  }
+
+  private void addOpenApiVersionGteValidator(List<OpenApiValidator> validators, FactoryOptions options) {
+    String versionGte = options.getString(OpenApiVersionGteValidator.CONFIG_KEY);
+    if (versionGte != null) {
+      validators.add(new OpenApiVersionGteValidator(versionGte));
+    }
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOperationValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOperationValidatorFactory.java
index 67adf45..6b31f2a 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOperationValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOperationValidatorFactory.java
@@ -17,15 +17,8 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.operation.OperationIdLowerCamelCaseValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.operation.OperationServersEmptyValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.operation.OperationSummaryRequiredValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.operation.OperationTagsOnlyOneValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.operation.OperationTagsReferenceValidator;
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.operation.*;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.OperationValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.ParameterValidatorFactory;
@@ -36,6 +29,10 @@ import org.apache.servicecomb.toolkit.oasv.validation.skeleton.operation.Operati
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.operation.OperationResponsesValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultOperationValidatorFactory implements OperationValidatorFactory {
 
@@ -56,22 +53,57 @@ public class DefaultOperationValidatorFactory implements OperationValidatorFacto
   }
 
   @Override
-  public List<OperationValidator> create() {
+  public List<OperationValidator> create(FactoryOptions options) {
 
     List<OperationValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new OperationParametersValidator(parameterValidatorFactory.create()));
-    validators.add(new OperationResponsesValidator(responsesValidatorFactory.create()));
-    validators.add(new OperationRequestBodyValidator(requestBodyValidatorFactory.create()));
+    validators.add(new OperationParametersValidator(parameterValidatorFactory.create(options)));
+    validators.add(new OperationResponsesValidator(responsesValidatorFactory.create(options)));
+    validators.add(new OperationRequestBodyValidator(requestBodyValidatorFactory.create(options)));
 
     // concretes
-    validators.add(new OperationIdLowerCamelCaseValidator());
-    validators.add(new OperationSummaryRequiredValidator());
-    validators.add(new OperationTagsOnlyOneValidator());
-    validators.add(new OperationTagsReferenceValidator());
-    validators.add(new OperationServersEmptyValidator());
+    addOperationSummaryRequiredValidator(validators, options);
+    addOperationIdCaseValidator(validators, options);
+    addOperationTagsSizeEqValidator(validators, options);
+    addOperationServersSizeEqValidator(validators, options);
+    addOperationTagsReferenceValidator(validators, options);
 
     return Collections.unmodifiableList(validators);
   }
+
+  private void addOperationSummaryRequiredValidator(List<OperationValidator> validators, FactoryOptions options) {
+    Boolean required = options.getBoolean(OperationSummaryRequiredValidator.CONFIG_KEY);
+    if (Boolean.TRUE.equals(required)) {
+      validators.add(new OperationSummaryRequiredValidator());
+    }
+  }
+
+  private void addOperationIdCaseValidator(List<OperationValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(OperationIdCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new OperationIdCaseValidator(expectedCase));
+    }
+  }
+
+  private void addOperationTagsSizeEqValidator(List<OperationValidator> validators, FactoryOptions options) {
+    Integer expectedSize = options.getInteger(OperationTagsSizeEqValidator.CONFIG_KEY);
+    if (expectedSize != null) {
+      validators.add(new OperationTagsSizeEqValidator(expectedSize));
+    }
+  }
+
+  private void addOperationServersSizeEqValidator(List<OperationValidator> validators, FactoryOptions options) {
+    Integer expectedSize = options.getInteger(OperationServersSizeEqValidator.CONFIG_KEY);
+    if (expectedSize != null) {
+      validators.add(new OperationServersSizeEqValidator(expectedSize));
+    }
+  }
+
+  private void addOperationTagsReferenceValidator(List<OperationValidator> validators, FactoryOptions options) {
+    Boolean needCheck = options.getBoolean(OperationTagsReferenceValidator.CONFIG_KEY);
+    if (Boolean.TRUE.equals(needCheck)) {
+      validators.add(new OperationTagsReferenceValidator());
+    }
+  }
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultParameterValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultParameterValidatorFactory.java
index 0180834..1b9a90c 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultParameterValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultParameterValidatorFactory.java
@@ -17,15 +17,8 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter.ParameterCookieLowerCamelCaseValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter.ParameterDescriptionRequiredValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter.ParameterHeaderUpperHyphenCaseValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter.ParameterPathLowerCamelCaseValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter.ParameterQueryLowerCamelCaseValidator;
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter.*;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.MediaTypeValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.ParameterValidatorFactory;
@@ -34,6 +27,10 @@ import org.apache.servicecomb.toolkit.oasv.validation.skeleton.parameter.Paramet
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.parameter.ParameterSchemaValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultParameterValidatorFactory implements ParameterValidatorFactory {
 
@@ -49,21 +46,57 @@ public class DefaultParameterValidatorFactory implements ParameterValidatorFacto
   }
 
   @Override
-  public List<ParameterValidator> create() {
+  public List<ParameterValidator> create(FactoryOptions options) {
 
     List<ParameterValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new ParameterSchemaValidator(schemaValidatorFactory.create()));
-    validators.add(new ParameterContentValidator(mediaTypeValidatorFactory.create()));
+    validators.add(new ParameterSchemaValidator(schemaValidatorFactory.create(options)));
+    validators.add(new ParameterContentValidator(mediaTypeValidatorFactory.create(options)));
 
     // concretes
-    validators.add(new ParameterCookieLowerCamelCaseValidator());
-    validators.add(new ParameterHeaderUpperHyphenCaseValidator());
-    validators.add(new ParameterPathLowerCamelCaseValidator());
-    validators.add(new ParameterQueryLowerCamelCaseValidator());
-    validators.add(new ParameterDescriptionRequiredValidator());
+    addParameterNameCookieCaseValidator(validators, options);
+    addParameterNameHeaderCaseValidator(validators, options);
+    addParameterNamePathCaseValidator(validators, options);
+    addParameterNameQueryCaseValidator(validators, options);
+    addParameterDescriptionRequiredValidator(validators, options);
 
     return Collections.unmodifiableList(validators);
   }
+
+  private void addParameterNameCookieCaseValidator(List<ParameterValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ParameterNameCookieCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ParameterNameCookieCaseValidator(expectedCase));
+    }
+  }
+
+  private void addParameterNameHeaderCaseValidator(List<ParameterValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ParameterNameHeaderCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ParameterNameHeaderCaseValidator(expectedCase));
+    }
+  }
+
+  private void addParameterNamePathCaseValidator(List<ParameterValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ParameterNamePathCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ParameterNamePathCaseValidator(expectedCase));
+    }
+  }
+
+  private void addParameterNameQueryCaseValidator(List<ParameterValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ParameterNameQueryCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ParameterNameQueryCaseValidator(expectedCase));
+    }
+  }
+
+  private void addParameterDescriptionRequiredValidator(List<ParameterValidator> validators, FactoryOptions options) {
+    Boolean required = options.getBoolean(ParameterDescriptionRequiredValidator.CONFIG_KEY);
+    if (Boolean.TRUE.equals(required)) {
+      validators.add(new ParameterDescriptionRequiredValidator());
+    }
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathItemValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathItemValidatorFactory.java
index 4aa4b05..85286ea 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathItemValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathItemValidatorFactory.java
@@ -17,10 +17,7 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.validation.api.PathItemValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.OperationValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.ParameterValidatorFactory;
@@ -29,6 +26,10 @@ import org.apache.servicecomb.toolkit.oasv.validation.skeleton.pathitem.PathItem
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.pathitem.PathItemParametersValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultPathItemValidatorFactory implements PathItemValidatorFactory {
 
@@ -44,12 +45,12 @@ public class DefaultPathItemValidatorFactory implements PathItemValidatorFactory
   }
 
   @Override
-  public List<PathItemValidator> create() {
+  public List<PathItemValidator> create(FactoryOptions options) {
     ArrayList<PathItemValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new PathItemOperationsValidator(operationValidatorFactory.create()));
-    validators.add(new PathItemParametersValidator(parameterValidatorFactory.create()));
+    validators.add(new PathItemOperationsValidator(operationValidatorFactory.create(options)));
+    validators.add(new PathItemParametersValidator(parameterValidatorFactory.create(options)));
 
     return Collections.unmodifiableList(validators);
   }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathsValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathsValidatorFactory.java
index e92faf7..dd22dee 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathsValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathsValidatorFactory.java
@@ -17,17 +17,18 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.paths.PathsLowerCamelCaseValidator;
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.paths.PathsKeyCaseValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.PathsValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.PathItemValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.PathsValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.paths.PathsPathItemsValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultPathsValidatorFactory implements PathsValidatorFactory {
 
@@ -39,16 +40,22 @@ public class DefaultPathsValidatorFactory implements PathsValidatorFactory {
   }
 
   @Override
-  public List<PathsValidator> create() {
+  public List<PathsValidator> create(FactoryOptions options) {
     List<PathsValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new PathsPathItemsValidator(pathItemValidatorFactory.create()));
+    validators.add(new PathsPathItemsValidator(pathItemValidatorFactory.create(options)));
 
     // concretes
-    validators.add(new PathsLowerCamelCaseValidator());
-
+    addPathsKeyCaseValidator(validators, options);
     return Collections.unmodifiableList(validators);
   }
 
+  private void addPathsKeyCaseValidator(List<PathsValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(PathsKeyCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new PathsKeyCaseValidator(expectedCase));
+    }
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultRequestBodyValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultRequestBodyValidatorFactory.java
index 08c9f1d..d5427a5 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultRequestBodyValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultRequestBodyValidatorFactory.java
@@ -17,10 +17,7 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.compliance.validator.requestbody.RequestBodyDescriptionRequiredValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.RequestBodyValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.MediaTypeValidatorFactory;
@@ -28,6 +25,10 @@ import org.apache.servicecomb.toolkit.oasv.validation.factory.RequestBodyValidat
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.requestbody.RequestBodyContentValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultRequestBodyValidatorFactory implements RequestBodyValidatorFactory {
 
@@ -39,15 +40,24 @@ public class DefaultRequestBodyValidatorFactory implements RequestBodyValidatorF
   }
 
   @Override
-  public List<RequestBodyValidator> create() {
+  public List<RequestBodyValidator> create(FactoryOptions options) {
 
     List<RequestBodyValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new RequestBodyContentValidator(mediaTypeValidatorFactory.create()));
+    validators.add(new RequestBodyContentValidator(mediaTypeValidatorFactory.create(options)));
 
     // concretes
-    validators.add(new RequestBodyDescriptionRequiredValidator());
+    addRequestBodyDescriptionRequiredValidator(validators, options);
     return Collections.unmodifiableList(validators);
   }
+
+  private void addRequestBodyDescriptionRequiredValidator(List<RequestBodyValidator> validators,
+      FactoryOptions options) {
+    Boolean required = options.getBoolean(RequestBodyDescriptionRequiredValidator.CONFIG_KEY);
+    if (Boolean.TRUE.equals(required)) {
+      validators.add(new RequestBodyDescriptionRequiredValidator());
+    }
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponseValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponseValidatorFactory.java
index b3823b3..9333450 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponseValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponseValidatorFactory.java
@@ -17,11 +17,8 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.response.ResponseKeysValidators;
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.response.ResponseHeadersKeysCaseValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ResponseValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.HeaderValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.MediaTypeValidatorFactory;
@@ -30,6 +27,10 @@ import org.apache.servicecomb.toolkit.oasv.validation.skeleton.response.Response
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.response.ResponseHeadersValuesValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultResponseValidatorFactory implements ResponseValidatorFactory {
 
@@ -45,17 +46,24 @@ public class DefaultResponseValidatorFactory implements ResponseValidatorFactory
   }
 
   @Override
-  public List<ResponseValidator> create() {
+  public List<ResponseValidator> create(FactoryOptions options) {
 
     List<ResponseValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new ResponseContentValidator(mediaTypeValidatorFactory.create()));
-    validators.add(new ResponseHeadersValuesValidator(headerValidatorFactory.create()));
+    validators.add(new ResponseContentValidator(mediaTypeValidatorFactory.create(options)));
+    validators.add(new ResponseHeadersValuesValidator(headerValidatorFactory.create(options)));
 
     // concretes
-    validators.add(ResponseKeysValidators.HEADERS_UPPER_HYPHEN_CASE_VALIDATOR);
-
+    addResponseHeadersKeysCaseValidator(validators, options);
     return Collections.unmodifiableList(validators);
   }
+
+  private void addResponseHeadersKeysCaseValidator(List<ResponseValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(ResponseHeadersKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new ResponseHeadersKeysCaseValidator(expectedCase));
+    }
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponsesValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponsesValidatorFactory.java
index 6c55486..4056b29 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponsesValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponsesValidatorFactory.java
@@ -17,16 +17,17 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ResponsesValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.ResponseValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.ResponsesValidatorFactory;
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.responses.ResponsesResponsesValidator;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultResponsesValidatorFactory implements ResponsesValidatorFactory {
 
@@ -38,12 +39,12 @@ public class DefaultResponsesValidatorFactory implements ResponsesValidatorFacto
   }
 
   @Override
-  public List<ResponsesValidator> create() {
+  public List<ResponsesValidator> create(FactoryOptions options) {
 
     List<ResponsesValidator> validators = new ArrayList<>();
 
     // skeletons
-    validators.add(new ResponsesResponsesValidator(responseValidatorFactory.create()));
+    validators.add(new ResponsesResponsesValidator(responseValidatorFactory.create(options)));
 
     return Collections.unmodifiableList(validators);
   }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSchemaValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSchemaValidatorFactory.java
index 7e099b0..aca8c6c 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSchemaValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSchemaValidatorFactory.java
@@ -17,27 +17,42 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.schema.SchemaKeysValidators;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.schema.SchemaTitleValidator;
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.schema.SchemaPropertiesKeysCaseValidator;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.schema.SchemaTitleRequiredValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.SchemaValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.SchemaValidatorFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultSchemaValidatorFactory implements SchemaValidatorFactory {
 
   @Override
-  public List<SchemaValidator> create() {
+  public List<SchemaValidator> create(FactoryOptions options) {
     ArrayList<SchemaValidator> validators = new ArrayList<>();
 
     // concretes
-    validators.add(new SchemaTitleValidator());
-    validators.add(SchemaKeysValidators.PROPERTIES_LOWER_CAMEL_CASE_VALIDATOR);
-
+    addSchemaTitleRequiredValidator(validators, options);
+    addSchemaPropertiesKeysCaseValidator(validators, options);
     return Collections.unmodifiableList(validators);
   }
+
+  private void addSchemaTitleRequiredValidator(List<SchemaValidator> validators, FactoryOptions options) {
+    Boolean required = options.getBoolean(SchemaTitleRequiredValidator.CONFIG_KEY);
+    if (Boolean.TRUE.equals(required)) {
+      validators.add(new SchemaTitleRequiredValidator());
+    }
+  }
+
+  private void addSchemaPropertiesKeysCaseValidator(List<SchemaValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(SchemaPropertiesKeysCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new SchemaPropertiesKeysCaseValidator(expectedCase));
+    }
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSecuritySchemeValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSecuritySchemeValidatorFactory.java
index 5eec0e6..489a132 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSecuritySchemeValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSecuritySchemeValidatorFactory.java
@@ -17,18 +17,19 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.Collections;
-import java.util.List;
-
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.validation.api.SecuritySchemeValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.SecuritySchemeValidatorFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultSecuritySchemeValidatorFactory implements SecuritySchemeValidatorFactory {
 
   @Override
-  public List<SecuritySchemeValidator> create() {
+  public List<SecuritySchemeValidator> create(FactoryOptions options) {
     return Collections.emptyList();
   }
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultServerValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultServerValidatorFactory.java
index 53f075a..fcf04f2 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultServerValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultServerValidatorFactory.java
@@ -17,18 +17,19 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.Collections;
-import java.util.List;
-
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ServerValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.ServerValidatorFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultServerValidatorFactory implements ServerValidatorFactory {
 
   @Override
-  public List<ServerValidator> create() {
+  public List<ServerValidator> create(FactoryOptions options) {
     return Collections.emptyList();
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultTagValidatorFactory.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultTagValidatorFactory.java
index 2969779..9948c1a 100644
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultTagValidatorFactory.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultTagValidatorFactory.java
@@ -17,29 +17,52 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.compliance.validator.tag.TagDescriptionRequiredValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.tag.TagNameUpperCamelCaseValidator;
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.tag.TagReferenceValidator;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.tag.TagMustBeReferencedValidator;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.tag.TagNameCaseValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.TagValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.factory.TagValidatorFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 @Component
 public class DefaultTagValidatorFactory implements TagValidatorFactory {
 
   @Override
-  public List<TagValidator> create() {
-    ArrayList<TagValidator> validators = new ArrayList<>();
+  public List<TagValidator> create(FactoryOptions options) {
+    List<TagValidator> validators = new ArrayList<>();
 
     // concretes
-    validators.add(new TagDescriptionRequiredValidator());
-    validators.add(new TagNameUpperCamelCaseValidator());
-    validators.add(new TagReferenceValidator());
+    addTagDescriptionRequiredValidator(validators, options);
+    addTagMustBeReferencedValidator(validators, options);
+    addTagNameCaseValidator(validators, options);
 
     return Collections.unmodifiableList(validators);
   }
+
+  private void addTagDescriptionRequiredValidator(List<TagValidator> validators, FactoryOptions options) {
+    Boolean required = options.getBoolean(TagDescriptionRequiredValidator.CONFIG_KEY);
+    if (Boolean.TRUE.equals(required)) {
+      validators.add(new TagDescriptionRequiredValidator());
+    }
+  }
+
+  private void addTagMustBeReferencedValidator(List<TagValidator> validators, FactoryOptions options) {
+    Boolean required = options.getBoolean(TagMustBeReferencedValidator.CONFIG_KEY);
+    if (Boolean.TRUE.equals(required)) {
+      validators.add(new TagMustBeReferencedValidator());
+    }
+  }
+
+  private void addTagNameCaseValidator(List<TagValidator> validators, FactoryOptions options) {
+    String expectedCase = options.getString(TagNameCaseValidator.CONFIG_KEY);
+    if (expectedCase != null) {
+      validators.add(new TagNameCaseValidator(expectedCase));
+    }
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/ValidatorFactoryTestConfiguration.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/ValidatorFactoryComponents.java
similarity index 95%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/ValidatorFactoryTestConfiguration.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/ValidatorFactoryComponents.java
index e7b6af9..a3193d2 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/ValidatorFactoryTestConfiguration.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/ValidatorFactoryComponents.java
@@ -22,5 +22,5 @@ import org.springframework.context.annotation.Configuration;
 
 @Configuration
 @ComponentScan
-class ValidatorFactoryTestConfiguration {
+public interface ValidatorFactoryComponents {
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsCallbacksKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsCallbacksKeysCaseValidator.java
index 4bdef79..bb9011c 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsCallbacksKeysCaseValidator.java
@@ -15,34 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
-import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsCallbacksKeysValidator;
 
-import java.util.List;
-
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ * .callbacks property key case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: components.callbacks.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class ComponentsCallbacksKeysCaseValidator extends ComponentsCallbacksKeysValidator {
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
+  public static final String CONFIG_KEY = "components.callbacks.key.case";
+  public static final String ERROR = "Must be ";
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
-    }
-    return emptyList();
+  public ComponentsCallbacksKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsExamplesKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsExamplesKeysCaseValidator.java
index 4bdef79..7ede020 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsExamplesKeysCaseValidator.java
@@ -15,34 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
-import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsExamplesKeysValidator;
 
-import java.util.List;
-
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ * .examples property key case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: components.examples.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class ComponentsExamplesKeysCaseValidator extends ComponentsExamplesKeysValidator {
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
+  public static final String CONFIG_KEY = "components.examples.key.case";
+  public static final String ERROR = "Must be ";
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
-    }
-    return emptyList();
+  public ComponentsExamplesKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsHeadersKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsHeadersKeysCaseValidator.java
index 4bdef79..00e7945 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsHeadersKeysCaseValidator.java
@@ -15,34 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
-import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsHeadersKeysValidator;
 
-import java.util.List;
-
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ * .headers property key case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: components.headers.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class ComponentsHeadersKeysCaseValidator extends ComponentsHeadersKeysValidator {
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
+  public static final String CONFIG_KEY = "components.headers.key.case";
+  public static final String ERROR = "Must be ";
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
-    }
-    return emptyList();
+  public ComponentsHeadersKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsKeysValidators.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsKeysValidators.java
deleted file mode 100755
index b78cb0d..0000000
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsKeysValidators.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
-
-import org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.*;
-
-public abstract class ComponentsKeysValidators {
-
-  public static final ComponentsCallbacksKeysValidator CALLBACKS_UPPER_CAMEL_CASE_VALIDATOR = new ComponentsCallbacksKeysValidator(
-    key -> StringCaseUtils.isUpperCamelCase(key),
-    key -> ViolationMessages.UPPER_CAMEL_CASE
-  );
-  public static final ComponentsExamplesKeysValidator EXAMPLES_UPPER_CAMEL_CASE_VALIDATOR = new ComponentsExamplesKeysValidator(
-    key -> StringCaseUtils.isUpperCamelCase(key),
-    key -> ViolationMessages.UPPER_CAMEL_CASE
-  );
-  public static final ComponentsHeadersKeysValidator HEADERS_UPPER_HYPHEN_CASE_VALIDATOR = new ComponentsHeadersKeysValidator(
-    key -> StringCaseUtils.isUpperHyphenCase(key),
-    key -> ViolationMessages.UPPER_HYPHEN_CASE
-  );
-  public static final ComponentsLinksKeysValidator LINKS_UPPER_CAMEL_CASE_VALIDATOR = new ComponentsLinksKeysValidator(
-    key -> StringCaseUtils.isUpperCamelCase(key),
-    key -> ViolationMessages.UPPER_CAMEL_CASE
-  );
-  public static final ComponentsParametersKeysValidator PARAMETERS_UPPER_CAMEL_CASE_VALIDATOR = new ComponentsParametersKeysValidator(
-    key -> StringCaseUtils.isUpperCamelCase(key),
-    key -> ViolationMessages.UPPER_CAMEL_CASE
-  );
-  public static final ComponentsRequestBodiesKeysValidator REQUEST_BODIES_UPPER_CAMEL_CASE_VALIDATOR = new ComponentsRequestBodiesKeysValidator(
-    key -> StringCaseUtils.isUpperCamelCase(key),
-    key -> ViolationMessages.UPPER_CAMEL_CASE
-  );
-  public static final ComponentsResponsesKeysValidator RESPONSES_UPPER_CAMEL_CASE_VALIDATOR = new ComponentsResponsesKeysValidator(
-    key -> StringCaseUtils.isUpperCamelCase(key),
-    key -> ViolationMessages.UPPER_CAMEL_CASE
-  );
-  public static final ComponentsSchemasKeysValidator SCHEMAS_UPPER_CAMEL_CASE_VALIDATOR = new ComponentsSchemasKeysValidator(
-    key -> StringCaseUtils.isUpperCamelCase(key),
-    key -> ViolationMessages.UPPER_CAMEL_CASE
-  );
-
-}
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsLinksKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsLinksKeysCaseValidator.java
index 4bdef79..18750e2 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsLinksKeysCaseValidator.java
@@ -15,34 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
-import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsLinksKeysValidator;
 
-import java.util.List;
-
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ * .links property key case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: components.links.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class ComponentsLinksKeysCaseValidator extends ComponentsLinksKeysValidator {
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
+  public static final String CONFIG_KEY = "components.links.key.case";
+  public static final String ERROR = "Must be ";
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
-    }
-    return emptyList();
+  public ComponentsLinksKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsParametersKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsParametersKeysCaseValidator.java
index 4bdef79..15e5d53 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsParametersKeysCaseValidator.java
@@ -15,34 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
-import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsParametersKeysValidator;
 
-import java.util.List;
-
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ * .parameters property key case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: components.parameters.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class ComponentsParametersKeysCaseValidator extends ComponentsParametersKeysValidator {
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
+  public static final String CONFIG_KEY = "components.parameters.key.case";
+  public static final String ERROR = "Must be ";
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
-    }
-    return emptyList();
+  public ComponentsParametersKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsRequestBodiesKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsRequestBodiesKeysCaseValidator.java
index 4bdef79..6bf3242 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsRequestBodiesKeysCaseValidator.java
@@ -15,34 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
-import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsRequestBodiesKeysValidator;
 
-import java.util.List;
-
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ * .requestBodies property key case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: components.requestBodies.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class ComponentsRequestBodiesKeysCaseValidator extends ComponentsRequestBodiesKeysValidator {
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
+  public static final String CONFIG_KEY = "components.requestBodies.key.case";
+  public static final String ERROR = "Must be ";
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
-    }
-    return emptyList();
+  public ComponentsRequestBodiesKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsResponsesKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsResponsesKeysCaseValidator.java
index 4bdef79..0e51b3c 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsResponsesKeysCaseValidator.java
@@ -15,34 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
-import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsResponsesKeysValidator;
 
-import java.util.List;
-
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ * .responses property key case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: components.responses.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class ComponentsResponsesKeysCaseValidator extends ComponentsResponsesKeysValidator {
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
+  public static final String CONFIG_KEY = "components.responses.key.case";
+  public static final String ERROR = "Must be ";
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
-    }
-    return emptyList();
+  public ComponentsResponsesKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSchemasKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSchemasKeysCaseValidator.java
index 4bdef79..c10dff8 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSchemasKeysCaseValidator.java
@@ -15,34 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
-import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsSchemasKeysValidator;
 
-import java.util.List;
-
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ * .schemas property key case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: components.schemas.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class ComponentsSchemasKeysCaseValidator extends ComponentsSchemasKeysValidator {
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
+  public static final String CONFIG_KEY = "components.schemas.key.case";
+  public static final String ERROR = "Must be ";
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
-    }
-    return emptyList();
+  public ComponentsSchemasKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSecuritySchemesKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSecuritySchemesKeysCaseValidator.java
index 4bdef79..9f38126 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSecuritySchemesKeysCaseValidator.java
@@ -15,34 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
-import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.validation.skeleton.components.ComponentsSecuritySchemesKeysValidator;
 
-import java.util.List;
-
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ * .securitySchemes property key case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: components.securitySchemes.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class ComponentsSecuritySchemesKeysCaseValidator extends ComponentsSecuritySchemesKeysValidator {
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
+  public static final String CONFIG_KEY = "components.securitySchemes.key.case";
+  public static final String ERROR = "Must be ";
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
-    }
-    return emptyList();
+  public ComponentsSecuritySchemesKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingKeysValidators.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingHeadersKeysCaseValidator.java
similarity index 55%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingKeysValidators.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingHeadersKeysCaseValidator.java
index 62c86e0..6a9bb94 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingKeysValidators.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingHeadersKeysCaseValidator.java
@@ -17,15 +17,28 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.encoding;
 
-import org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.encoding.EncodingHeadersKeysValidator;
 
-public abstract class EncodingKeysValidators {
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
-  public static final EncodingHeadersKeysValidator HEADERS_UPPER_HYPHEN_CASE_VALIDATOR = new EncodingHeadersKeysValidator(
-    key -> StringCaseUtils.isUpperHyphenCase(key),
-    key -> ViolationMessages.UPPER_HYPHEN_CASE
-  );
+/**
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#encodingObject">Encoding Object</a>
+ * .headers property key case validator
+ * <ul>
+ *   <li>config item: encoding.headers.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
+ * </ul>
+ */
+public class EncodingHeadersKeysCaseValidator extends EncodingHeadersKeysValidator {
+
+  public static final String CONFIG_KEY = "encoding.headers.key.case";
+  public static final String ERROR = "Must be ";
+
+  public EncodingHeadersKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
+  }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/header/HeaderDescriptionRequiredValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/header/HeaderDescriptionRequiredValidator.java
index c6be660..01e1f91 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/header/HeaderDescriptionRequiredValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/header/HeaderDescriptionRequiredValidator.java
@@ -26,13 +26,17 @@ import io.swagger.v3.oas.models.headers.Header;
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#headerObject">Header Object</a>
  * .description property validator
  * <ul>
- * <li>must not be null</li>
+ *   <li>config item: header.description.required=*boolean*</li>
+ *   <li>description must not be null</li>
  * </ul>
  */
 public class HeaderDescriptionRequiredValidator
   extends ObjectPropertyRequiredValidator<Header, String>
   implements HeaderValidator {
 
+  public static final String CONFIG_KEY = "header.description.required";
+
+
   @Override
   protected String get$ref(Header oasObject) {
     return oasObject.get$ref();
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/info/InfoDescriptionRequiredValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/info/InfoDescriptionRequiredValidator.java
index fa25a60..86502f1 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/info/InfoDescriptionRequiredValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/info/InfoDescriptionRequiredValidator.java
@@ -17,22 +17,25 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.info;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.InfoValidator;
+import io.swagger.v3.oas.models.info.Info;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectType;
+import org.apache.servicecomb.toolkit.oasv.validation.api.InfoValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ObjectPropertyRequiredValidator;
-import io.swagger.v3.oas.models.info.Info;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#infoObject">Info Object</a>
- * property validator
+ * description property validator
  * <ul>
- * <li>description must not be null</li>
+ *   <li>config item: info.description.required=*boolean*</li>
+ *   <li>description must not be null</li>
  * </ul>
  */
 public class InfoDescriptionRequiredValidator
   extends ObjectPropertyRequiredValidator<Info, String>
   implements InfoValidator {
 
+  public static final String CONFIG_KEY = "info.description.required";
+
   @Override
   protected String get$ref(Info oasObject) {
     return null;
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecurityEmptyValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecuritySizeEqValidator.java
similarity index 72%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecurityEmptyValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecuritySizeEqValidator.java
index dff5d40..576c60a 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecurityEmptyValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecuritySizeEqValidator.java
@@ -17,40 +17,49 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi;
 
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import io.swagger.v3.oas.models.OpenAPI;
-import org.apache.commons.collections4.CollectionUtils;
 
 import java.util.List;
 
-import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.SECURITY_REQUIREMENT;
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.SECURITY_REQUIREMENT;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#openapi-object">OpenAPI Object</a>
  * .security property validator
  * <ul>
- * <li>This field is not allowed</li>
+ * <li>config item: openAPI.security.size.eq=expected</li>
+ * <li>size should be equals to *expected*</li>
  * </ul>
  */
-public class OpenApiSecurityEmptyValidator implements OpenApiValidator {
+public class OpenApiSecuritySizeEqValidator implements OpenApiValidator {
+
+  public static final String CONFIG_KEY = "openAPI.security.size.eq";
+  public static final String ERROR = "size must be == ";
+
+  private final int expectedSize;
+
+  public OpenApiSecuritySizeEqValidator(int expectedSize) {
+    this.expectedSize = expectedSize;
+  }
 
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location,
     OpenAPI openAPI) {
 
-    if (CollectionUtils.isEmpty(openAPI.getSecurity())) {
-      return emptyList();
-
+    int size = CollectionUtils.size(openAPI.getSecurity());
+    if (size != expectedSize) {
+      return singletonList(
+          new OasViolation(location.property("security", SECURITY_REQUIREMENT), ERROR + expectedSize));
     }
 
-    return singletonList(
-      new OasViolation(location.property("security", SECURITY_REQUIREMENT), ViolationMessages.MUST_BE_EMPTY));
+    return emptyList();
 
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagNotEmptyValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagsSizeGteValidator.java
similarity index 78%
copy from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagNotEmptyValidator.java
copy to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagsSizeGteValidator.java
index b93b9ea..3f0a9d5 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagNotEmptyValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagsSizeGteValidator.java
@@ -17,13 +17,13 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi;
 
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectType;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
-import io.swagger.v3.oas.models.OpenAPI;
-import org.apache.commons.collections4.CollectionUtils;
 
 import java.util.List;
 
@@ -33,19 +33,28 @@ import static java.util.Collections.singletonList;
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#openapi-object">OpenAPI Object</a>
  * .tags(List of <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>)
- * not empty validator
+ * size validator
  * <ul>
- *   <li>at least one</li>
+ *   <li>config item: openAPI.tags.size.gte=expected</li>
+ *   <li>size should be >= *expected*</li>
  * </ul>
  */
-public class OpenApiTagNotEmptyValidator implements OpenApiValidator {
+public class OpenApiTagsSizeGteValidator implements OpenApiValidator {
+
+  public static final String CONFIG_KEY = "openAPI.tags.size.gte";
+  public static final String ERROR = "size must be >= ";
+
+  private final int expectedSize;
+
+  public OpenApiTagsSizeGteValidator(int expectedSize) {
+    this.expectedSize = expectedSize;
+  }
 
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, OpenAPI openAPI) {
 
-    if (CollectionUtils.isEmpty(openAPI.getTags())) {
-      return singletonList(new OasViolation(location.property("tags", OasObjectType.TAG), "At least provide one tag"));
-
+    if (CollectionUtils.size(openAPI.getTags()) < expectedSize) {
+      return singletonList(new OasViolation(location.property("tags", OasObjectType.TAG), ERROR + expectedSize));
     }
     return emptyList();
 
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionGteValidator.java
similarity index 72%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionGteValidator.java
index 79e4a6a..90435c0 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionGteValidator.java
@@ -29,11 +29,21 @@ import static java.util.Collections.singletonList;
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#openapi-object">OpenAPI Object</a>
  * .openapi property validator
- * <ul>
- * <li>must be 3.0.x and >=3.0.2</li>
+ <ul>
+ *   <li>config item: openAPI.openapi.gte=expected</li>
+ *   <li>version should be >= *expected*</li>
  * </ul>
  */
-public class OpenApiVersionValidator implements OpenApiValidator {
+public class OpenApiVersionGteValidator implements OpenApiValidator {
+
+  public static final String CONFIG_KEY = "openAPI.openapi.gte";
+  public static final String ERROR = "Must be >= ";
+
+  private final String versionGte;
+
+  public OpenApiVersionGteValidator(String versionGte) {
+    this.versionGte = versionGte;
+  }
 
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, OpenAPI openAPI) {
@@ -43,11 +53,14 @@ public class OpenApiVersionValidator implements OpenApiValidator {
     }
 
     String[] semver = openAPI.getOpenapi().split("\\.");
-    boolean ok = semver[0].equals("3") && semver[1].equals("0") && Integer.parseInt(semver[2]) >= 2;
+    String[] expectedSemver = versionGte.split("\\.");
+    boolean ok = semver[0].equals(expectedSemver[0])
+        && semver[1].equals(expectedSemver[1])
+        && Integer.parseInt(semver[2]) >= Integer.valueOf(expectedSemver[2]);
     if (ok) {
       return emptyList();
     }
-    return singletonList(new OasViolation(location.property("openapi"), "Must be >= 3.0.2"));
+    return singletonList(new OasViolation(location.property("openapi"), ERROR + versionGte));
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdLowerCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdCaseValidator.java
similarity index 62%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdLowerCamelCaseValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdCaseValidator.java
index 1e25108..f682fad 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdLowerCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdCaseValidator.java
@@ -17,31 +17,43 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
 import io.swagger.v3.oas.models.Operation;
+import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
 
 import java.util.List;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject">Operation Object</a>
- * .operationId property validator
+ * .operationId case validator
  * <ul>
- * <li>should be lower camel case</li>
+ *   <li>config item: operation.operationId.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class OperationIdLowerCamelCaseValidator implements OperationValidator {
+public class OperationIdCaseValidator implements OperationValidator {
+
+  public static final String CONFIG_KEY = "operation.operationId.case";
+  public static final String ERROR = "Must be ";
+
+  private final String expectedCase;
+
+  public OperationIdCaseValidator(String expectedCase) {
+    this.expectedCase = expectedCase;
+  }
 
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location,
     Operation oasObject) {
 
-    if (!StringCaseUtils.isLowerCamelCase(oasObject.getOperationId())) {
-      return singletonList(new OasViolation(location.property("operationId"), ViolationMessages.LOWER_CAMEL_CASE));
+    if (!isMatchCase(expectedCase, oasObject.getOperationId())) {
+      return singletonList(new OasViolation(location.property("operationId"), ERROR + expectedCase));
     }
     return emptyList();
   }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersEmptyValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersSizeEqValidator.java
similarity index 72%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersEmptyValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersSizeEqValidator.java
index 1569596..c49f266 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersEmptyValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersSizeEqValidator.java
@@ -17,34 +17,46 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
 
+import io.swagger.v3.oas.models.Operation;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
-import io.swagger.v3.oas.models.Operation;
-import org.apache.commons.collections4.CollectionUtils;
 
 import java.util.List;
 
-import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.SERVER;
-import static org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages.MUST_BE_EMPTY;
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.SERVER;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject">Operation Object</a>
- * .servers property validator
+ * .servers size validator
  * <ul>
- * <li>This field is not allowed</li>
+ *   <li>config item: operations.servers.size.eq=*expected*</li>
+ *   <li>size should be equals to *expected*</li>
  * </ul>
  */
-public class OperationServersEmptyValidator implements OperationValidator {
+public class OperationServersSizeEqValidator implements OperationValidator {
+
+  public static final String CONFIG_KEY = "operations.servers.size.eq";
+  public static final String ERROR = "size must be == ";
+
+  private final int expectedSize;
+
+  public OperationServersSizeEqValidator(int expectedSize) {
+    this.expectedSize = expectedSize;
+  }
+
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location,
     Operation oasObject) {
-    if (CollectionUtils.isEmpty(oasObject.getServers())) {
-      return emptyList();
+
+    if (CollectionUtils.size(oasObject.getServers()) != expectedSize) {
+      return singletonList(new OasViolation(location.property("servers", SERVER), ERROR + expectedSize));
     }
-    return singletonList(new OasViolation(location.property("servers", SERVER), MUST_BE_EMPTY));
+    return emptyList();
   }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationSummaryRequiredValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationSummaryRequiredValidator.java
index 2b4cc97..dbc997b 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationSummaryRequiredValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationSummaryRequiredValidator.java
@@ -24,15 +24,18 @@ import io.swagger.v3.oas.models.Operation;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject">Operation Object</a>
- * .summary property validator
+ * .summary required validator
  * <ul>
- * <li>is field is required</li>
+ *   <li>config item: operation.summary.required=*boolean*</li>
+ *   <li>this field is required</li>
  * </ul>
  */
 public class OperationSummaryRequiredValidator
   extends ObjectPropertyRequiredValidator<Operation, String>
   implements OperationValidator {
 
+  public static final String CONFIG_KEY = "operation.summary.required";
+
   @Override
   protected String get$ref(Operation oasObject) {
     return null;
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsReferenceValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsReferenceValidator.java
index 88079e5..5683ca6 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsReferenceValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsReferenceValidator.java
@@ -17,14 +17,14 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
 import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.Operation;
 import io.swagger.v3.oas.models.tags.Tag;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -36,13 +36,18 @@ import static java.util.stream.Collectors.toSet;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject">Operation Object</a>
- * .tags property validator
+ * .tags must reference root tags validator
  * <ul>
- * <li>must be defined in OpenAPI Object tags property</li>
+ * <li>config item: operation.tags.element.must_reference_root_tags=*boolean*</li>
+ * <li>must reference tags defined in OpenAPI Object tags property</li>
  * </ul>
  */
 public class OperationTagsReferenceValidator implements OperationValidator {
 
+  public static final String CONFIG_KEY = "operation.tags.element.must_reference_root_tags";
+
+  public static final String ERROR = "is not defined in $.tags";
+
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location,
     Operation oasObject) {
@@ -59,7 +64,7 @@ public class OperationTagsReferenceValidator implements OperationValidator {
       String tagName = tags.get(i);
       if (!globalTagNames.contains(tagName)) {
         violations.add(
-          new OasViolation(location.property("tags[" + i + "]"), "Is not defined in $.tags"));
+          new OasViolation(location.property("tags[" + i + "]"), ERROR));
       }
     }
 
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsOnlyOneValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsSizeEqValidator.java
similarity index 74%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsOnlyOneValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsSizeEqValidator.java
index b40c85a..148bf17 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsOnlyOneValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsSizeEqValidator.java
@@ -17,12 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
 
+import io.swagger.v3.oas.models.Operation;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
-import io.swagger.v3.oas.models.Operation;
-import org.apache.commons.collections4.CollectionUtils;
 
 import java.util.List;
 
@@ -31,21 +31,30 @@ import static java.util.Collections.singletonList;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject">Operation Object</a>
- * .tags property validator
+ * .tags size validator
  * <ul>
- * <li>at least one</li>
+ *   <li>config item: operation.tags.size.eq=*expected*</li>
+ *   <li>size should be equals to *expected*</li>
  * </ul>
  */
-public class OperationTagsOnlyOneValidator implements OperationValidator {
+public class OperationTagsSizeEqValidator implements OperationValidator {
+
+  public static final String CONFIG_KEY = "operation.tags.size.eq";
+  public static final String ERROR = "size must be == ";
+
+  private final int expectedSize;
+
+  public OperationTagsSizeEqValidator(int expectedSize) {
+    this.expectedSize = expectedSize;
+  }
 
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location,
     Operation oasObject) {
 
     List<String> tags = oasObject.getTags();
-    if (CollectionUtils.size(tags) != 1) {
-      return singletonList(
-        new OasViolation(location.property("tags"), "Must provide one and at most one tag"));
+    if (CollectionUtils.size(tags) != expectedSize) {
+      return singletonList(new OasViolation(location.property("tags"), ERROR + expectedSize));
     }
     return emptyList();
   }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterDescriptionRequiredValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterDescriptionRequiredValidator.java
index 73f0d98..a76d798 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterDescriptionRequiredValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterDescriptionRequiredValidator.java
@@ -26,6 +26,7 @@ import io.swagger.v3.oas.models.parameters.Parameter;
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject">Parameter Object</a>
  * .description property validator
  * <ul>
+ * <li>config item: parameter.description.required=*boolean*</li>
  * <li>this field is required</li>
  * </ul>
  */
@@ -33,6 +34,8 @@ public class ParameterDescriptionRequiredValidator
   extends ObjectPropertyRequiredValidator<Parameter, String>
   implements ParameterValidator {
 
+  public static final String CONFIG_KEY = "parameter.description.required";
+
   @Override
   protected String get$ref(Parameter oasObject) {
     return oasObject.get$ref();
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterCookieLowerCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameCookieCaseValidator.java
similarity index 65%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterCookieLowerCamelCaseValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameCookieCaseValidator.java
index 99f4319..312b6cf 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterCookieLowerCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameCookieCaseValidator.java
@@ -17,25 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
 import io.swagger.v3.oas.models.parameters.Parameter;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
 
 import java.util.List;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject">Parameter Object</a>
- * .name property validator
+ * .name case validator for cookie
  * <ul>
- * <li>must be lower camel case</li>
+ * <li>config item: parameter.name.cookie.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ * <li>must match case</li>
  * </ul>
  */
-public class ParameterCookieLowerCamelCaseValidator implements ParameterValidator {
+public class ParameterNameCookieCaseValidator implements ParameterValidator {
+
+  public static final String CONFIG_KEY = "parameter.name.cookie.case";
+  public static final String ERROR = "Must be ";
+
+  private final String expectedCase;
+
+  public ParameterNameCookieCaseValidator(String expectedCase) {
+    this.expectedCase = expectedCase;
+  }
+
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location,
     Parameter oasObject) {
@@ -48,10 +61,9 @@ public class ParameterCookieLowerCamelCaseValidator implements ParameterValidato
       return emptyList();
     }
 
-    if (!StringCaseUtils.isLowerCamelCase(oasObject.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.LOWER_CAMEL_CASE));
+    if (!isMatchCase(expectedCase, oasObject.getName())) {
+      return singletonList(new OasViolation(location.property("name"), ERROR + expectedCase));
     }
-
     return emptyList();
   }
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterHeaderUpperHyphenCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameHeaderCaseValidator.java
similarity index 65%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterHeaderUpperHyphenCaseValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameHeaderCaseValidator.java
index e33ca04..95eb885 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterHeaderUpperHyphenCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameHeaderCaseValidator.java
@@ -17,25 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
 import io.swagger.v3.oas.models.parameters.Parameter;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
 
 import java.util.List;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject">Parameter Object</a>
- * .name property validator
+ * .name case validator for header
  * <ul>
- * <li>must be upper hyphen case</li>
+ * <li>config item: parameter.name.header.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ * <li>must match case</li>
  * </ul>
  */
-public class ParameterHeaderUpperHyphenCaseValidator implements ParameterValidator {
+public class ParameterNameHeaderCaseValidator implements ParameterValidator {
+
+  public static final String CONFIG_KEY = "parameter.name.header.case";
+  public static final String ERROR = "Must be ";
+
+  private final String expectedCase;
+
+  public ParameterNameHeaderCaseValidator(String expectedCase) {
+    this.expectedCase = expectedCase;
+  }
+
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location,
     Parameter oasObject) {
@@ -48,8 +61,8 @@ public class ParameterHeaderUpperHyphenCaseValidator implements ParameterValidat
       return emptyList();
     }
 
-    if (!StringCaseUtils.isUpperHyphenCase(oasObject.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_HYPHEN_CASE));
+    if (!isMatchCase(expectedCase, oasObject.getName())) {
+      return singletonList(new OasViolation(location.property("name"), ERROR + expectedCase));
     }
 
     return emptyList();
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterPathLowerCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNamePathCaseValidator.java
similarity index 65%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterPathLowerCamelCaseValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNamePathCaseValidator.java
index 9d97905..5a42894 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterPathLowerCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNamePathCaseValidator.java
@@ -17,25 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
 import io.swagger.v3.oas.models.parameters.Parameter;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
 
 import java.util.List;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject">Parameter Object</a>
- * .name property validator
+ * .name case validator for path
  * <ul>
- * <li>must be lower camel case</li>
+ * <li>config item: parameter.name.path.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ * <li>must match case</li>
  * </ul>
  */
-public class ParameterPathLowerCamelCaseValidator implements ParameterValidator {
+public class ParameterNamePathCaseValidator implements ParameterValidator {
+
+  public static final String CONFIG_KEY = "parameter.name.path.case";
+  public static final String ERROR = "Must be ";
+
+  private final String expectedCase;
+
+  public ParameterNamePathCaseValidator(String expectedCase) {
+    this.expectedCase = expectedCase;
+  }
+
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location,
     Parameter oasObject) {
@@ -48,8 +61,8 @@ public class ParameterPathLowerCamelCaseValidator implements ParameterValidator
       return emptyList();
     }
 
-    if (!StringCaseUtils.isLowerCamelCase(oasObject.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.LOWER_CAMEL_CASE));
+    if (!isMatchCase(expectedCase, oasObject.getName())) {
+      return singletonList(new OasViolation(location.property("name"), ERROR + expectedCase));
     }
 
     return emptyList();
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterQueryLowerCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameQueryCaseValidator.java
similarity index 65%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterQueryLowerCamelCaseValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameQueryCaseValidator.java
index 594209d..c16c409 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterQueryLowerCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameQueryCaseValidator.java
@@ -17,25 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
 import io.swagger.v3.oas.models.parameters.Parameter;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
 
 import java.util.List;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject">Parameter Object</a>
- * .name property validator
+ * .name case validator for query
  * <ul>
- * <li>must be lower camel case</li>
+ * <li>config item: parameter.name.query.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ * <li>must match case</li>
  * </ul>
  */
-public class ParameterQueryLowerCamelCaseValidator implements ParameterValidator {
+public class ParameterNameQueryCaseValidator implements ParameterValidator {
+
+  public static final String CONFIG_KEY = "parameter.name.query.case";
+  public static final String ERROR = "Must be ";
+
+  private final String expectedCase;
+
+  public ParameterNameQueryCaseValidator(String expectedCase) {
+    this.expectedCase = expectedCase;
+  }
+
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location,
     Parameter oasObject) {
@@ -48,8 +61,8 @@ public class ParameterQueryLowerCamelCaseValidator implements ParameterValidator
       return emptyList();
     }
 
-    if (!StringCaseUtils.isLowerCamelCase(oasObject.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.LOWER_CAMEL_CASE));
+    if (!isMatchCase(expectedCase, oasObject.getName())) {
+      return singletonList(new OasViolation(location.property("name"), ERROR + expectedCase));
     }
 
     return emptyList();
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsLowerCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsKeyCaseValidator.java
similarity index 82%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsLowerCamelCaseValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsKeyCaseValidator.java
index cb21bc2..c708cd6 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsLowerCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsKeyCaseValidator.java
@@ -17,14 +17,13 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.paths;
 
+import io.swagger.v3.oas.models.Paths;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectType;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.PathsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import io.swagger.v3.oas.models.Paths;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -32,23 +31,34 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isLowerCamelCase;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#pathsObject">Paths Object</a>
- * path name validator
+ * key case validator
  * <ul>
- *   <li>path name must be lower camel case</li>
+ *   <li>config item: paths.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  * <p>
  *   <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#path-templating">Path Templating</a>
- *   variable also must be lower camel case
+ *   variable must also match case
  * </p>
  */
-public class PathsLowerCamelCaseValidator implements PathsValidator {
+public class PathsKeyCaseValidator implements PathsValidator {
+
+  public static final String CONFIG_KEY = "paths.key.case";
+  public static final String ERROR = "Must be ";
 
   private static final Pattern TEMPLATE_PATTERN = Pattern.compile("^\\{(.*)\\}$");
 
+  private final String expectedCase;
+
+
+  public PathsKeyCaseValidator(String expectedCase) {
+    this.expectedCase = expectedCase;
+  }
+
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Paths oasObject) {
     List<OasViolation> violations = new ArrayList<>();
@@ -58,9 +68,8 @@ public class PathsLowerCamelCaseValidator implements PathsValidator {
     for (String path : paths) {
       if (!matchCamelCase(path)) {
         OasObjectPropertyLocation pathLoc = location.property(path, OasObjectType.PATH_ITEM);
-        violations.add(new OasViolation(pathLoc, ViolationMessages.LOWER_CAMEL_CASE));
+        violations.add(new OasViolation(pathLoc, ERROR + expectedCase));
       }
-
     }
 
     return violations;
@@ -78,7 +87,7 @@ public class PathsLowerCamelCaseValidator implements PathsValidator {
       if (isTemplate(pathSegment)) {
         matchingPart = extractTemplateVariable(pathSegment);
       }
-      if (!isLowerCamelCase(matchingPart)) {
+      if (!isMatchCase(expectedCase, matchingPart)) {
         return false;
       }
     }
@@ -86,12 +95,6 @@ public class PathsLowerCamelCaseValidator implements PathsValidator {
 
   }
 
-  /**
-   *
-   *
-   * @param pathSegment
-   * @return
-   */
   private boolean isTemplate(String pathSegment) {
     return TEMPLATE_PATTERN.matcher(pathSegment).matches();
   }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/requestbody/RequestBodyDescriptionRequiredValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/requestbody/RequestBodyDescriptionRequiredValidator.java
index d627ffd..b39ac39 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/requestbody/RequestBodyDescriptionRequiredValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/requestbody/RequestBodyDescriptionRequiredValidator.java
@@ -26,6 +26,7 @@ import io.swagger.v3.oas.models.parameters.RequestBody;
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#request-body-object">Request Object</a>
  * .description property validator
  * <ul>
+ * <li>config item: requestBody.description.required=*boolean*</li>
  * <li>this field is required</li>
  * </ul>
  */
@@ -33,6 +34,8 @@ public class RequestBodyDescriptionRequiredValidator
   extends ObjectPropertyRequiredValidator<RequestBody, String>
   implements RequestBodyValidator {
 
+  public static final String CONFIG_KEY = "requestBody.description.required";
+
   @Override
   protected String get$ref(RequestBody oasObject) {
     return oasObject.get$ref();
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/ResponseKeysValidators.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/ResponseHeadersKeysCaseValidator.java
similarity index 59%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/ResponseKeysValidators.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/ResponseHeadersKeysCaseValidator.java
index d76f961..6fdf53d 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/ResponseKeysValidators.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/ResponseHeadersKeysCaseValidator.java
@@ -19,13 +19,26 @@ package org.apache.servicecomb.toolkit.oasv.compliance.validator.response;
 
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.response.ResponseHeadersKeysValidator;
 
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperHyphenCase;
-import static org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages.UPPER_HYPHEN_CASE;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
-public class ResponseKeysValidators {
+/**
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">ApiResponse Object</a>
+ * .headers property key case validator
+ * <ul>
+ *   <li>config item: response.headers.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
+ * </ul>
+ */
+public class ResponseHeadersKeysCaseValidator extends ResponseHeadersKeysValidator {
+
+  public static final String CONFIG_KEY = "response.headers.key.case";
+  public static final String ERROR = "Must be ";
+
+  public ResponseHeadersKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
+  }
 
-  public static final ResponseHeadersKeysValidator HEADERS_UPPER_HYPHEN_CASE_VALIDATOR = new ResponseHeadersKeysValidator(
-    key -> isUpperHyphenCase(key),
-    key -> UPPER_HYPHEN_CASE
-  );
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaKeysValidators.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaPropertiesKeysCaseValidator.java
similarity index 55%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaKeysValidators.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaPropertiesKeysCaseValidator.java
index 30bda3e..4c77679 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaKeysValidators.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaPropertiesKeysCaseValidator.java
@@ -17,15 +17,29 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.schema;
 
-import org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.schema.SchemaPropertiesKeysValidator;
 
-public class SchemaKeysValidators {
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
-  public static final SchemaPropertiesKeysValidator PROPERTIES_LOWER_CAMEL_CASE_VALIDATOR = new SchemaPropertiesKeysValidator(
-    key -> StringCaseUtils.isLowerCamelCase(key),
-    key -> ViolationMessages.LOWER_CAMEL_CASE
-  );
+/**
+ * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject">Schema Object</a>
+ * .properties property key case validator
+ * <ul>
+ *   <li>config item: schema.properties.key.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
+ * </ul>
+ */
+public class SchemaPropertiesKeysCaseValidator
+    extends SchemaPropertiesKeysValidator {
+
+  public static final String CONFIG_KEY = "schema.properties.key.case";
+  public static final String ERROR = "Must be ";
+
+  public SchemaPropertiesKeysCaseValidator(String expectedCase) {
+    super(
+        key -> isMatchCase(expectedCase, key),
+        key -> ERROR + expectedCase
+    );
+  }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleRequiredValidator.java
similarity index 74%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleRequiredValidator.java
index 9ef3445..453ed2a 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleRequiredValidator.java
@@ -17,33 +17,39 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.schema;
 
+import io.swagger.v3.oas.models.media.Schema;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectProperty;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
 import org.apache.servicecomb.toolkit.oasv.validation.skeleton.schema.SchemaRecursiveValidatorTemplate;
-import io.swagger.v3.oas.models.media.Schema;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 
-import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
-import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.SCHEMA;
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
+import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.SCHEMA;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject">Schema Object</a>
- * .title property validator
+ * .title property required validator
  * <ul>
- * <li>
+ *   <li>config item: schema.title.required=*boolean*</li>
+ *   <li>
  *   if this Schema Object's parent is
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject">Schema Object</a>
- * /
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
- * , then title property is required</li>
+ *   <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject">Schema Object</a>
+ *   /
+ *   <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">Components Object</a>
+ *  , then title property is required
+ *  </li>
  * </ul>
  */
-public class SchemaTitleValidator extends SchemaRecursiveValidatorTemplate {
+public class SchemaTitleRequiredValidator extends SchemaRecursiveValidatorTemplate {
+
+  public static final String CONFIG_KEY = "schema.title.required";
 
   @Override
   protected List<OasViolation> validateCurrentSchemaObject(OasValidationContext context, Schema oasObject,
@@ -56,13 +62,12 @@ public class SchemaTitleValidator extends SchemaRecursiveValidatorTemplate {
     OasObjectProperty parentProperty = location.getParent();
 
     if (SCHEMA == parentProperty.getObjectType()
-      || COMPONENTS == parentProperty.getObjectType()
+        || COMPONENTS == parentProperty.getObjectType()
     ) {
       return check(oasObject, location);
     }
 
     return emptyList();
-
   }
 
   private List<OasViolation> check(Schema oasObject, OasObjectPropertyLocation location) {
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagDescriptionRequiredValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagDescriptionRequiredValidator.java
index 5f17613..020c197 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagDescriptionRequiredValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagDescriptionRequiredValidator.java
@@ -26,13 +26,16 @@ import io.swagger.v3.oas.models.tags.Tag;
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
  * .description property validator
  * <ul>
- * <li>this field is required</li>
+ *   <li>config item: tag.description.required=*boolean*</li>
+ *   <li>this field is required</li>
  * </ul>
  */
 public class TagDescriptionRequiredValidator
   extends ObjectPropertyRequiredValidator<Tag, String>
   implements TagValidator {
 
+  public static final String CONFIG_KEY = "tag.description.required";
+
   @Override
   protected String get$ref(Tag oasObject) {
     return null;
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagReferenceValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagMustBeReferencedValidator.java
similarity index 81%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagReferenceValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagMustBeReferencedValidator.java
index f13c8b0..0bca0fa 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagReferenceValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagMustBeReferencedValidator.java
@@ -36,14 +36,18 @@ import static java.util.Collections.emptySet;
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
  * referencing validator
  * <ul>
- * <li>
- *   Every tag object must be referenced by <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject">Operation Object</a>
- * </li>
+ *   <li>config item: tag.name.must_be_referenced=*boolean*</li>
+ *   <li>
+ *   tag object must be referenced by <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject">Operation Object</a>
+ *   </li>
  * </ul>
  */
-public class TagReferenceValidator implements TagValidator {
+public class TagMustBeReferencedValidator implements TagValidator {
 
-  private static final String CACHE_KEY = TagReferenceValidator.class.getName() + ".allOperationsTags";
+  public static final String CONFIG_KEY = "tag.name.must_be_referenced";
+  public static final String ERROR = "Must be referenced by at least one Operation object";
+
+  private static final String CACHE_KEY = TagMustBeReferencedValidator.class.getName() + ".allOperationsTags";
 
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
@@ -52,7 +56,7 @@ public class TagReferenceValidator implements TagValidator {
     List<OasViolation> violations = new ArrayList<>();
 
     if (!allOperationsTags.contains(tag.getName())) {
-      violations.add(new OasViolation(location, "Is not referenced by any Operation object"));
+      violations.add(new OasViolation(location, ERROR));
     }
 
     return violations;
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameCaseValidator.java
similarity index 66%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
rename to oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameCaseValidator.java
index 4bdef79..6eaee8a 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidator.java
+++ b/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameCaseValidator.java
@@ -17,30 +17,42 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
 
-import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.*;
 import io.swagger.v3.oas.models.tags.Tag;
+import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
+import org.apache.servicecomb.toolkit.oasv.validation.api.TagValidator;
 
 import java.util.List;
 
-import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isUpperCamelCase;
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils.isMatchCase;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>
- * .name property validator
+ * .name case validator
  * <ul>
- * <li>must be upper camel case</li>
+ *   <li>config item: tag.name.case=upper-camel-case/lower-camel-case/upper-hyphen-case</li>
+ *   <li>must match case</li>
  * </ul>
  */
-public class TagNameUpperCamelCaseValidator implements TagValidator {
+public class TagNameCaseValidator implements TagValidator {
+
+  public static final String CONFIG_KEY = "tag.name.case";
+  public static final String ERROR = "Must be ";
+
+  private final String expectedCase;
+
+  public TagNameCaseValidator(String expectedCase) {
+    this.expectedCase = expectedCase;
+  }
 
   @Override
   public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, Tag tag) {
 
-    if (!isUpperCamelCase(tag.getName())) {
-      return singletonList(new OasViolation(location.property("name"), ViolationMessages.UPPER_CAMEL_CASE));
+    if (!isMatchCase(expectedCase, tag.getName())) {
+      return singletonList(new OasViolation(location.property("name"), ERROR + expectedCase));
     }
     return emptyList();
   }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultComponentsValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultComponentsValidatorFactoryTest.java
index 53642c3..be1368d 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultComponentsValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultComponentsValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultComponentsValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultComponentsValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<ComponentsValidator> validators = validatorFactory.create();
+    List<ComponentsValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(14);
   }
   
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultEncodingValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultEncodingValidatorFactoryTest.java
index e8fa711..24fe981 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultEncodingValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultEncodingValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.EncodingValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultEncodingValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultEncodingValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<EncodingValidator> validators = validatorFactory.create();
+    List<EncodingValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(2);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultHeaderValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultHeaderValidatorFactoryTest.java
index b0448e1..92c56c3 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultHeaderValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultHeaderValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.HeaderValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultHeaderValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultHeaderValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<HeaderValidator> validators = validatorFactory.create();
+    List<HeaderValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(2);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultInfoValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultInfoValidatorFactoryTest.java
index 5b7c5b2..15c54a5 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultInfoValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultInfoValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.InfoValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultInfoValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultInfoValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<InfoValidator> validators = validatorFactory.create();
+    List<InfoValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(1);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultMediaTypeValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultMediaTypeValidatorFactoryTest.java
index 48f1e15..2badd6f 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultMediaTypeValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultMediaTypeValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.MediaTypeValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultMediaTypeValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultMediaTypeValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<MediaTypeValidator> validators = validatorFactory.create();
+    List<MediaTypeValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(2);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOasSpecValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOasSpecValidatorFactoryTest.java
index b62f869..89d822a 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOasSpecValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOasSpecValidatorFactoryTest.java
@@ -17,8 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -26,8 +24,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultOasSpecValidatorFactoryTest {
 
   @Autowired
@@ -35,7 +35,7 @@ public class DefaultOasSpecValidatorFactoryTest {
 
   @Test
   public void create() {
-    OasSpecValidator validator = validatorFactory.create();
+    OasSpecValidator validator = validatorFactory.create(null);
     assertThat(validator).isNotNull();
   }
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOpenApiValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOpenApiValidatorFactoryTest.java
index 349efd5..36da6be 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOpenApiValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOpenApiValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultOpenApiValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultOpenApiValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<OpenApiValidator> validators = validatorFactory.create();
+    List<OpenApiValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(8);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOperationValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOperationValidatorFactoryTest.java
index 2714725..1f997fa 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOperationValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultOperationValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultOperationValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultOperationValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<OperationValidator> validators = validatorFactory.create();
+    List<OperationValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(8);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultParameterValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultParameterValidatorFactoryTest.java
index e1c201a..253c392 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultParameterValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultParameterValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultParameterValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultParameterValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<ParameterValidator> validators = validatorFactory.create();
+    List<ParameterValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(7);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathItemValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathItemValidatorFactoryTest.java
index 44b53d9..02b51f3 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathItemValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathItemValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.PathItemValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultPathItemValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultPathItemValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<PathItemValidator> validators = validatorFactory.create();
+    List<PathItemValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(2);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathsValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathsValidatorFactoryTest.java
index 3969b76..fa794c8 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathsValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultPathsValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.PathsValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultPathsValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultPathsValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<PathsValidator> validators = validatorFactory.create();
+    List<PathsValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(2);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultRequestBodyValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultRequestBodyValidatorFactoryTest.java
index ad94c2c..0ed1d35 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultRequestBodyValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultRequestBodyValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.RequestBodyValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultRequestBodyValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultRequestBodyValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<RequestBodyValidator> validators = validatorFactory.create();
+    List<RequestBodyValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(2);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponseValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponseValidatorFactoryTest.java
index 910a3f4..f241516 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponseValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponseValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.ResponseValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultResponseValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultResponseValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<ResponseValidator> validators = validatorFactory.create();
+    List<ResponseValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(3);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponsesValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponsesValidatorFactoryTest.java
index 1e79ef6..22ca7a0 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponsesValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultResponsesValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.ResponsesValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultResponsesValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultResponsesValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<ResponsesValidator> validators = validatorFactory.create();
+    List<ResponsesValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(1);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSchemaValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSchemaValidatorFactoryTest.java
index fb1e754..3beb727 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSchemaValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSchemaValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.SchemaValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultSchemaValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultSchemaValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<SchemaValidator> validators = validatorFactory.create();
+    List<SchemaValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(2);
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSecuritySchemeValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSecuritySchemeValidatorFactoryTest.java
index b41409f..1588e94 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSecuritySchemeValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultSecuritySchemeValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.SecuritySchemeValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultSecuritySchemeValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultSecuritySchemeValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<SecuritySchemeValidator> validators = validatorFactory.create();
+    List<SecuritySchemeValidator> validators = validatorFactory.create(null);
     assertThat(validators).isEmpty();
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultServerValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultServerValidatorFactoryTest.java
index ec4e193..9fe9a40 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultServerValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultServerValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.ServerValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultServerValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultServerValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<ServerValidator> validators = validatorFactory.create();
+    List<ServerValidator> validators = validatorFactory.create(null);
     assertThat(validators).isEmpty();
   }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultTagValidatorFactoryTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultTagValidatorFactoryTest.java
index 2d98857..fd8dafe 100644
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultTagValidatorFactoryTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/factory/DefaultTagValidatorFactoryTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.factory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
 import org.apache.servicecomb.toolkit.oasv.validation.api.TagValidator;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ValidatorFactoryTestConfiguration.class)
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
 public class DefaultTagValidatorFactoryTest {
 
   @Autowired
@@ -37,7 +37,7 @@ public class DefaultTagValidatorFactoryTest {
 
   @Test
   public void create() {
-    List<TagValidator> validators = validatorFactory.create();
+    List<TagValidator> validators = validatorFactory.create(null);
     assertThat(validators).hasSize(3);
   }
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingKeysValidators.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/OasStyleCheckTestBase.java
similarity index 52%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingKeysValidators.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/OasStyleCheckTestBase.java
index 62c86e0..19be6bf 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingKeysValidators.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/OasStyleCheckTestBase.java
@@ -15,17 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.encoding;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator;
 
-import org.apache.servicecomb.toolkit.oasv.util.StringCaseUtils;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.skeleton.encoding.EncodingHeadersKeysValidator;
+import io.swagger.v3.parser.core.models.SwaggerParseResult;
+import io.swagger.v3.parser.util.ClasspathHelper;
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
+import org.apache.servicecomb.toolkit.oasv.compliance.ComplianceCheckParser;
+import org.apache.servicecomb.toolkit.oasv.validation.test.OasValidatorTestBaseNew;
 
-public abstract class EncodingKeysValidators {
+import java.util.Collections;
 
-  public static final EncodingHeadersKeysValidator HEADERS_UPPER_HYPHEN_CASE_VALIDATOR = new EncodingHeadersKeysValidator(
-    key -> StringCaseUtils.isUpperHyphenCase(key),
-    key -> ViolationMessages.UPPER_HYPHEN_CASE
-  );
+public class OasStyleCheckTestBase extends OasValidatorTestBaseNew {
+
+  @Override
+  protected SwaggerParseResult parseAbsolute(String classpath) {
+    String content = ClasspathHelper.loadFileFromClasspath(classpath);
+    return ComplianceCheckParser.parseYaml(content);
+  }
+
+  protected FactoryOptions singleOption(String key, String value) {
+    return new FactoryOptions(Collections.singletonMap(key, value));
+  }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsCallbacksUpperCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsCallbacksKeysCaseValidatorTest.java
similarity index 60%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsCallbacksUpperCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsCallbacksKeysCaseValidatorTest.java
index 21e5354..91b57d7 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsCallbacksUpperCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsCallbacksKeysCaseValidatorTest.java
@@ -17,56 +17,40 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
-import static org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators.CALLBACKS_UPPER_CAMEL_CASE_VALIDATOR;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ComponentsCallbacksUpperCamelCaseValidatorTest.TestConfiguration.class)
-public class ComponentsCallbacksUpperCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ComponentsCallbacksKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testUpperCamelCase() {
     OpenAPI openAPI = loadRelative("petstore-callbacks-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ComponentsCallbacksKeysCaseValidator.CONFIG_KEY, "upper-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations)
       .containsExactlyInAnyOrder(
-        createViolation(ViolationMessages.UPPER_CAMEL_CASE,
+        createViolation(ComponentsCallbacksKeysCaseValidator.ERROR + "upper-camel-case",
           "components", COMPONENTS,
           "callbacks.'onData'", null)
       );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
 
-    @Bean
-
-    public ComponentsValidator componentsValidator() {
-
-
-      return CALLBACKS_UPPER_CAMEL_CASE_VALIDATOR;
-    }
-
-  }
 
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsExamplesUpperCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsExamplesKeysCaseValidatorTest.java
similarity index 60%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsExamplesUpperCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsExamplesKeysCaseValidatorTest.java
index 8aae9e7..5190850 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsExamplesUpperCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsExamplesKeysCaseValidatorTest.java
@@ -17,56 +17,39 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
-import static org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators.EXAMPLES_UPPER_CAMEL_CASE_VALIDATOR;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ComponentsExamplesUpperCamelCaseValidatorTest.TestConfiguration.class)
-public class ComponentsExamplesUpperCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ComponentsExamplesKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testUpperCamelCase() {
     OpenAPI openAPI = loadRelative("petstore-examples-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ComponentsExamplesKeysCaseValidator.CONFIG_KEY, "upper-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations)
       .containsExactlyInAnyOrder(
-        createViolation(ViolationMessages.UPPER_CAMEL_CASE,
+        createViolation(ComponentsExamplesKeysCaseValidator.ERROR + "upper-camel-case",
           "components", COMPONENTS,
           "examples.'foo'", null)
       );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ComponentsValidator componentsValidator() {
-
-
-      return EXAMPLES_UPPER_CAMEL_CASE_VALIDATOR;
-    }
-
-  }
 
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsHeadersUpperCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsHeadersKeysCaseValidatorTest.java
similarity index 60%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsHeadersUpperCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsHeadersKeysCaseValidatorTest.java
index b8596bf..6ae2796 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsHeadersUpperCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsHeadersKeysCaseValidatorTest.java
@@ -17,56 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
-import static org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators.HEADERS_UPPER_HYPHEN_CASE_VALIDATOR;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ComponentsHeadersUpperCamelCaseValidatorTest.TestConfiguration.class)
-public class ComponentsHeadersUpperCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ComponentsHeadersKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testUpperCamelCase() {
     OpenAPI openAPI = loadRelative("petstore-headers-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ComponentsHeadersKeysCaseValidator.CONFIG_KEY, "upper-hyphen-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations)
       .containsExactlyInAnyOrder(
-        createViolation(ViolationMessages.UPPER_HYPHEN_CASE,
+        createViolation(ComponentsHeadersKeysCaseValidator.ERROR + "upper-hyphen-case",
           "components", COMPONENTS,
           "headers.'foo'", null)
       );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ComponentsValidator componentsValidator() {
-
-
-      return HEADERS_UPPER_HYPHEN_CASE_VALIDATOR;
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsLinksUpperCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsLinksKeysCaseValidatorTest.java
similarity index 60%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsLinksUpperCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsLinksKeysCaseValidatorTest.java
index b2e0a04..a39f7b9 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsLinksUpperCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsLinksKeysCaseValidatorTest.java
@@ -17,56 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
-import static org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators.LINKS_UPPER_CAMEL_CASE_VALIDATOR;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ComponentsLinksUpperCamelCaseValidatorTest.TestConfiguration.class)
-public class ComponentsLinksUpperCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ComponentsLinksKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testUpperCamelCase() {
     OpenAPI openAPI = loadRelative("petstore-links-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ComponentsLinksKeysCaseValidator.CONFIG_KEY, "upper-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations)
       .containsExactlyInAnyOrder(
-        createViolation(ViolationMessages.UPPER_CAMEL_CASE,
+        createViolation(ComponentsLinksKeysCaseValidator.ERROR + "upper-camel-case",
           "components", COMPONENTS,
           "links.'foo'", null)
       );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ComponentsValidator componentsValidator() {
-
-
-      return LINKS_UPPER_CAMEL_CASE_VALIDATOR;
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsParametersUpperCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsParametersKeysCaseValidatorTest.java
similarity index 60%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsParametersUpperCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsParametersKeysCaseValidatorTest.java
index c4044da..9db66b8 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsParametersUpperCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsParametersKeysCaseValidatorTest.java
@@ -17,56 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
-import static org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators.PARAMETERS_UPPER_CAMEL_CASE_VALIDATOR;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ComponentsParametersUpperCamelCaseValidatorTest.TestConfiguration.class)
-public class ComponentsParametersUpperCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ComponentsParametersKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testUpperCamelCase() {
     OpenAPI openAPI = loadRelative("petstore-parameters-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ComponentsParametersKeysCaseValidator.CONFIG_KEY, "upper-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations)
       .containsExactlyInAnyOrder(
-        createViolation(ViolationMessages.UPPER_CAMEL_CASE,
+        createViolation(ComponentsParametersKeysCaseValidator.ERROR + "upper-camel-case",
           "components", COMPONENTS,
           "parameters.'foo'", null)
       );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ComponentsValidator componentsValidator() {
-
-
-      return PARAMETERS_UPPER_CAMEL_CASE_VALIDATOR;
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsRequestBodiesUpperCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsRequestBodiesKeysCaseValidatorTest.java
similarity index 60%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsRequestBodiesUpperCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsRequestBodiesKeysCaseValidatorTest.java
index 7a60f71..55dbc3d 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsRequestBodiesUpperCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsRequestBodiesKeysCaseValidatorTest.java
@@ -17,56 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
-import static org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators.REQUEST_BODIES_UPPER_CAMEL_CASE_VALIDATOR;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ComponentsRequestBodiesUpperCamelCaseValidatorTest.TestConfiguration.class)
-public class ComponentsRequestBodiesUpperCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ComponentsRequestBodiesKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testUpperCamelCase() {
     OpenAPI openAPI = loadRelative("petstore-request-bodies-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ComponentsRequestBodiesKeysCaseValidator.CONFIG_KEY, "upper-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations)
       .containsExactlyInAnyOrder(
-        createViolation(ViolationMessages.UPPER_CAMEL_CASE,
+          createViolation(ComponentsRequestBodiesKeysCaseValidator.ERROR + "upper-camel-case",
           "components", COMPONENTS,
           "requestBodies.'foo'", null)
       );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ComponentsValidator componentsValidator() {
-
-
-      return REQUEST_BODIES_UPPER_CAMEL_CASE_VALIDATOR;
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsResponsesUpperCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsResponsesKeysCaseValidatorTest.java
similarity index 60%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsResponsesUpperCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsResponsesKeysCaseValidatorTest.java
index a556201..5c68464 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsResponsesUpperCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsResponsesKeysCaseValidatorTest.java
@@ -17,56 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
-import static org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators.RESPONSES_UPPER_CAMEL_CASE_VALIDATOR;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ComponentsResponsesUpperCamelCaseValidatorTest.TestConfiguration.class)
-public class ComponentsResponsesUpperCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ComponentsResponsesKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testUpperCamelCase() {
     OpenAPI openAPI = loadRelative("petstore-responses-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ComponentsResponsesKeysCaseValidator.CONFIG_KEY, "upper-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations)
       .containsExactlyInAnyOrder(
-        createViolation(ViolationMessages.UPPER_CAMEL_CASE,
+        createViolation(ComponentsResponsesKeysCaseValidator.ERROR + "upper-camel-case",
           "components", COMPONENTS,
           "responses.'foo'", null)
       );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ComponentsValidator componentsValidator() {
-
-
-      return RESPONSES_UPPER_CAMEL_CASE_VALIDATOR;
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSchemasUpperCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSchemasKeysCaseValidatorTest.java
similarity index 60%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSchemasUpperCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSchemasKeysCaseValidatorTest.java
index 43194e2..2357556 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSchemasUpperCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSchemasKeysCaseValidatorTest.java
@@ -17,56 +17,38 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.ComponentsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
-import static org.apache.servicecomb.toolkit.oasv.compliance.validator.components.ComponentsKeysValidators.SCHEMAS_UPPER_CAMEL_CASE_VALIDATOR;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ComponentsSchemasUpperCamelCaseValidatorTest.TestConfiguration.class)
-public class ComponentsSchemasUpperCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ComponentsSchemasKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testUpperCamelCase() {
     OpenAPI openAPI = loadRelative("petstore-schemas-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ComponentsSchemasKeysCaseValidator.CONFIG_KEY, "upper-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations)
       .containsExactlyInAnyOrder(
-        createViolation(ViolationMessages.UPPER_CAMEL_CASE,
+        createViolation(ComponentsSchemasKeysCaseValidator.ERROR + "upper-camel-case",
           "components", COMPONENTS,
           "schemas.'foo'", null)
       );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ComponentsValidator componentsValidator() {
-
-
-      return SCHEMAS_UPPER_CAMEL_CASE_VALIDATOR;
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagReferenceValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSecuritySchemesKeysCaseValidatorTest.java
old mode 100755
new mode 100644
similarity index 58%
copy from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagReferenceValidatorTest.java
copy to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSecuritySchemesKeysCaseValidatorTest.java
index 53a975a..2da7afa
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagReferenceValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/ComponentsSecuritySchemesKeysCaseValidatorTest.java
@@ -15,48 +15,39 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.components;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.TagValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
-import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.TAG;
+import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENTS;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = TagReferenceValidatorTest.TestConfiguration.class)
-public class TagReferenceValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ComponentsSecuritySchemesKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
-  public void testValidate() {
-    OpenAPI openAPI = loadRelative("petstore-tag-redundant.yaml");
+  public void testUpperCamelCase() {
+    OpenAPI openAPI = loadRelative("petstore-security-schemes-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ComponentsSecuritySchemesKeysCaseValidator.CONFIG_KEY, "upper-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
-    assertThat(violations).hasSize(1);
     assertThat(violations)
-      .containsExactly(createViolation("Is not referenced by any Operation object", "tags[1]", TAG));
-  }
-
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-    @Bean
-
-    public TagValidator tagReferenceValidator() {
-      return new TagReferenceValidator();
-    }
+        .containsExactlyInAnyOrder(
+            createViolation(ComponentsSecuritySchemesKeysCaseValidator.ERROR + "upper-camel-case",
+                "components", COMPONENTS,
+                "securitySchemes.'foo'", null)
+        );
   }
 
 }
-
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingHeadersKeysCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingHeadersKeysCaseValidatorTest.java
new file mode 100644
index 0000000..3d63bfe
--- /dev/null
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/EncodingHeadersKeysCaseValidatorTest.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.encoding;
+
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
+import org.junit.Test;
+import org.springframework.test.context.ContextConfiguration;
+
+import java.util.List;
+
+import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class EncodingHeadersKeysCaseValidatorTest extends OasStyleCheckTestBase {
+
+  @Test
+  public void testValidate1() {
+    OpenAPI openAPI = loadRelative("petstore-encoding-headers-key-case-1.yaml");
+    OasSpecValidator oasSpecValidator = oasSpecValidator();
+
+    List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
+    assertThat(violations).containsExactlyInAnyOrder(
+        createViolation(
+            EncodingHeadersKeysCaseValidator.ERROR + "upper-hyphen-case",
+            "paths", PATHS,
+            "/pets", PATH_ITEM,
+            "post", OPERATION,
+            "requestBody", REQUEST_BODY,
+            "content.'application/json'", MEDIA_TYPE,
+            "encoding.'foo'", ENCODING,
+            "headers.'foo-bar'", null
+        )
+    );
+  }
+
+  @Test
+  public void testValidate2() {
+    OpenAPI openAPI = loadRelative("petstore-encoding-headers-key-case-2.yaml");
+    OasSpecValidator oasSpecValidator = oasSpecValidator();
+
+    List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
+    assertThat(violations).containsExactlyInAnyOrder(
+        createViolation(
+            EncodingHeadersKeysCaseValidator.ERROR + "upper-hyphen-case",
+            "paths", PATHS,
+            "/pets", PATH_ITEM,
+            "post", OPERATION,
+            "responses", RESPONSES,
+            "default", RESPONSE,
+            "content.'application/json'", MEDIA_TYPE,
+            "encoding.'foo'", ENCODING,
+            "headers.'foo-bar'", null
+        )
+    );
+  }
+
+  @Test
+  public void testValidate3() {
+    OpenAPI openAPI = loadRelative("petstore-encoding-headers-key-case-3.yaml");
+    OasSpecValidator oasSpecValidator = oasSpecValidator();
+
+    List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
+    assertThat(violations).containsExactlyInAnyOrder(
+        createViolation(
+            EncodingHeadersKeysCaseValidator.ERROR + "upper-hyphen-case",
+            "components", COMPONENTS,
+            "requestBodies.'foo'", REQUEST_BODY,
+            "content.'application/json'", MEDIA_TYPE,
+            "encoding.'foo'", ENCODING,
+            "headers.'foo-bar'", null
+        )
+    );
+  }
+
+  @Test
+  public void testValidate4() {
+    OpenAPI openAPI = loadRelative("petstore-encoding-headers-key-case-4.yaml");
+    OasSpecValidator oasSpecValidator = oasSpecValidator();
+
+    List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
+    assertThat(violations).containsExactlyInAnyOrder(
+        createViolation(
+            EncodingHeadersKeysCaseValidator.ERROR + "upper-hyphen-case",
+            "components", COMPONENTS,
+            "responses.'foo'", RESPONSE,
+            "content.'application/json'", MEDIA_TYPE,
+            "encoding.'foo'", ENCODING,
+            "headers.'foo-bar'", null
+        )
+    );
+  }
+
+  private OasSpecValidator oasSpecValidator() {
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(EncodingHeadersKeysCaseValidator.CONFIG_KEY, "upper-hyphen-case")
+        );
+    return oasSpecValidator;
+  }
+}
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/header/HeaderDescriptionRequiredValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/header/HeaderDescriptionRequiredValidatorTest.java
index a527bb9..26cdd05 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/header/HeaderDescriptionRequiredValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/header/HeaderDescriptionRequiredValidatorTest.java
@@ -17,16 +17,13 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.header;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.HeaderValidator;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-import io.swagger.v3.oas.models.OpenAPI;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,12 +31,17 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = HeaderDescriptionRequiredValidatorTest.TestConfiguration.class)
-public class HeaderDescriptionRequiredValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class HeaderDescriptionRequiredValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-header-no-desc.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(HeaderDescriptionRequiredValidator.CONFIG_KEY, "true")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations)
       .containsExactlyInAnyOrder(
@@ -65,18 +67,5 @@ public class HeaderDescriptionRequiredValidatorTest extends OasComplianceTestBas
       );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public HeaderValidator headerValidator() {
-      return new HeaderDescriptionRequiredValidator();
-    }
-
-  }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/info/InfoDescriptionRequiredValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/info/InfoDescriptionRequiredValidatorTest.java
index d374676..42cb962 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/info/InfoDescriptionRequiredValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/info/InfoDescriptionRequiredValidatorTest.java
@@ -17,16 +17,13 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.info;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.InfoValidator;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-import io.swagger.v3.oas.models.OpenAPI;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,30 +31,20 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.INFO;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = InfoDescriptionRequiredValidatorTest.TestConfiguration.class)
-public class InfoDescriptionRequiredValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class InfoDescriptionRequiredValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-info-no-desc.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(InfoDescriptionRequiredValidator.CONFIG_KEY, "true")
+        );
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).hasSize(1);
     assertThat(violations).containsExactly(createViolation(ViolationMessages.REQUIRED, "info", INFO, "description", null));
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public InfoValidator infoValidator() {
-      return new InfoDescriptionRequiredValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecurityEmptyValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecuritySizeEqValidatorTest.java
similarity index 64%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecurityEmptyValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecuritySizeEqValidatorTest.java
index e86c9ea..ef82ab8 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecurityEmptyValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiSecuritySizeEqValidatorTest.java
@@ -17,51 +17,44 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.SECURITY_REQUIREMENT;
-import static org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages.MUST_BE_EMPTY;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = OpenApiSecurityEmptyValidatorTest.TestConfiguration.class)
-public class OpenApiSecurityEmptyValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class OpenApiSecuritySizeEqValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-security-empty.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(OpenApiSecuritySizeEqValidator.CONFIG_KEY, "0")
+        );
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
-    assertThat(violations).containsExactly(createViolation(MUST_BE_EMPTY, "security", SECURITY_REQUIREMENT));
+    assertThat(violations)
+        .containsExactly(
+            createViolation(OpenApiSecuritySizeEqValidator.ERROR + "0", "security", SECURITY_REQUIREMENT));
   }
 
   @Test
   public void testValidateGood() {
     OpenAPI openAPI = loadRelative("petstore-security-empty-good.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(OpenApiSecuritySizeEqValidator.CONFIG_KEY, "0")
+        );
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).isEmpty();
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-    @Bean
-
-    public OpenApiValidator openApiValidator() {
-
-      return new OpenApiSecurityEmptyValidator();
-    }
-  }
-
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagsSizeValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagsSizeGteValidatorTest.java
similarity index 64%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagsSizeValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagsSizeGteValidatorTest.java
index 6e552bf..5650f56 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagsSizeValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagsSizeGteValidatorTest.java
@@ -17,15 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -33,28 +30,20 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = OpenApiTagsSizeValidatorTest.TestConfiguration.class)
-public class OpenApiTagsSizeValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class OpenApiTagsSizeGteValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-tag-not-provided.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(OpenApiTagsSizeGteValidator.CONFIG_KEY, "1")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).hasSize(1);
-    assertThat(violations).containsExactly(createViolation("At least provide one tag", "tags", TAG));
-  }
-
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-    @Bean
-
-    public OpenApiValidator openApiValidator() {
-
-      return new OpenApiTagNotEmptyValidator();
-    }
+    assertThat(violations).containsExactly(createViolation(OpenApiTagsSizeGteValidator.ERROR + "1", "tags", TAG));
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionGteValidatorTest.java
similarity index 63%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionGteValidatorTest.java
index 02d2b93..ebc5b8c 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiVersionGteValidatorTest.java
@@ -17,44 +17,32 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = OpenApiVersionValidatorTest.TestConfiguration.class)
-public class OpenApiVersionValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class OpenApiVersionGteValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-openapi-wrong.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(OpenApiVersionGteValidator.CONFIG_KEY, "3.0.2")
+        );
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).hasSize(1);
-    assertThat(violations).containsExactly(createViolation("Must be >= 3.0.2", "openapi", null));
-  }
-
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public OpenApiValidator openApiValidator() {
-
-      return new OpenApiVersionValidator();
-    }
+    assertThat(violations)
+        .containsExactly(createViolation(OpenApiVersionGteValidator.ERROR + "3.0.2", "openapi", null));
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdLowerCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdCaseValidatorTest.java
similarity index 64%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdLowerCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdCaseValidatorTest.java
index 3c9b160..06553b0 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdLowerCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationIdCaseValidatorTest.java
@@ -17,16 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,34 +30,25 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = OperationIdLowerCamelCaseValidatorTest.TestConfiguration.class)
-public class OperationIdLowerCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class OperationIdCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-operation-id-lower-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(OperationIdCaseValidator.CONFIG_KEY, "lower-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactly(
-      createViolation(ViolationMessages.LOWER_CAMEL_CASE,
+      createViolation(OperationIdCaseValidator.ERROR + "lower-camel-case",
         "paths", PATHS,
         "/pets", PATH_ITEM,
         "get", OPERATION,
         "operationId", null));
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public OperationValidator operationValidator() {
-      return new OperationIdLowerCamelCaseValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersEmptyValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersSizeEqValidatorTest.java
similarity index 64%
copy from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersEmptyValidatorTest.java
copy to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersSizeEqValidatorTest.java
index c28a005..a489aa3 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersEmptyValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersSizeEqValidatorTest.java
@@ -17,51 +17,39 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
-import static org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages.MUST_BE_EMPTY;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = OperationServersEmptyValidatorTest.TestConfiguration.class)
-public class OperationServersEmptyValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class OperationServersSizeEqValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-operation-servers-empty.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(OperationServersSizeEqValidator.CONFIG_KEY, "0")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactly(
-      createViolation(MUST_BE_EMPTY,
+        createViolation(OperationServersSizeEqValidator.ERROR + "0",
         "paths", PATHS,
         "/pets", PATH_ITEM,
         "get", OPERATION,
         "servers", SERVER));
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public OperationValidator operationValidator() {
-      return new OperationServersEmptyValidator();
-    }
-
-  }
 
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationSummaryRequiredValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationSummaryRequiredValidatorTest.java
index c3b9266..a2e2cd6 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationSummaryRequiredValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationSummaryRequiredValidatorTest.java
@@ -17,16 +17,13 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-import io.swagger.v3.oas.models.OpenAPI;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,12 +31,17 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = OperationSummaryRequiredValidatorTest.TestConfiguration.class)
-public class OperationSummaryRequiredValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class OperationSummaryRequiredValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-operation-summary-required.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(OperationSummaryRequiredValidator.CONFIG_KEY, "true")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactly(
       createViolation(ViolationMessages.REQUIRED,
@@ -49,19 +51,5 @@ public class OperationSummaryRequiredValidatorTest extends OasComplianceTestBase
         "summary", null));
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public OperationValidator operationValidator() {
-      return new OperationSummaryRequiredValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsReferenceValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsReferenceValidatorTest.java
index 1032d50..0cfb9db 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsReferenceValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsReferenceValidatorTest.java
@@ -17,15 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -33,34 +30,25 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = OperationTagsReferenceValidatorTest.TestConfiguration.class)
-public class OperationTagsReferenceValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class OperationTagsReferenceValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-operation-tags-reference.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(OperationTagsReferenceValidator.CONFIG_KEY, "true")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactly(
-      createViolation("Is not defined in $.tags",
+        createViolation(OperationTagsReferenceValidator.ERROR,
         "paths", PATHS,
         "/pets", PATH_ITEM,
         "get", OPERATION,
         "tags[0]", null));
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public OperationValidator operationValidator() {
-      return new OperationTagsReferenceValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsOnlyOneValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsSizeEqValidatorTest.java
similarity index 66%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsOnlyOneValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsSizeEqValidatorTest.java
index 75d75b4..6716558 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsOnlyOneValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationTagsSizeEqValidatorTest.java
@@ -17,15 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -33,34 +30,25 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = OperationTagsOnlyOneValidatorTest.TestConfiguration.class)
-public class OperationTagsOnlyOneValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class OperationTagsSizeEqValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-operation-tags-only-one.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(OperationTagsSizeEqValidator.CONFIG_KEY, "1")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactly(
-      createViolation("Must provide one and at most one tag",
+        createViolation(OperationTagsSizeEqValidator.ERROR + "1",
         "paths", PATHS,
         "/pets", PATH_ITEM,
         "get", OPERATION,
         "tags", null));
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public OperationValidator operationValidator() {
-      return new OperationTagsOnlyOneValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterDescriptionRequiredValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterDescriptionRequiredValidatorTest.java
index 29ad2a8..af650ed 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterDescriptionRequiredValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterDescriptionRequiredValidatorTest.java
@@ -17,16 +17,13 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-import io.swagger.v3.oas.models.OpenAPI;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,12 +31,17 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ParameterDescriptionRequiredValidatorTest.TestConfiguration.class)
-public class ParameterDescriptionRequiredValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ParameterDescriptionRequiredValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-parameter-desc-none.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ParameterDescriptionRequiredValidator.CONFIG_KEY, "true")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
@@ -59,18 +61,5 @@ public class ParameterDescriptionRequiredValidatorTest extends OasComplianceTest
     );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-    public ParameterValidator parameterValidator() {
-      return new ParameterDescriptionRequiredValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterCookieLowerCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameCookieCaseValidatorTest.java
similarity index 66%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterCookieLowerCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameCookieCaseValidatorTest.java
index 7d87862..b6b9c0a 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterCookieLowerCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameCookieCaseValidatorTest.java
@@ -17,16 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,16 +30,21 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ParameterCookieLowerCamelCaseValidatorTest.TestConfiguration.class)
-public class ParameterCookieLowerCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ParameterNameCookieCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-parameter-cookie-lower-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ParameterNameCookieCaseValidator.CONFIG_KEY, "lower-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        ParameterNameCookieCaseValidator.ERROR + "lower-camel-case",
         "paths", PATHS,
         "/pets/{petId}", PATH_ITEM,
         "get", OPERATION,
@@ -51,7 +52,7 @@ public class ParameterCookieLowerCamelCaseValidatorTest extends OasComplianceTes
         "name", null
       ),
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        ParameterNameCookieCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "parameters.'Bar'", PARAMETER,
         "name", null
@@ -59,19 +60,5 @@ public class ParameterCookieLowerCamelCaseValidatorTest extends OasComplianceTes
     );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ParameterValidator parameterValidator() {
-      return new ParameterCookieLowerCamelCaseValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterHeaderUpperHyphenCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameHeaderCaseValidatorTest.java
similarity index 65%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterHeaderUpperHyphenCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameHeaderCaseValidatorTest.java
index 90d97a3..19077e9 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterHeaderUpperHyphenCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameHeaderCaseValidatorTest.java
@@ -17,16 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,16 +30,21 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ParameterHeaderUpperHyphenCaseValidatorTest.TestConfiguration.class)
-public class ParameterHeaderUpperHyphenCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ParameterNameHeaderCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-parameter-header-upper-hyphen-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ParameterNameHeaderCaseValidator.CONFIG_KEY, "upper-hyphen-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.UPPER_HYPHEN_CASE,
+        ParameterNameHeaderCaseValidator.ERROR + "upper-hyphen-case",
         "paths", PATHS,
         "/pets/{petId}", PATH_ITEM,
         "get", OPERATION,
@@ -51,7 +52,7 @@ public class ParameterHeaderUpperHyphenCaseValidatorTest extends OasComplianceTe
         "name", null
       ),
       createViolation(
-        ViolationMessages.UPPER_HYPHEN_CASE,
+        ParameterNameHeaderCaseValidator.ERROR + "upper-hyphen-case",
         "components", COMPONENTS,
         "parameters.'Bar'", PARAMETER,
         "name", null
@@ -59,19 +60,5 @@ public class ParameterHeaderUpperHyphenCaseValidatorTest extends OasComplianceTe
     );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ParameterValidator parameterValidator() {
-      return new ParameterHeaderUpperHyphenCaseValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterPathLowerCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNamePathCaseValidatorTest.java
similarity index 66%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterPathLowerCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNamePathCaseValidatorTest.java
index 0f6fe35..0e3af92 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterPathLowerCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNamePathCaseValidatorTest.java
@@ -17,16 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,16 +30,21 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ParameterPathLowerCamelCaseValidatorTest.TestConfiguration.class)
-public class ParameterPathLowerCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ParameterNamePathCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-parameter-path-lower-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ParameterNamePathCaseValidator.CONFIG_KEY, "lower-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        ParameterNamePathCaseValidator.ERROR + "lower-camel-case",
         "paths", PATHS,
         "/pets/{PetId}", PATH_ITEM,
         "get", OPERATION,
@@ -51,7 +52,7 @@ public class ParameterPathLowerCamelCaseValidatorTest extends OasComplianceTestB
         "name", null
       ),
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        ParameterNamePathCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "parameters.'Bar'", PARAMETER,
         "name", null
@@ -59,19 +60,5 @@ public class ParameterPathLowerCamelCaseValidatorTest extends OasComplianceTestB
     );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ParameterValidator parameterValidator() {
-      return new ParameterPathLowerCamelCaseValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterQueryLowerCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameQueryCaseValidatorTest.java
similarity index 66%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterQueryLowerCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameQueryCaseValidatorTest.java
index 062f351..e81f4a2 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterQueryLowerCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/parameter/ParameterNameQueryCaseValidatorTest.java
@@ -17,16 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.parameter;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ParameterValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,16 +30,21 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = ParameterQueryLowerCamelCaseValidatorTest.TestConfiguration.class)
-public class ParameterQueryLowerCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ParameterNameQueryCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-parameter-query-lower-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ParameterNameQueryCaseValidator.CONFIG_KEY, "lower-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        ParameterNameQueryCaseValidator.ERROR + "lower-camel-case",
         "paths", PATHS,
         "/pets/{petId}", PATH_ITEM,
         "get", OPERATION,
@@ -51,7 +52,7 @@ public class ParameterQueryLowerCamelCaseValidatorTest extends OasComplianceTest
         "name", null
       ),
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        ParameterNameQueryCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "parameters.'Bar'", PARAMETER,
         "name", null
@@ -59,19 +60,5 @@ public class ParameterQueryLowerCamelCaseValidatorTest extends OasComplianceTest
     );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public ParameterValidator parameterValidator() {
-      return new ParameterQueryLowerCamelCaseValidator();
-    }
-
-  }
-
 }
 
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsLowerCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsKeyCaseValidatorTest.java
similarity index 66%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsLowerCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsKeyCaseValidatorTest.java
index d18c470..2165d54 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsLowerCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/paths/PathsKeyCaseValidatorTest.java
@@ -17,18 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.paths;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.PathsValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -37,40 +31,32 @@ import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.PATHS;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.PATH_ITEM;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = PathsLowerCamelCaseValidatorTest.TestConfiguration.class)
-public class PathsLowerCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class PathsKeyCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-paths-lower-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(PathsKeyCaseValidator.CONFIG_KEY, "lower-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        PathsKeyCaseValidator.ERROR + "lower-camel-case",
         "paths", PATHS,
         "/pets/{PetId}", PATH_ITEM
       ),
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        PathsKeyCaseValidator.ERROR + "lower-camel-case",
         "paths", PATHS,
         "/Pets", PATH_ITEM
       )
     );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
 
-    @Bean
-
-    public PathsValidator pathsValidator() {
-
-      return new PathsLowerCamelCaseValidator();
-    }
-
-  }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/requestbody/RequestBodyDescriptionRequiredValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/requestbody/RequestBodyDescriptionRequiredValidatorTest.java
index d220ce9..52845a2 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/requestbody/RequestBodyDescriptionRequiredValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/requestbody/RequestBodyDescriptionRequiredValidatorTest.java
@@ -17,16 +17,13 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.requestbody;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.RequestBodyValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-import io.swagger.v3.oas.models.OpenAPI;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,12 +31,17 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = RequestBodyDescriptionRequiredValidatorTest.TestConfiguration.class)
-public class RequestBodyDescriptionRequiredValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class RequestBodyDescriptionRequiredValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-request-body-desc-required.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(RequestBodyDescriptionRequiredValidator.CONFIG_KEY, "true")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
@@ -59,19 +61,4 @@ public class RequestBodyDescriptionRequiredValidatorTest extends OasComplianceTe
     );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public RequestBodyValidator requestBodyValidator() {
-
-      return new RequestBodyDescriptionRequiredValidator();
-    }
-
-  }
-
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersEmptyValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/ResponseHeadersKeysCaseValidatorTest.java
old mode 100755
new mode 100644
similarity index 54%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersEmptyValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/ResponseHeadersKeysCaseValidatorTest.java
index c28a005..2e02c44
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/operation/OperationServersEmptyValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/ResponseHeadersKeysCaseValidatorTest.java
@@ -15,54 +15,50 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.operation;
+package org.apache.servicecomb.toolkit.oasv.compliance.validator.response;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OperationValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
-import static org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages.MUST_BE_EMPTY;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = OperationServersEmptyValidatorTest.TestConfiguration.class)
-public class OperationServersEmptyValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class ResponseHeadersKeysCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
-    OpenAPI openAPI = loadRelative("petstore-operation-servers-empty.yaml");
-    List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
-    assertThat(violations).containsExactly(
-      createViolation(MUST_BE_EMPTY,
-        "paths", PATHS,
-        "/pets", PATH_ITEM,
-        "get", OPERATION,
-        "servers", SERVER));
-  }
-
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public OperationValidator operationValidator() {
-      return new OperationServersEmptyValidator();
-    }
+    OpenAPI openAPI = loadRelative("petstore-response-headers-key-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(ResponseHeadersKeysCaseValidator.CONFIG_KEY, "upper-hyphen-case")
+        );
 
+    List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
+    assertThat(violations).containsExactlyInAnyOrder(
+        createViolation(
+            ResponseHeadersKeysCaseValidator.ERROR + "upper-hyphen-case",
+            "paths", PATHS,
+            "/pets", PATH_ITEM,
+            "post", OPERATION,
+            "responses", RESPONSES,
+            "default", RESPONSE,
+            "headers.'foo-bar'", null
+        ),
+        createViolation(
+            ResponseHeadersKeysCaseValidator.ERROR + "upper-hyphen-case",
+            "components", COMPONENTS,
+            "responses.'foo'", RESPONSE,
+            "headers.'foo-bar'", null
+        )
+    );
   }
 
 }
-
-
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaPropertiesKeysLowerCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaPropertiesKeysCaseValidatorTest.java
similarity index 75%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaPropertiesKeysLowerCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaPropertiesKeysCaseValidatorTest.java
index 9683586..248613f 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaPropertiesKeysLowerCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaPropertiesKeysCaseValidatorTest.java
@@ -17,34 +17,31 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.schema;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.SchemaValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
 
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.*;
-import static org.apache.servicecomb.toolkit.oasv.compliance.validator.schema.SchemaKeysValidators.PROPERTIES_LOWER_CAMEL_CASE_VALIDATOR;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = SchemaPropertiesKeysLowerCamelCaseValidatorTest.TestConfiguration.class)
-public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class SchemaPropertiesKeysCaseValidatorTest extends OasStyleCheckTestBase {
+
 
   @Test
   public void testValidateParameter1() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-param-1.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "paths", PATHS,
         "/pets", PATH_ITEM,
         "get", OPERATION,
@@ -58,10 +55,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testValidateParameter2() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-param-2.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "parameters.'Foo'", PARAMETER,
         "schema", SCHEMA,
@@ -73,10 +71,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testResponse1() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-resp-1.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "paths", PATHS,
         "/pets", PATH_ITEM,
         "get", OPERATION,
@@ -92,10 +91,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testResponse2() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-resp-2.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "responses.'Foo'", RESPONSE,
         "content.'application/json'", MEDIA_TYPE,
@@ -108,10 +108,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testRequestBody1() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-req-1.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "paths", PATHS,
         "/pets", PATH_ITEM,
         "post", OPERATION,
@@ -126,10 +127,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testRequestBody2() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-req-2.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "requestBodies.'Foo'", REQUEST_BODY,
         "content.'application/json'", MEDIA_TYPE,
@@ -142,10 +144,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testComponent() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-comp.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "schemas.'Foo'", SCHEMA,
         "properties.'Foo'", null
@@ -156,16 +159,17 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testNested() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-nested.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "schemas.'Foo'", SCHEMA,
         "properties.'Foo'", null
       ),
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "schemas.'Foo'", SCHEMA,
         "properties.'Foo'", SCHEMA,
@@ -177,10 +181,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testAllOf() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-all-of.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "schemas.'Foo'", SCHEMA,
         "allOf[0]", SCHEMA,
@@ -192,10 +197,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testAnyOf() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-any-of.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "schemas.'Foo'", SCHEMA,
         "anyOf[0]", SCHEMA,
@@ -207,10 +213,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testOneOf() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-one-of.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "schemas.'Foo'", SCHEMA,
         "oneOf[0]", SCHEMA,
@@ -222,10 +229,11 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
   @Test
   public void testArray() {
     OpenAPI openAPI = loadRelative("petstore-schema-p-keys-lower-camel-case-array.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
-        ViolationMessages.LOWER_CAMEL_CASE,
+        SchemaPropertiesKeysCaseValidator.ERROR + "lower-camel-case",
         "components", COMPONENTS,
         "schemas.'Foo'", SCHEMA,
         "items", SCHEMA,
@@ -234,18 +242,12 @@ public class SchemaPropertiesKeysLowerCamelCaseValidatorTest extends OasComplian
     );
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public SchemaValidator schemaValidator() {
-
-      return PROPERTIES_LOWER_CAMEL_CASE_VALIDATOR;
-    }
+  private OasSpecValidator createOasSpecValidator() {
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(SchemaPropertiesKeysCaseValidator.CONFIG_KEY, "lower-camel-case")
+        );
+    return oasSpecValidator;
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleRequiredValidatorTest.java
similarity index 77%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleRequiredValidatorTest.java
index 86b5207..1adbf33 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/schema/SchemaTitleRequiredValidatorTest.java
@@ -17,16 +17,13 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.schema;
 
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.SchemaValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-import io.swagger.v3.oas.models.OpenAPI;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -35,12 +32,13 @@ import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.COMPONENT
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.SCHEMA;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = SchemaTitleValidatorTest.TestConfiguration.class)
-public class SchemaTitleValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class SchemaTitleRequiredValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidateComponents() {
     OpenAPI openAPI = loadRelative("petstore-schema-title-comp.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
@@ -51,10 +49,10 @@ public class SchemaTitleValidatorTest extends OasComplianceTestBase {
       )
     );
   }
-
   @Test
   public void testValidateNested() {
     OpenAPI openAPI = loadRelative("petstore-schema-title-nested.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).containsExactlyInAnyOrder(
       createViolation(
@@ -70,6 +68,7 @@ public class SchemaTitleValidatorTest extends OasComplianceTestBase {
   @Test
   public void testValidateParameter() {
     OpenAPI openAPI = loadRelative("petstore-schema-title-param.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).isEmpty();
   }
@@ -77,6 +76,7 @@ public class SchemaTitleValidatorTest extends OasComplianceTestBase {
   @Test
   public void testValidateRequestBody() {
     OpenAPI openAPI = loadRelative("petstore-schema-title-req.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).isEmpty();
   }
@@ -84,21 +84,18 @@ public class SchemaTitleValidatorTest extends OasComplianceTestBase {
   @Test
   public void testValidateResponse() {
     OpenAPI openAPI = loadRelative("petstore-schema-title-resp.yaml");
+    OasSpecValidator oasSpecValidator = createOasSpecValidator();
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).isEmpty();
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
 
-    public SchemaValidator schemaValidator() {
-      return new SchemaTitleValidator();
-    }
+  private OasSpecValidator createOasSpecValidator() {
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(SchemaTitleRequiredValidator.CONFIG_KEY, "true")
+        );
+    return oasSpecValidator;
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagDescriptionRequiredValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagDescriptionRequiredValidatorTest.java
index 8769e07..dd4da53 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagDescriptionRequiredValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagDescriptionRequiredValidatorTest.java
@@ -17,17 +17,13 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
 
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.TagValidator;
 import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
-import io.swagger.v3.oas.models.OpenAPI;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -35,28 +31,21 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = TagDescriptionRequiredValidatorTest.TestConfiguration.class)
-public class TagDescriptionRequiredValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class TagDescriptionRequiredValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-tag-no-desc.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(TagDescriptionRequiredValidator.CONFIG_KEY, "true")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).hasSize(1);
     assertThat(violations)
       .containsExactly(createViolation(ViolationMessages.REQUIRED, "tags[0]", TAG, "description", null));
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-    @Bean
-
-    public TagValidator tagDescriptionRequiredValidator() {
-      return new TagDescriptionRequiredValidator();
-    }
-  }
-
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagReferenceValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagMustBeReferencedValidatorTest.java
similarity index 64%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagReferenceValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagMustBeReferencedValidatorTest.java
index 53a975a..adaf16e 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagReferenceValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagMustBeReferencedValidatorTest.java
@@ -17,16 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.TagValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -34,28 +30,21 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = TagReferenceValidatorTest.TestConfiguration.class)
-public class TagReferenceValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class TagMustBeReferencedValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-tag-redundant.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(TagMustBeReferencedValidator.CONFIG_KEY, "true")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).hasSize(1);
     assertThat(violations)
-      .containsExactly(createViolation("Is not referenced by any Operation object", "tags[1]", TAG));
-  }
-
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-    @Bean
-
-    public TagValidator tagReferenceValidator() {
-      return new TagReferenceValidator();
-    }
+        .containsExactly(createViolation(TagMustBeReferencedValidator.ERROR, "tags[1]", TAG));
   }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidatorTest.java b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameCaseValidatorTest.java
similarity index 62%
rename from oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidatorTest.java
rename to oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameCaseValidatorTest.java
index e1d1083..2482b2d 100755
--- a/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameUpperCamelCaseValidatorTest.java
+++ b/oas-validator/oas-validator-compliance/src/test/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/tag/TagNameCaseValidatorTest.java
@@ -17,17 +17,12 @@
 
 package org.apache.servicecomb.toolkit.oasv.compliance.validator.tag;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.TagValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.ViolationMessages;
-import org.apache.servicecomb.toolkit.oasv.validation.config.OasValidatorsSkeletonConfiguration;
-
-import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasComplianceTestBase;
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.compliance.factory.ValidatorFactoryComponents;
+import org.apache.servicecomb.toolkit.oasv.compliance.validator.OasStyleCheckTestBase;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
 import org.junit.Test;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 import org.springframework.test.context.ContextConfiguration;
 
 import java.util.List;
@@ -35,30 +30,23 @@ import java.util.List;
 import static org.apache.servicecomb.toolkit.oasv.common.OasObjectType.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ContextConfiguration(classes = TagNameUpperCamelCaseValidatorTest.TestConfiguration.class)
-public class TagNameUpperCamelCaseValidatorTest extends OasComplianceTestBase {
+@ContextConfiguration(classes = ValidatorFactoryComponents.class)
+public class TagNameCaseValidatorTest extends OasStyleCheckTestBase {
 
   @Test
   public void testValidate() {
     OpenAPI openAPI = loadRelative("petstore-tag-name-not-upper-camel-case.yaml");
+    OasSpecValidator oasSpecValidator =
+        oasSpecValidatorFactory.create(
+            singleOption(TagNameCaseValidator.CONFIG_KEY, "upper-camel-case")
+        );
+
     List<OasViolation> violations = oasSpecValidator.validate(createContext(openAPI), openAPI);
     assertThat(violations).hasSize(1);
     assertThat(violations)
-      .containsExactly(createViolation(ViolationMessages.UPPER_CAMEL_CASE, "tags[0]", TAG, "name", null));
+        .containsExactly(
+            createViolation(TagNameCaseValidator.ERROR + "upper-camel-case", "tags[0]", TAG, "name", null));
   }
 
-  @Configuration
-  @Import({
-    OasValidatorsSkeletonConfiguration.class
-  })
-  public static class TestConfiguration {
-
-    @Bean
-
-    public TagValidator tagNameUpperCamelCaseValidator() {
-      return new TagNameUpperCamelCaseValidator();
-    }
-
-  }
 
 }
diff --git a/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/petstore-security-schemes-upper-camel-case.yaml b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/petstore-security-schemes-upper-camel-case.yaml
new file mode 100755
index 0000000..bc102b7
--- /dev/null
+++ b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/components/petstore-security-schemes-upper-camel-case.yaml
@@ -0,0 +1,52 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+openapi: "3.0.0"
+info:
+  version: 1.0.0
+  title: Swagger Petstore
+  license:
+    name: MIT
+servers:
+  - url: http://petstore.swagger.io/v1
+paths:
+  /pets:
+    get:
+      summary: List all pets
+      operationId: listPets
+      tags:
+        - pets
+      parameters:
+        - name: limit
+          in: query
+          description: How many items to return at one time (max 100)
+          required: false
+          schema:
+            type: integer
+            format: int32
+      responses:
+        '200':
+          description: A paged array of pets
+          headers:
+            x-next:
+              description: A link to the next page of responses
+              schema:
+                type: string
+components:
+  securitySchemes:
+    foo:
+      type: http
+      scheme: http
diff --git a/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-1.yaml b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-1.yaml
new file mode 100755
index 0000000..8f430ef
--- /dev/null
+++ b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-1.yaml
@@ -0,0 +1,48 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+openapi: "3.0.0"
+info:
+  version: 1.0.0
+  title: Swagger Petstore
+  license:
+    name: MIT
+servers:
+  - url: http://petstore.swagger.io/v1
+paths:
+  /pets:
+    post:
+      summary: Create a pet
+      operationId: createPets
+      requestBody:
+        content:
+          application/json:
+            schema:
+              type: string
+            encoding:
+              foo:
+                contentType: application/json
+                headers:
+                  foo-bar:
+                    schema:
+                      type: string
+      responses:
+        default:
+          description: unexpected error
+          headers:
+            foo:
+              schema:
+                type: string
diff --git a/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-2.yaml b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-2.yaml
new file mode 100755
index 0000000..03f14ff
--- /dev/null
+++ b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-2.yaml
@@ -0,0 +1,43 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+openapi: "3.0.0"
+info:
+  version: 1.0.0
+  title: Swagger Petstore
+  license:
+    name: MIT
+servers:
+  - url: http://petstore.swagger.io/v1
+paths:
+  /pets:
+    post:
+      summary: Create a pet
+      operationId: createPets
+      responses:
+        default:
+          description: unexpected error
+          content:
+            application/json:
+              schema:
+                type: string
+              encoding:
+                foo:
+                  contentType: application/json
+                  headers:
+                    foo-bar:
+                      schema:
+                        type: string
diff --git a/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-3.yaml b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-3.yaml
new file mode 100755
index 0000000..4fde1e3
--- /dev/null
+++ b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-3.yaml
@@ -0,0 +1,51 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+openapi: "3.0.0"
+info:
+  version: 1.0.0
+  title: Swagger Petstore
+  license:
+    name: MIT
+servers:
+  - url: http://petstore.swagger.io/v1
+paths:
+  /pets:
+    post:
+      summary: Create a pet
+      operationId: createPets
+      responses:
+        default:
+          description: unexpected error
+          headers:
+            foo:
+              schema:
+                type: string
+
+components:
+  requestBodies:
+    foo:
+      content:
+        application/json:
+          schema:
+            type: string
+          encoding:
+            foo:
+              contentType: application/json
+              headers:
+                foo-bar:
+                  schema:
+                    type: string
diff --git a/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-4.yaml b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-4.yaml
new file mode 100755
index 0000000..833520e
--- /dev/null
+++ b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/encoding/petstore-encoding-headers-key-case-4.yaml
@@ -0,0 +1,52 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+openapi: "3.0.0"
+info:
+  version: 1.0.0
+  title: Swagger Petstore
+  license:
+    name: MIT
+servers:
+  - url: http://petstore.swagger.io/v1
+paths:
+  /pets:
+    post:
+      summary: Create a pet
+      operationId: createPets
+      responses:
+        default:
+          description: unexpected error
+          headers:
+            foo:
+              schema:
+                type: string
+
+components:
+  responses:
+    foo:
+      description: unexpected error
+      content:
+        application/json:
+          schema:
+            type: string
+          encoding:
+            foo:
+              contentType: application/json
+              headers:
+                foo-bar:
+                  schema:
+                    type: string
diff --git a/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/petstore-response-headers-key-case.yaml b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/petstore-response-headers-key-case.yaml
new file mode 100755
index 0000000..dc930ae
--- /dev/null
+++ b/oas-validator/oas-validator-compliance/src/test/resources/org/apache/servicecomb/toolkit/oasv/compliance/validator/response/petstore-response-headers-key-case.yaml
@@ -0,0 +1,44 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+openapi: "3.0.0"
+info:
+  version: 1.0.0
+  title: Swagger Petstore
+  license:
+    name: MIT
+servers:
+  - url: http://petstore.swagger.io/v1
+paths:
+  /pets:
+    post:
+      summary: Create a pet
+      operationId: createPets
+      responses:
+        default:
+          description: unexpected error
+          headers:
+            foo-bar:
+              schema:
+                type: string
+components:
+  responses:
+    foo:
+      description: unexpected error
+      headers:
+        foo-bar:
+          schema:
+            type: string
diff --git a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/FactoryOptions.java b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/FactoryOptions.java
new file mode 100644
index 0000000..6d555cc
--- /dev/null
+++ b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/FactoryOptions.java
@@ -0,0 +1,48 @@
+package org.apache.servicecomb.toolkit.oasv;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+
+public class FactoryOptions {
+
+  private final Map<String, String> options;
+
+  public FactoryOptions(Map<String, String> options) {
+    this.options = Collections.unmodifiableMap(new HashMap<>(options));
+  }
+
+  public FactoryOptions(Properties properties) {
+    Map<String, String> options = new HashMap<>();
+    Set<Object> keys = properties.keySet();
+    for (Object key : keys) {
+      options.put((String) key, (String) properties.get(key));
+    }
+    this.options = Collections.unmodifiableMap(options);
+  }
+
+  public String getString(String key) {
+    String value = options.get(key);
+    if (StringUtils.isNotBlank(value)) {
+      return value;
+    }
+    return null;
+  }
+
+  public Boolean getBoolean(String key) {
+    String value = options.get(key);
+    if (StringUtils.isNotBlank(value)) {
+      return Boolean.valueOf(value);
+    }
+    return null;
+  }
+
+  public Integer getInteger(String key) {
+    String value = options.get(key);
+    if (StringUtils.isNotBlank(value)) {
+      return Integer.valueOf(value);
+    }
+    return null;
+  }
+
+}
diff --git a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/diffvalidation/factory/DiffValidatorCreationOptions.java b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/diffvalidation/factory/DiffValidatorCreationOptions.java
new file mode 100644
index 0000000..b39eeed
--- /dev/null
+++ b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/diffvalidation/factory/DiffValidatorCreationOptions.java
@@ -0,0 +1,5 @@
+package org.apache.servicecomb.toolkit.oasv.diffvalidation.factory;
+
+public class DiffValidatorCreationOptions {
+
+}
diff --git a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/util/StringCaseUtils.java b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/util/StringCaseUtils.java
index ac9bc39..189ab1c 100755
--- a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/util/StringCaseUtils.java
+++ b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/util/StringCaseUtils.java
@@ -54,4 +54,16 @@ public abstract class StringCaseUtils {
     return UPPER_HYPHEN_CASE.matcher(string).matches();
   }
 
+  public static boolean isMatchCase(String expectedCase, String string) {
+    switch (expectedCase) {
+    case "upper-camel-case":
+      return isUpperCamelCase(string);
+    case "lower-camel-case":
+      return isLowerCamelCase(string);
+    case "upper-hyphen-case":
+      return isUpperHyphenCase(string);
+    default:
+      throw new IllegalArgumentException("Unrecgonized case");
+    }
+  }
 }
diff --git a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/factory/OasObjectValidatorFactory.java b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/factory/OasObjectValidatorFactory.java
index 58942c0..5c293ec 100644
--- a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/factory/OasObjectValidatorFactory.java
+++ b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/factory/OasObjectValidatorFactory.java
@@ -19,10 +19,11 @@ package org.apache.servicecomb.toolkit.oasv.validation.factory;
 
 import java.util.List;
 
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasObjectValidator;
 
 public interface OasObjectValidatorFactory<T extends OasObjectValidator> {
 
-  List<T> create();
+  List<T> create(FactoryOptions options);
 
 }
diff --git a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/factory/OasSpecValidatorFactory.java b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/factory/OasSpecValidatorFactory.java
index c1a518c..813cc27 100644
--- a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/factory/OasSpecValidatorFactory.java
+++ b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/factory/OasSpecValidatorFactory.java
@@ -17,8 +17,9 @@
 
 package org.apache.servicecomb.toolkit.oasv.validation.factory;
 
+import org.apache.servicecomb.toolkit.oasv.FactoryOptions;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasSpecValidator;
 
 public interface OasSpecValidatorFactory {
-  OasSpecValidator create();
+  OasSpecValidator create(FactoryOptions options);
 }
diff --git a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/skeleton/encoding/EncodingHeadersKeysValidator.java b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/skeleton/encoding/EncodingHeadersKeysValidator.java
index a5e9c1c..2613a5d 100755
--- a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/skeleton/encoding/EncodingHeadersKeysValidator.java
+++ b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/skeleton/encoding/EncodingHeadersKeysValidator.java
@@ -17,9 +17,9 @@
 
 package org.apache.servicecomb.toolkit.oasv.validation.skeleton.encoding;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.MapPropertyKeysValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.EncodingValidator;
 import io.swagger.v3.oas.models.media.Encoding;
+import org.apache.servicecomb.toolkit.oasv.validation.api.EncodingValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.MapPropertyKeysValidator;
 
 import java.util.Map;
 import java.util.function.Function;
@@ -33,7 +33,7 @@ public class EncodingHeadersKeysValidator extends MapPropertyKeysValidator<Encod
   implements EncodingValidator {
 
   public EncodingHeadersKeysValidator(Predicate<String> keyPredicate,
-    Function<String, String> errorFunction) {
+      Function<String, String> errorFunction) {
     super(keyPredicate, errorFunction);
   }
 
diff --git a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/skeleton/response/ResponseHeadersKeysValidator.java b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/skeleton/response/ResponseHeadersKeysValidator.java
index 1db4868..420e7bb 100755
--- a/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/skeleton/response/ResponseHeadersKeysValidator.java
+++ b/oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/skeleton/response/ResponseHeadersKeysValidator.java
@@ -17,9 +17,9 @@
 
 package org.apache.servicecomb.toolkit.oasv.validation.skeleton.response;
 
-import org.apache.servicecomb.toolkit.oasv.validation.api.ResponseValidator;
-import org.apache.servicecomb.toolkit.oasv.validation.api.MapPropertyKeysValidator;
 import io.swagger.v3.oas.models.responses.ApiResponse;
+import org.apache.servicecomb.toolkit.oasv.validation.api.MapPropertyKeysValidator;
+import org.apache.servicecomb.toolkit.oasv.validation.api.ResponseValidator;
 
 import java.util.Map;
 import java.util.function.Function;
@@ -27,13 +27,13 @@ import java.util.function.Predicate;
 
 /**
  * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject">ApiResponse Object</a>
- * .callbacks property key validator
+ * .headers property key validator
  */
 public class ResponseHeadersKeysValidator extends MapPropertyKeysValidator<ApiResponse>
   implements ResponseValidator {
 
   public ResponseHeadersKeysValidator(Predicate<String> keyPredicate,
-    Function<String, String> errorFunction) {
+      Function<String, String> errorFunction) {
     super(keyPredicate, errorFunction);
   }
 
diff --git a/oas-validator/oas-validator-core/src/test/java/org/apache/servicecomb/toolkit/oasv/util/StringCaseUtilsTest.java b/oas-validator/oas-validator-core/src/test/java/org/apache/servicecomb/toolkit/oasv/util/StringCaseUtilsTest.java
index 2db499e..f0a6921 100755
--- a/oas-validator/oas-validator-core/src/test/java/org/apache/servicecomb/toolkit/oasv/util/StringCaseUtilsTest.java
+++ b/oas-validator/oas-validator-core/src/test/java/org/apache/servicecomb/toolkit/oasv/util/StringCaseUtilsTest.java
@@ -17,10 +17,11 @@
 
 package org.apache.servicecomb.toolkit.oasv.util;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 import org.junit.Test;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+
 public class StringCaseUtilsTest {
 
   @Test
@@ -171,4 +172,11 @@ public class StringCaseUtilsTest {
     assertThat(StringCaseUtils.isUpperHyphenCase("aaA00_")).isFalse();
 
   }
+
+  @Test
+  public void testIsMatchCase() {
+    // TODO
+    assertEquals(true, false);
+  }
+
 }
diff --git a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagNotEmptyValidator.java b/oas-validator/oas-validator-test/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/test/OasValidatorTestBaseNew.java
similarity index 50%
rename from oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagNotEmptyValidator.java
rename to oas-validator/oas-validator-test/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/test/OasValidatorTestBaseNew.java
index b93b9ea..f20f54e 100755
--- a/oas-validator/oas-validator-compliance/src/main/java/org/apache/servicecomb/toolkit/oasv/compliance/validator/openapi/OpenApiTagNotEmptyValidator.java
+++ b/oas-validator/oas-validator-test/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/test/OasValidatorTestBaseNew.java
@@ -15,40 +15,40 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.oasv.compliance.validator.openapi;
+package org.apache.servicecomb.toolkit.oasv.validation.test;
 
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.servicecomb.toolkit.oasv.OasSpecLoader;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectPropertyLocation;
 import org.apache.servicecomb.toolkit.oasv.common.OasObjectType;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasValidationContext;
 import org.apache.servicecomb.toolkit.oasv.validation.api.OasViolation;
-import org.apache.servicecomb.toolkit.oasv.validation.api.OpenApiValidator;
-import io.swagger.v3.oas.models.OpenAPI;
-import org.apache.commons.collections4.CollectionUtils;
+import org.apache.servicecomb.toolkit.oasv.validation.factory.OasSpecValidatorFactory;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.List;
+@RunWith(SpringRunner.class)
+public abstract class OasValidatorTestBaseNew extends OasSpecLoader {
 
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
-
-/**
- * <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#openapi-object">OpenAPI Object</a>
- * .tags(List of <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject">Tag Object</a>)
- * not empty validator
- * <ul>
- *   <li>at least one</li>
- * </ul>
- */
-public class OpenApiTagNotEmptyValidator implements OpenApiValidator {
+  @Autowired
+  protected OasSpecValidatorFactory oasSpecValidatorFactory;
 
-  @Override
-  public List<OasViolation> validate(OasValidationContext context, OasObjectPropertyLocation location, OpenAPI openAPI) {
+  final protected OasValidationContext createContext(OpenAPI openAPI) {
+    OasValidationContext oasValidationContext = new OasValidationContext(openAPI);
+    initContext(oasValidationContext);
+    return oasValidationContext;
+  }
 
-    if (CollectionUtils.isEmpty(openAPI.getTags())) {
-      return singletonList(new OasViolation(location.property("tags", OasObjectType.TAG), "At least provide one tag"));
+  protected void initContext(OasValidationContext context) {
+  }
 
+  final protected OasViolation createViolation(String error, Object... path) {
+    OasObjectPropertyLocation loc = OasObjectPropertyLocation.root();
+    for (int i = 0; i < path.length; i = i + 2) {
+      loc = loc.property((String) path[i], (OasObjectType) path[i + 1]);
     }
-    return emptyList();
-
+    return new OasViolation(loc, error);
   }
 
 }