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; + } +}