diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java b/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java
index 93b042f649f..faed968ff96 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java
+++ b/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java
@@ -57,6 +57,7 @@
import io.servicecomb.swagger.invocation.response.Headers;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.ResponseHeader;
@@ -132,6 +133,12 @@ public Date addDate(@RequestAttribute("date") Date date, @QueryParam("seconds")
return new Date(date.getTime() + seconds * 1000);
}
+ // this should be ignored as it's hidden
+ @ApiOperation(value = "", hidden = true, httpMethod = "POST")
+ public int add(@RequestParam("a") int a) {
+ return a;
+ }
+
@RequestMapping(path = "/add", method = RequestMethod.POST)
public int add(@RequestAttribute("a") int a, @RequestAttribute("b") int b) {
return a + b;
diff --git a/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvc.java b/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvc.java
index 2daae149f41..bc841d7fe53 100644
--- a/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvc.java
+++ b/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvc.java
@@ -43,6 +43,7 @@
import io.servicecomb.swagger.invocation.context.InvocationContext;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ResponseHeader;
@@ -91,6 +92,12 @@ public Date addDate(@RequestAttribute("date") Date date, @QueryParam("seconds")
return super.addDate(date, seconds);
}
+ // this should be ignored as it's hidden
+ @ApiOperation(value = "", hidden = true, httpMethod = "POST")
+ public int add(@RequestParam("a") int a) {
+ return a;
+ }
+
@RequestMapping(path = "/add", method = RequestMethod.POST)
@Override
public int add(@RequestAttribute("a") int a, @RequestAttribute("b") int b) {
diff --git a/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcBase.java b/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcBase.java
index 557a1e127c6..3e09aa862b7 100644
--- a/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcBase.java
+++ b/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcBase.java
@@ -74,6 +74,10 @@ public Date addDate(Date date, long seconds) {
return new Date(date.getTime() + seconds * 1000);
}
+ public int add(int a) {
+ return a;
+ }
+
public int add(int a, int b) {
return a + b;
}
diff --git a/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcSimplifiedMappingAnnotation.java b/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcSimplifiedMappingAnnotation.java
index 9068cbd11d4..43ae67fb09a 100644
--- a/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcSimplifiedMappingAnnotation.java
+++ b/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcSimplifiedMappingAnnotation.java
@@ -46,6 +46,7 @@
import io.servicecomb.swagger.invocation.context.InvocationContext;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ResponseHeader;
@@ -94,6 +95,13 @@ public Date addDate(@RequestAttribute("date") Date date, @QueryParam("seconds")
return super.addDate(date, seconds);
}
+
+ // this should be ignored as it's hidden
+ @ApiOperation(value = "", hidden = true, httpMethod = "POST")
+ public int add(@RequestParam("a") int a) {
+ return a;
+ }
+
@PostMapping(path = "/add")
@Override
public int add(@RequestAttribute("a") int a, @RequestAttribute("b") int b) {
diff --git a/java-chassis-dependencies/pom.xml b/java-chassis-dependencies/pom.xml
index 09ce799f7ef..7683c6a41bb 100644
--- a/java-chassis-dependencies/pom.xml
+++ b/java-chassis-dependencies/pom.xml
@@ -578,16 +578,6 @@
spring-expression
${spring.version}
-
- org.springframework
- spring-web
- ${spring.version}
-
-
- org.springframework
- spring-webmvc
- ${spring.version}
-
org.springframework
spring-jdbc
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/SwaggerEnvironment.java b/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/SwaggerEnvironment.java
index 648fe9857da..0ae4a2ddf7e 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/SwaggerEnvironment.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/SwaggerEnvironment.java
@@ -16,6 +16,8 @@
package io.servicecomb.swagger.engine;
import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
import javax.inject.Inject;
@@ -34,6 +36,7 @@
import io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapperFactory;
import io.servicecomb.swagger.invocation.response.producer.ProducerResponseMapper;
import io.servicecomb.swagger.invocation.response.producer.ProducerResponseMapperFactory;
+import io.swagger.annotations.ApiOperation;
import io.swagger.models.Swagger;
@Component
@@ -124,6 +127,7 @@ public SwaggerConsumer createConsumer(Class> consumerIntf, Class> swaggerInt
public SwaggerProducer createProducer(Object producerInstance, Swagger swagger) {
Class> producerCls = BeanUtils.getImplClassFromBean(producerInstance);
+ Map visibleProducerMethods = retrieveVisibleMethods(producerCls);
Class> swaggerIntf = ClassUtils.getOrCreateInterface(swagger, null, null);
SwaggerProducer producer = new SwaggerProducer();
@@ -132,7 +136,7 @@ public SwaggerProducer createProducer(Object producerInstance, Swagger swagger)
for (Method swaggerMethod : swaggerIntf.getMethods()) {
String methodName = swaggerMethod.getName();
// producer参数不一定等于swagger参数
- Method producerMethod = ReflectUtils.findMethod(producerCls, methodName);
+ Method producerMethod = visibleProducerMethods.getOrDefault(methodName, null);
if (producerMethod == null) {
// producer未实现契约,非法
String msg = String.format("swagger method %s:%s not exist in producer.",
@@ -169,4 +173,16 @@ public SwaggerProducer createProducer(Object producerInstance) {
return createProducer(producerInstance, swagger);
}
+
+ private Map retrieveVisibleMethods(Class> clazz) {
+ Map visibleMethods = new HashMap<>();
+ for (Method method : clazz.getMethods()) {
+ if (method.isAnnotationPresent(ApiOperation.class) &&
+ method.getAnnotation(ApiOperation.class).hidden()) {
+ continue;
+ }
+ visibleMethods.put(method.getName(), method);
+ }
+ return visibleMethods;
+ }
}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/engine/TestSwaggerEnvironment.java b/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/engine/TestSwaggerEnvironment.java
new file mode 100644
index 00000000000..6c79f799611
--- /dev/null
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/engine/TestSwaggerEnvironment.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017 Huawei Technologies Co., Ltd
+ *
+ * Licensed 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 io.servicecomb.engine;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import io.servicecomb.swagger.engine.SwaggerEnvironment;
+import io.servicecomb.swagger.engine.SwaggerProducer;
+import io.servicecomb.swagger.engine.bootstrap.BootstrapNormal;
+import io.servicecomb.swagger.invocation.models.ProducerImpl;
+
+public class TestSwaggerEnvironment {
+ private static SwaggerEnvironment env;
+
+ private static SwaggerProducer producer;
+
+ @BeforeClass
+ public static void init() {
+ env = new BootstrapNormal().boot();
+ producer = env.createProducer(new ProducerImpl());
+ }
+
+ @Test
+ public void ableToFindVisibleMethod() {
+ assertThat(producer.findOperation("visibleMethod"), is(notNullValue()));
+ }
+
+ @Test
+ public void unableToFindHiddenMethod() {
+ assertThat(producer.findOperation("hiddenMethod"), is(nullValue()));
+ }
+}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/models/ProducerImpl.java b/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/models/ProducerImpl.java
new file mode 100644
index 00000000000..f22e810018a
--- /dev/null
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/models/ProducerImpl.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017 Huawei Technologies Co., Ltd
+ *
+ * Licensed 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 io.servicecomb.swagger.invocation.models;
+
+import io.swagger.annotations.ApiOperation;
+
+public class ProducerImpl {
+ @ApiOperation(value = "", hidden = true)
+ public int hiddenMethod(int a) {
+ return a;
+ }
+
+ @ApiOperation(value = "")
+ public int visibleMethod(int a) {
+ return a;
+ }
+}