You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/10/19 01:53:52 UTC

[incubator-servicecomb-java-chassis] branch master updated (76eb7a1 -> 56d8899)

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

liubao pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git.


    from 76eb7a1  [SCB-961]provide a way to isolate for at least a moment
     new b0b3b83  [SCB-964] remove weak cipher suites
     new 56d8899  [SCB-964] fix MediaType setting problem

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../servicecomb/foundation/ssl/SSLOption.java      |  8 +-
 .../foundation/vertx/TestVertxTLSBuilder.java      |  2 +-
 .../org/apache/servicecomb/it/ConsumerMain.java    |  2 +
 .../it/schema/ApiOperationJaxrsSchema.java         | 41 +++++------
 .../it/schema/ApiOperationSpringMVCSchema.java     | 46 ++++++++++++
 .../servicecomb/it/schema/TestApiOperation.java    | 74 +++++++++++++++++++
 .../annotation/ApiOperationProcessor.java          | 29 ++++----
 .../annotation/SwaggerDefinitionProcessor.java     | 16 ++--
 .../annotation/ApiOperationProcessorTest.java      | 57 ++++++++++++++
 .../annotation/SwaggerDefinitionProcessorTest.java | 34 ++++++++-
 .../annotation/ConsumesAnnotationProcessor.java    | 12 ++-
 .../annotation/ProducesAnnotationProcessor.java    | 12 ++-
 .../ConsumesAnnotationProcessorTest.java           | 86 ++++++++++++++++++++++
 .../ProducesAnnotationProcessorTest.java           | 59 +++++++++++++++
 ...stractHttpMethodMappingAnnotationProcessor.java | 15 +++-
 ...equestMappingMethodAnnotationProcessorTest.java | 83 +++++++++++++++++++++
 16 files changed, 514 insertions(+), 62 deletions(-)
 copy samples/jaxrs-sample/jaxrs-provider/src/main/java/org/apache/servicecomb/samples/jaxrs/provider/JaxrsHelloImpl.java => integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationJaxrsSchema.java (56%)
 create mode 100644 integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationSpringMVCSchema.java
 create mode 100644 integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/TestApiOperation.java
 create mode 100644 swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessorTest.java
 create mode 100644 swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessorTest.java
 create mode 100644 swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessorTest.java


[incubator-servicecomb-java-chassis] 01/02: [SCB-964] remove weak cipher suites

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit b0b3b835c908c50333a1991df5db170149853cf9
Author: yaohaishi <ya...@huawei.com>
AuthorDate: Tue Oct 16 09:26:15 2018 +0800

    [SCB-964] remove weak cipher suites
