[3108] support @RequestMapping annotation (#3109)

diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringMVCSchema.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringMVCSchema.java
index a4c8523..6368c57 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringMVCSchema.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringMVCSchema.java
@@ -23,6 +23,7 @@
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
@@ -43,4 +44,16 @@
   public String testApiExample(@RequestBody String name, HttpServletRequest request) {
     return null;
   }
+
+  @ApiResponses({
+      @ApiResponse(code = 200, response = String.class, message = "success",
+          examples = @Example({
+              @ExampleProperty(value = "wget http://localhost/springMvcSchema/testDefaultGetApiExample", mediaType = "text"),
+              @ExampleProperty(value = "{name:hello}", mediaType = "application/json"),
+              @ExampleProperty(value = "{name:hello}", mediaType = "json")})
+      )})
+  @RequestMapping(path = "/testDefaultGetApiExample")
+  public String testDefaultGetApiExample(@RequestParam String name, HttpServletRequest request) {
+    return null;
+  }
 }
diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestRestTemplate.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestRestTemplate.java
index 5b7ad37..74c7f7f 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestRestTemplate.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestRestTemplate.java
@@ -56,6 +56,9 @@
     resultEntity = restTemplate
         .getForEntity("servicecomb://springmvc/codeFirstSpringmvc/testVoidInRestTemplate", Void.class);
     Assert.isTrue(200 == resultEntity.getStatusCodeValue(), "Void return type invocation failed");
+    resultEntity = restTemplate
+        .getForEntity("servicecomb://springmvc/codeFirstSpringmvc/testDefaultGetApiExample", Void.class);
+    Assert.isTrue(200 == resultEntity.getStatusCodeValue(), "Void return type invocation failed");
   }
 
   private void checkAllVoidTestResult() {
diff --git a/demo/demo-springmvc/springmvc-client/src/main/resources/SpringMVCSchema.yaml b/demo/demo-springmvc/springmvc-client/src/main/resources/SpringMVCSchema.yaml
index 6d80536..34031a9 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/resources/SpringMVCSchema.yaml
+++ b/demo/demo-springmvc/springmvc-client/src/main/resources/SpringMVCSchema.yaml
@@ -52,3 +52,20 @@
             json: "{name:hello}"
           schema:
             type: "string"
+  /testDefaultGetApiExample:
+    get:
+      operationId: "testDefaultGetApiExample"
+      parameters:
+        - name: "name"
+          in: "query"
+          required: true
+          type: "string"
+      responses:
+        "200":
+          description: "success"
+          examples:
+            text: "wget http://localhost/springMvcSchema/testDefaultGetApiExample"
+            application/json: "{name:hello}"
+            json: "{name:hello}"
+          schema:
+            type: "string"
diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java
index 2633df0..072ff0d 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java
+++ b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java
@@ -560,4 +560,9 @@
     response.setContent("returnOK");
     return response;
   }
+
+  @RequestMapping(path = "/testDefaultGetApiExample")
+  public void testDefaultGetApiExample() {
+    LOGGER.info("testDefaultGetApiExample() is called!");
+  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
index b404a2f..01d54df 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/OperationGenerator.java
@@ -24,6 +24,8 @@
 
   void setHttpMethod(String httpMethod);
 
+  String getHttpMethod();
+
   void addMethodResponseHeader(String name, Property property);
 
   void addOperationToSwagger();
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
index bd88314..2a1f118 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/AbstractOperationGenerator.java
@@ -127,6 +127,11 @@
   }
 
   @Override
+  public String getHttpMethod() {
+    return httpMethod;
+  }
+
+  @Override
   public Operation getOperation() {
     return swaggerOperation;
   }
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessor.java
index 363be7d..b17505c 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessor.java
@@ -19,9 +19,11 @@
 
 import java.lang.reflect.Type;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.swagger.generator.OperationGenerator;
 import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
 
 public class RequestMappingMethodAnnotationProcessor extends
     AbstractHttpMethodMappingAnnotationProcessor<RequestMapping> {
@@ -39,7 +41,9 @@
 
     doProcess(operationGenerator,
         requestMapping.path(), requestMapping.value(),
-        requestMapping.method().length == 0 ? null : requestMapping.method()[0],
+        requestMapping.method().length == 0 ?
+            (StringUtils.isEmpty(operationGenerator.getHttpMethod()) ? RequestMethod.GET : null) :
+            requestMapping.method()[0],
         requestMapping.consumes(), requestMapping.produces());
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java
index c83cd55..47b10ec 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java
+++ b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java
@@ -78,9 +78,8 @@
 
   @Test
   public void testClassMethodNoHttpMetod() {
-    UnitTestSwaggerUtils.testException(
-        "HttpMethod must not both be empty in class and method, method=org.apache.servicecomb.swagger.generator.springmvc.ClassMethodNoHttpMethod:noHttpMethod.",
-        ClassMethodNoHttpMethod.class);
+    UnitTestSwaggerUtils
+        .testSwagger("schemas/requestMappingHttpMethod.yaml", ClassMethodNoHttpMethod.class, "noHttpMethod");
   }
 
   @Test
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/requestMappingHttpMethod.yaml b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/requestMappingHttpMethod.yaml
new file mode 100644
index 0000000..aea1166
--- /dev/null
+++ b/swagger/swagger-generator/generator-springmvc/src/test/resources/schemas/requestMappingHttpMethod.yaml
@@ -0,0 +1,36 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+---
+swagger: "2.0"
+info:
+  version: "1.0.0"
+  title: "swagger definition for org.apache.servicecomb.swagger.generator.springmvc.ClassMethodNoHttpMethod"
+  x-java-interface: "gen.cse.ms.ut.ClassMethodNoHttpMethodIntf"
+basePath: "/c"
+consumes:
+- "application/json"
+produces:
+- "application/json"
+paths:
+  /m:
+    get:
+      operationId: "noHttpMethod"
+      parameters: []
+      responses:
+        "200":
+          description: "response of 200"