---
 .../java/org/apache/servicecomb/foundation/ssl/SSLOption.java     | 8 +++-----
 .../apache/servicecomb/foundation/vertx/TestVertxTLSBuilder.java  | 2 +-
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/SSLOption.java b/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/SSLOption.java
index 012ad80..b7b5034 100644
--- a/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/SSLOption.java
+++ b/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/SSLOption.java
@@ -38,15 +38,13 @@ import com.netflix.config.DynamicPropertyFactory;
 public final class SSLOption {
   private static final SSLOption DEFAULT_OPTION = new SSLOption();
 
-  public static final String DEFAUL_CIPHERS = "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,"
-      + "TLS_RSA_WITH_AES_256_GCM_SHA384,"
-      + "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,"
-      + "TLS_RSA_WITH_AES_128_GCM_SHA256";
+  public static final String DEFAULT_CIPHERS = "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,"
+      + "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256";
 
   static {
     DEFAULT_OPTION.setEngine("jdk");
     DEFAULT_OPTION.setProtocols("TLSv1.2");
-    DEFAULT_OPTION.setCiphers(DEFAUL_CIPHERS);
+    DEFAULT_OPTION.setCiphers(DEFAULT_CIPHERS);
     DEFAULT_OPTION.setAuthPeer(false);
     DEFAULT_OPTION.setCheckCNHost(false);
     DEFAULT_OPTION.setCheckCNWhite(false);
diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxTLSBuilder.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxTLSBuilder.java
index 5703855..95a2cd1 100644
--- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxTLSBuilder.java
+++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxTLSBuilder.java
@@ -66,7 +66,7 @@ public class TestVertxTLSBuilder {
     static {
       sslOption.setEngine("openssl");
       sslOption.setProtocols("");
-      sslOption.setCiphers(SSLOption.DEFAUL_CIPHERS);
+      sslOption.setCiphers(SSLOption.DEFAULT_CIPHERS);
       sslOption.setCheckCNHost(true);
     }
 


[incubator-servicecomb-java-chassis] 02/02: [SCB-964] fix MediaType setting problem

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit 56d8899c4039813045ff11c004c55114bc6ec12b
Author: yaohaishi <ya...@huawei.com>
AuthorDate: Tue Oct 16 22:48:22 2018 +0800

    [SCB-964] fix MediaType setting problem
---
 .../org/apache/servicecomb/it/ConsumerMain.java    |  2 +
 .../it/schema/ApiOperationJaxrsSchema.java         | 50 +++++++++++++
 .../it/schema/ApiOperationSpringMVCSchema.java     | 46 ++++++++++++
 .../servicecomb/it/schema/TestApiOperation.java    | 74 +++++++++++++++++++
 .../annotation/ApiOperationProcessor.java          | 29 ++++----
 .../annotation/SwaggerDefinitionProcessor.java     | 16 ++--
 .../annotation/ApiOperationProcessorTest.java      | 57 ++++++++++++++
 .../annotation/SwaggerDefinitionProcessorTest.java | 34 ++++++++-
 .../annotation/ConsumesAnnotationProcessor.java    | 12 ++-
 .../annotation/ProducesAnnotationProcessor.java    | 12 ++-
 .../ConsumesAnnotationProcessorTest.java           | 86 ++++++++++++++++++++++
 .../ProducesAnnotationProcessorTest.java           | 59 +++++++++++++++
 ...stractHttpMethodMappingAnnotationProcessor.java | 15 +++-
 ...equestMappingMethodAnnotationProcessorTest.java | 83 +++++++++++++++++++++
 14 files changed, 542 insertions(+), 33 deletions(-)

diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java
index e7455da..1004eef 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java
@@ -20,6 +20,7 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.it.deploy.Deploys;
 import org.apache.servicecomb.it.junit.ITJUnitUtils;
+import org.apache.servicecomb.it.schema.TestApiOperation;
 import org.apache.servicecomb.it.testcase.TestAnnotatedAttribute;
 import org.apache.servicecomb.it.testcase.TestApiParam;
 import org.apache.servicecomb.it.testcase.TestChangeTransport;
@@ -71,6 +72,7 @@ public class ConsumerMain {
     ITJUnitUtils.run(TestIgnoreStaticMethod.class);
     ITJUnitUtils.run(TestIgnoreMethod.class);
     ITJUnitUtils.run(TestApiParam.class);
+    ITJUnitUtils.run(TestApiOperation.class);
 
     // 1.base test case
     //   include all extension point abnormal scenes test case
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationJaxrsSchema.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationJaxrsSchema.java
new file mode 100644
index 0000000..42db9d4
--- /dev/null
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationJaxrsSchema.java
@@ -0,0 +1,50 @@
+/*
+ * 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.it.schema;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+
+import io.swagger.annotations.ApiOperation;
+
+@RestSchema(schemaId = "apiOperationJaxrsSchema")
+@Path("/apiOperationJaxrsSchema")
+public class ApiOperationJaxrsSchema {
+  @POST
+  @Path("/testMediaType1")
+  @Consumes(MediaType.TEXT_PLAIN)
+  @Produces(MediaType.TEXT_HTML)
+  @ApiOperation(value = "testMediaType1", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_XML)
+  public String testMediaType1(String input) {
+    return input;
+  }
+
+  @POST
+  @Path("/testMediaType2")
+  @ApiOperation(value = "testMediaType2", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_HTML)
+  @Consumes(MediaType.APPLICATION_JSON)
+  @Produces(MediaType.APPLICATION_XML)
+  public String testMediaType2(String input) {
+    return input;
+  }
+}
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationSpringMVCSchema.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationSpringMVCSchema.java
new file mode 100644
index 0000000..78781f6
--- /dev/null
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationSpringMVCSchema.java
@@ -0,0 +1,46 @@
+/*
+ * 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.it.schema;
+
+import javax.ws.rs.core.MediaType;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.SwaggerDefinition;
+
+@RestSchema(schemaId = "apiOperationSpringMVCSchema")
+@RequestMapping(value = "/apiOperationSpringMVCSchema", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_HTML)
+@SwaggerDefinition(consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_XML)
+public class ApiOperationSpringMVCSchema {
+  @RequestMapping(value = "/testMediaType1", method = RequestMethod.POST, consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_HTML)
+  @ApiOperation(value = "testMediaType1", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_XML)
+  public String testMediaType1(@RequestBody String input) {
+    return input;
+  }
+
+  @ApiOperation(value = "testMediaType2", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_HTML)
+  @PutMapping(value = "/testMediaType2", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_XML)
+  public String testMediaType2(@RequestBody String input) {
+    return input;
+  }
+}
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/TestApiOperation.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/TestApiOperation.java
new file mode 100644
index 0000000..dee2699
--- /dev/null
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/TestApiOperation.java
@@ -0,0 +1,74 @@
+/*
+ * 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.it.schema;
+
+import javax.ws.rs.core.MediaType;
+
+import org.apache.servicecomb.core.SCBEngine;
+import org.apache.servicecomb.core.definition.MicroserviceMeta;
+import org.apache.servicecomb.core.definition.SchemaMeta;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import io.swagger.models.Operation;
+import io.swagger.models.Swagger;
+
+public class TestApiOperation {
+  MicroserviceMeta microserviceMeta = SCBEngine.getInstance().getProducerMicroserviceMeta();
+
+  protected Operation getOperation(String schemaId, String opName) {
+    SchemaMeta schemaMeta = microserviceMeta.findSchemaMeta(schemaId);
+    return schemaMeta.findOperation(opName).getSwaggerOperation();
+  }
+
+  @Test
+  public void jaxrs_TestMediaType1() {
+    Operation operation = getOperation("apiOperationJaxrsSchema", "testMediaType1");
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.APPLICATION_JSON));
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.APPLICATION_XML));
+  }
+
+  @Test
+  public void jaxrs_TestMediaType2() {
+    Operation operation = getOperation("apiOperationJaxrsSchema", "testMediaType2");
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.APPLICATION_JSON));
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.APPLICATION_XML));
+  }
+
+  @Test
+  public void springMVC_TestMediaType1() {
+    Operation operation = getOperation("apiOperationSpringMVCSchema", "testMediaType1");
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.APPLICATION_JSON));
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.APPLICATION_XML));
+  }
+
+  @Test
+  public void springMVC_TestMediaType2() {
+    Operation operation = getOperation("apiOperationSpringMVCSchema", "testMediaType2");
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.APPLICATION_JSON));
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.APPLICATION_XML));
+  }
+
+  @Test
+  public void springMVC_TestSwaggerDefinitionMediaType() {
+    Swagger swagger = microserviceMeta.findSchemaMeta("apiOperationSpringMVCSchema").getSwagger();
+    Assert.assertThat(swagger.getConsumes(), Matchers.contains(MediaType.APPLICATION_JSON));
+    Assert.assertThat(swagger.getProduces(), Matchers.contains(MediaType.APPLICATION_XML));
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessor.java
index 344e3a3..0207727 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessor.java
@@ -17,6 +17,10 @@
 
 package org.apache.servicecomb.swagger.generator.core.processor.annotation;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import org.apache.servicecomb.swagger.generator.core.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
 import org.springframework.util.StringUtils;
@@ -27,6 +31,9 @@ import io.swagger.models.Scheme;
 import io.swagger.util.BaseReaderUtils;
 
 public class ApiOperationProcessor implements MethodAnnotationProcessor {
+
+  private static final String SEPARATOR = ",";
+
   @Override
   public void process(Object annotation, OperationGenerator operationGenerator) {
     ApiOperation apiOperationAnnotation = (ApiOperation) annotation;
@@ -64,7 +71,7 @@ public class ApiOperationProcessor implements MethodAnnotationProcessor {
       return;
     }
 
-    for (String protocol : protocols.split(",")) {
+    for (String protocol : protocols.split(SEPARATOR)) {
       if (StringUtils.isEmpty(protocol)) {
         continue;
       }
@@ -79,12 +86,10 @@ public class ApiOperationProcessor implements MethodAnnotationProcessor {
       return;
     }
 
-    for (String consume : consumes.split(",")) {
-      if (StringUtils.isEmpty(consume)) {
-        continue;
-      }
-
-      operation.addConsumes(consume);
+    List<String> consumeList = Arrays.stream(consumes.split(SEPARATOR)).filter(s -> !StringUtils.isEmpty(s))
+        .collect(Collectors.toList());
+    if (!consumeList.isEmpty()) {
+      operation.setConsumes(consumeList);
     }
   }
 
@@ -94,12 +99,10 @@ public class ApiOperationProcessor implements MethodAnnotationProcessor {
       return;
     }
 
-    for (String produce : produces.split(",")) {
-      if (StringUtils.isEmpty(produce)) {
-        continue;
-      }
-
-      operation.addProduces(produce);
+    List<String> produceList = Arrays.stream(produces.split(SEPARATOR)).filter(s -> !StringUtils.isEmpty(s))
+        .collect(Collectors.toList());
+    if (!produceList.isEmpty()) {
+      operation.setProduces(produceList);
     }
   }
 
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessor.java
index 97cda46..3763b5e 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessor.java
@@ -138,10 +138,10 @@ public class SwaggerDefinitionProcessor implements ClassAnnotationProcessor {
     if (produces == null) {
       return;
     }
-    for (String produce : produces) {
-      if (!StringUtils.isEmpty(produce)) {
-        swagger.addProduces(produce);
-      }
+    List<String> produceList = Arrays.stream(produces).filter(s -> !StringUtils.isEmpty(s))
+        .collect(Collectors.toList());
+    if (!produceList.isEmpty()) {
+      swagger.setProduces(produceList);
     }
   }
 
@@ -150,10 +150,10 @@ public class SwaggerDefinitionProcessor implements ClassAnnotationProcessor {
     if (consumes == null) {
       return;
     }
-    for (String consume : consumes) {
-      if (!StringUtils.isEmpty(consume)) {
-        swagger.addConsumes(consume);
-      }
+    List<String> consumeList = Arrays.stream(consumes).filter(s -> !StringUtils.isEmpty(s))
+        .collect(Collectors.toList());
+    if (!consumeList.isEmpty()) {
+      swagger.setConsumes(consumeList);
     }
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessorTest.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessorTest.java
index 0209fe3..27f285e 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessorTest.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessorTest.java
@@ -24,9 +24,12 @@ import static org.junit.Assert.assertThat;
 import java.lang.reflect.Method;
 import java.util.List;
 
+import javax.ws.rs.core.MediaType;
+
 import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
 import org.apache.servicecomb.swagger.generator.core.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext;
+import org.hamcrest.Matchers;
 import org.junit.Test;
 
 import io.swagger.annotations.ApiOperation;
@@ -62,6 +65,43 @@ public class ApiOperationProcessorTest {
     assertNull(tagList);
   }
 
+  @Test
+  public void testMediaType() throws NoSuchMethodException {
+    ApiOperationProcessor apiOperationProcessor = new ApiOperationProcessor();
+
+    Method method = TestClass.class.getMethod("testSingleMediaType", String.class);
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(new PojoSwaggerGeneratorContext(), TestClass.class);
+    OperationGenerator operationGenerator = new OperationGenerator(swaggerGenerator, method);
+
+    apiOperationProcessor.process(method.getAnnotation(ApiOperation.class), operationGenerator);
+
+    assertThat(operationGenerator.getOperation().getConsumes(), Matchers.contains(MediaType.TEXT_PLAIN));
+    assertThat(operationGenerator.getOperation().getProduces(), Matchers.contains(MediaType.APPLICATION_XML));
+
+    method = TestClass.class.getMethod("testMultiMediaType", String.class);
+    apiOperationProcessor.process(method.getAnnotation(ApiOperation.class), operationGenerator);
+
+    assertThat(operationGenerator.getOperation().getConsumes(),
+        Matchers.contains(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN));
+    assertThat(operationGenerator.getOperation().getProduces(),
+        Matchers.contains(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
+
+    method = TestClass.class.getMethod("testBlankMediaType", String.class);
+    apiOperationProcessor.process(method.getAnnotation(ApiOperation.class), operationGenerator);
+
+    assertThat(operationGenerator.getOperation().getConsumes(),
+        Matchers.contains(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN));
+    assertThat(operationGenerator.getOperation().getProduces(),
+        Matchers.contains(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
+
+    operationGenerator.getOperation().addConsumes(MediaType.TEXT_HTML);
+    operationGenerator.getOperation().addProduces(MediaType.TEXT_HTML);
+    assertThat(operationGenerator.getOperation().getConsumes(),
+        Matchers.contains(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.TEXT_HTML));
+    assertThat(operationGenerator.getOperation().getProduces(),
+        Matchers.contains(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_HTML));
+  }
+
   private static class TestClass {
     @ApiOperation(value = "value1", tags = {"tag1", "tag2"})
     public void function() {
@@ -70,5 +110,22 @@ public class ApiOperationProcessorTest {
     @ApiOperation(value = "value2")
     public void functionWithNoTag() {
     }
+
+    @ApiOperation(value = "testSingleMediaType", consumes = MediaType.TEXT_PLAIN, produces = MediaType.APPLICATION_XML)
+    public String testSingleMediaType(String input) {
+      return input;
+    }
+
+    @ApiOperation(value = "testMultiMediaType",
+        consumes = MediaType.APPLICATION_JSON + "," + MediaType.TEXT_PLAIN,
+        produces = MediaType.APPLICATION_JSON + "," + MediaType.APPLICATION_XML)
+    public String testMultiMediaType(String input) {
+      return input;
+    }
+
+    @ApiOperation(value = "testBlankMediaType", consumes = "", produces = "")
+    public String testBlankMediaType(String input) {
+      return input;
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessorTest.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessorTest.java
index adfae44..679b34e 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessorTest.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessorTest.java
@@ -21,8 +21,11 @@ import static org.hamcrest.Matchers.contains;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
+import javax.ws.rs.core.MediaType;
+
 import org.apache.servicecomb.swagger.generator.core.SwaggerGenerator;
 import org.apache.servicecomb.swagger.generator.core.SwaggerGeneratorContext;
+import org.hamcrest.Matchers;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -43,10 +46,13 @@ public class SwaggerDefinitionProcessorTest {
   public void testProcess() {
     SwaggerGenerator swaggerGenerator = new SwaggerGenerator(Mockito.mock(SwaggerGeneratorContext.class),
         null);
+    Swagger swagger = swaggerGenerator.getSwagger();
+    // to test MediaType overwrite
+    swagger.addConsumes(MediaType.APPLICATION_XML);
+    swagger.addProduces(MediaType.APPLICATION_XML);
     swaggerDefinitionProcessor.process(SwaggerTestTarget.class.getAnnotation(SwaggerDefinition.class),
         swaggerGenerator);
 
-    Swagger swagger = swaggerGenerator.getSwagger();
     assertEquals(1, swagger.getTags().size());
     io.swagger.models.Tag tag = swagger.getTags().get(0);
     assertEquals("testTag", tag.getName());
@@ -61,6 +67,24 @@ public class SwaggerDefinitionProcessorTest {
     assertEquals("desc", info.getDescription());
     assertEquals("contactName", info.getContact().getName());
     assertEquals("licenseName", info.getLicense().getName());
+    assertThat(swagger.getConsumes(), Matchers.contains(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN));
+    assertThat(swagger.getProduces(), Matchers.contains(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
+  }
+
+  @Test
+  public void testProcess_emptyMediaType() {
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(Mockito.mock(SwaggerGeneratorContext.class),
+        null);
+    Swagger swagger = swaggerGenerator.getSwagger();
+    // to test MediaType overwrite
+    swagger.addConsumes(MediaType.APPLICATION_XML);
+    swagger.addProduces(MediaType.TEXT_PLAIN);
+    swaggerDefinitionProcessor.process(SwaggerTestTarget_EmptyMediaType.class.getAnnotation(SwaggerDefinition.class),
+        swaggerGenerator);
+
+    // empty media type should not be set, so keep consumes/produces not modified
+    assertThat(swagger.getConsumes(), Matchers.contains(MediaType.APPLICATION_XML));
+    assertThat(swagger.getProduces(), Matchers.contains(MediaType.TEXT_PLAIN));
   }
 
   @SwaggerDefinition(tags = {
@@ -69,7 +93,13 @@ public class SwaggerDefinitionProcessorTest {
       host = "127.0.0.1",
       schemes = {Scheme.HTTP, Scheme.HTTPS},
       info = @Info(title = "title", version = "version", description = "desc", contact = @Contact(name = "contactName"),
-          license = @License(name = "licenseName")))
+          license = @License(name = "licenseName")),
+      consumes = {MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN},
+      produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
   private class SwaggerTestTarget {
   }
+
+  @SwaggerDefinition(consumes = "", produces = "")
+  private class SwaggerTestTarget_EmptyMediaType {
+  }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java
index d92d977..ec2f87c 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessor.java
@@ -17,6 +17,10 @@
 
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import javax.ws.rs.Consumes;
 
 import org.apache.servicecomb.swagger.generator.core.MethodAnnotationProcessor;
@@ -28,10 +32,10 @@ public class ConsumesAnnotationProcessor implements MethodAnnotationProcessor {
   public void process(Object annotation, OperationGenerator operationGenerator) {
     Consumes consumes = (Consumes) annotation;
 
-    for (String consume : consumes.value()) {
-      if (!StringUtils.isEmpty(consume)) {
-        operationGenerator.getOperation().addConsumes(consume);
-      }
+    List<String> consumeList = Arrays.stream(consumes.value()).filter(s -> !StringUtils.isEmpty(s))
+        .collect(Collectors.toList());
+    if (!consumeList.isEmpty()) {
+      operationGenerator.getOperation().setConsumes(consumeList);
     }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessor.java
index 61f368b..5786c3d 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessor.java
@@ -17,6 +17,10 @@
 
 package org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import javax.ws.rs.Produces;
 
 import org.apache.commons.lang3.StringUtils;
@@ -28,10 +32,10 @@ public class ProducesAnnotationProcessor implements MethodAnnotationProcessor {
   public void process(Object annotation, OperationGenerator operationGenerator) {
     Produces produces = (Produces) annotation;
 
-    for (String produce : produces.value()) {
-      if (!StringUtils.isEmpty(produce)) {
-        operationGenerator.getOperation().addProduces(produce);
-      }
+    List<String> produceList = Arrays.stream(produces.value()).filter(s -> !StringUtils.isEmpty(s))
+        .collect(Collectors.toList());
+    if (!produceList.isEmpty()) {
+      operationGenerator.getOperation().setProduces(produceList);
     }
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessorTest.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessorTest.java
new file mode 100644
index 0000000..d0e3fa9
--- /dev/null
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ConsumesAnnotationProcessorTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.swagger.generator.jaxrs.processor.annotation;
+
+import java.lang.annotation.Annotation;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.swagger.models.Operation;
+
+public class ConsumesAnnotationProcessorTest {
+  @Test
+  public void testProcess() throws NoSuchMethodException {
+    ConsumesAnnotationProcessor processor = new ConsumesAnnotationProcessor();
+    Operation operation = new Operation();
+    OperationGenerator operationGenerator = mockOperationGenerator(operation);
+
+    Annotation consumesAnnotation = TestProducer.class.getMethod("testSingleMediaType", String.class)
+        .getAnnotation(Consumes.class);
+    processor.process(consumesAnnotation, operationGenerator);
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.APPLICATION_JSON));
+
+    consumesAnnotation = TestProducer.class.getMethod("testMultipleMediaType", String.class)
+        .getAnnotation(Consumes.class);
+    processor.process(consumesAnnotation, operationGenerator);
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
+
+    consumesAnnotation = TestProducer.class.getMethod("testBlankMediaType", String.class)
+        .getAnnotation(Consumes.class);
+    processor.process(consumesAnnotation, operationGenerator);
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
+
+    operation.addConsumes(MediaType.APPLICATION_XML);
+    Assert.assertThat(operation.getConsumes(),
+        Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
+  }
+
+  static OperationGenerator mockOperationGenerator(Operation operation) {
+    OperationGenerator operationGenerator = Mockito.mock(OperationGenerator.class);
+    Mockito.when(operationGenerator.getOperation()).thenReturn(operation);
+    return operationGenerator;
+  }
+
+  static class TestProducer {
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_XML)
+    public String testSingleMediaType(String input) {
+      return input;
+    }
+
+    @Consumes({MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON})
+    @Produces({MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML})
+    public String testMultipleMediaType(String input) {
+      return input;
+    }
+
+    @Consumes("")
+    @Produces("")
+    public String testBlankMediaType(String input) {
+      return input;
+    }
+  }
+}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessorTest.java b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessorTest.java
new file mode 100644
index 0000000..d4d3c0c
--- /dev/null
+++ b/swagger/swagger-generator/generator-jaxrs/src/test/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/ProducesAnnotationProcessorTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.swagger.generator.jaxrs.processor.annotation;
+
+import java.lang.annotation.Annotation;
+
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.jaxrs.processor.annotation.ConsumesAnnotationProcessorTest.TestProducer;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import io.swagger.models.Operation;
+
+public class ProducesAnnotationProcessorTest {
+  @Test
+  public void testProcess() throws NoSuchMethodException {
+    ProducesAnnotationProcessor processor = new ProducesAnnotationProcessor();
+    Operation operation = new Operation();
+    OperationGenerator operationGenerator = ConsumesAnnotationProcessorTest.mockOperationGenerator(operation);
+
+    Annotation produceAnnotation = TestProducer.class.getMethod("testSingleMediaType", String.class)
+        .getAnnotation(Produces.class);
+    processor.process(produceAnnotation, operationGenerator);
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.APPLICATION_XML));
+
+    produceAnnotation = TestProducer.class.getMethod("testMultipleMediaType", String.class)
+        .getAnnotation(Produces.class);
+    processor.process(produceAnnotation, operationGenerator);
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML));
+
+    produceAnnotation = TestProducer.class.getMethod("testBlankMediaType", String.class)
+        .getAnnotation(Produces.class);
+    processor.process(produceAnnotation, operationGenerator);
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML));
+
+    operation.addProduces(MediaType.APPLICATION_JSON);
+    Assert.assertThat(operation.getProduces(),
+        Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON));
+  }
+}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/AbstractHttpMethodMappingAnnotationProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
index ac82ef5..d481844 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
@@ -18,9 +18,12 @@
 package org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
 import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.servicecomb.swagger.generator.core.MethodAnnotationProcessor;
 import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMethod;
 
 import io.swagger.models.Operation;
@@ -51,7 +54,11 @@ abstract class AbstractHttpMethodMappingAnnotationProcessor implements MethodAnn
       return;
     }
 
-    operation.setConsumes(Arrays.asList(consumes));
+    List<String> consumeList = Arrays.stream(consumes).filter(s -> !StringUtils.isEmpty(s))
+        .collect(Collectors.toList());
+    if (!consumeList.isEmpty()) {
+      operation.setConsumes(consumeList);
+    }
   }
 
   protected void processProduces(String[] produces, Operation operation) {
@@ -59,6 +66,10 @@ abstract class AbstractHttpMethodMappingAnnotationProcessor implements MethodAnn
       return;
     }
 
-    operation.setProduces(Arrays.asList(produces));
+    List<String> produceList = Arrays.stream(produces).filter(s -> !StringUtils.isEmpty(s))
+        .collect(Collectors.toList());
+    if (!produceList.isEmpty()) {
+      operation.setProduces(produceList);
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessorTest.java b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessorTest.java
new file mode 100644
index 0000000..04cfaf5
--- /dev/null
+++ b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestMappingMethodAnnotationProcessorTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.swagger.generator.springmvc.processor.annotation;
+
+import javax.ws.rs.core.MediaType;
+
+import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.core.SwaggerGenerator;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import io.swagger.models.Operation;
+
+public class RequestMappingMethodAnnotationProcessorTest {
+  @Test
+  public void testProcess() throws NoSuchMethodException {
+    RequestMappingMethodAnnotationProcessor processor = new RequestMappingMethodAnnotationProcessor();
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(null, null);
+    OperationGenerator operationGenerator = new OperationGenerator(swaggerGenerator, null);
+    Operation operation = operationGenerator.getOperation();
+
+    RequestMapping annotation = TestProducer.class.getMethod("testSingleMediaType", String.class)
+        .getAnnotation(RequestMapping.class);
+    processor.process(annotation, operationGenerator);
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.APPLICATION_XML));
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.APPLICATION_XML));
+
+    annotation = TestProducer.class.getMethod("testMultipleMediaType", String.class)
+        .getAnnotation(RequestMapping.class);
+    processor.process(annotation, operationGenerator);
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
+
+    annotation = TestProducer.class.getMethod("testBlankMediaType", String.class)
+        .getAnnotation(RequestMapping.class);
+    processor.process(annotation, operationGenerator);
+    Assert.assertThat(operation.getConsumes(), Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
+    Assert.assertThat(operation.getProduces(), Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
+
+    operation.addConsumes(MediaType.APPLICATION_XML);
+    operation.addProduces(MediaType.APPLICATION_XML);
+    Assert.assertThat(operation.getConsumes(),
+        Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
+    Assert.assertThat(operation.getProduces(),
+        Matchers.contains(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
+  }
+
+  static class TestProducer {
+    @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_XML, produces = MediaType.APPLICATION_XML)
+    public String testSingleMediaType(String input) {
+      return input;
+    }
+
+    @RequestMapping(method = RequestMethod.PUT, consumes = {MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON},
+        produces = {MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON})
+    public String testMultipleMediaType(String input) {
+      return input;
+    }
+
+    @RequestMapping(method = RequestMethod.POST, consumes = "", produces = "")
+    public String testBlankMediaType(String input) {
+      return input;
+    }
+  }
+}
\ No newline at end of file