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 9eea3827b3b4fd333766fee813bc0e77764501f7 Author: acsukesh <[email protected]> AuthorDate: Tue Jul 3 21:12:04 2018 +0530 [SCB-713] @DefaulValue should be set only when input param is null --- .../rest/codec/param/CookieProcessorCreator.java | 2 +- .../rest/codec/param/FormProcessorCreator.java | 4 +- .../rest/codec/param/HeaderProcessorCreator.java | 2 +- .../rest/codec/param/QueryProcessorCreator.java | 2 +- .../servicecomb/demo/jaxrs/client/JaxrsClient.java | 96 ++++++++++++++-- .../demo/jaxrs/server/DefaultValues.java | 48 -------- .../demo/jaxrs/server/JaxRSDefaultValues.java | 75 ++++++++++++ .../demo/springmvc/client/SpringmvcClient.java | 127 +++++++++++++-------- demo/demo-springmvc/springmvc-server/pom.xml | 5 +- .../springmvc/server/SpringMvcDefaultValues.java | 51 +++++++++ .../swagger/generator/core/OperationGenerator.java | 16 +-- .../parameter/AbstractParameterProcessor.java | 11 +- 12 files changed, 314 insertions(+), 125 deletions(-) diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/CookieProcessorCreator.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/CookieProcessorCreator.java index 47768c7..3ad7903 100644 --- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/CookieProcessorCreator.java +++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/CookieProcessorCreator.java @@ -50,7 +50,7 @@ public class CookieProcessorCreator implements ParamValueProcessorCreator { for (Cookie cookie : cookies) { if (paramPath.equals(cookie.getName())) { value = cookie.getValue(); - if (value == null || value.equals("")) { + if (value == null) { Object defaultValue = getDefaultValue(); if (defaultValue != null) { value = defaultValue.toString(); diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/FormProcessorCreator.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/FormProcessorCreator.java index 3605af5..81cf912 100644 --- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/FormProcessorCreator.java +++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/FormProcessorCreator.java @@ -45,7 +45,7 @@ public class FormProcessorCreator implements ParamValueProcessorCreator { public Object getValue(HttpServletRequest request) { @SuppressWarnings("unchecked") Map<String, Object> forms = (Map<String, Object>) request.getAttribute(RestConst.FORM_PARAMETERS); - if (forms != null) { + if (forms != null && !forms.isEmpty()) { return convertValue(forms.get(paramPath), targetType); } @@ -54,7 +54,7 @@ public class FormProcessorCreator implements ParamValueProcessorCreator { } Object value = request.getParameter(paramPath); - if (value == null || value.equals("")) { + if (value == null) { Object defaultValue = getDefaultValue(); if (defaultValue != null) { value = defaultValue; diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/HeaderProcessorCreator.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/HeaderProcessorCreator.java index 16b6056..52ea2b2 100644 --- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/HeaderProcessorCreator.java +++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/HeaderProcessorCreator.java @@ -56,7 +56,7 @@ public class HeaderProcessorCreator implements ParamValueProcessorCreator { value = Collections.list(headerValues); } else { value = request.getHeader(paramPath); - if (value == null || value.equals("")) { + if (value == null) { Object defaultValue = getDefaultValue(); if (defaultValue != null) { value = defaultValue; diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/QueryProcessorCreator.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/QueryProcessorCreator.java index 908f512..231b6c9 100644 --- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/QueryProcessorCreator.java +++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/QueryProcessorCreator.java @@ -44,7 +44,7 @@ public class QueryProcessorCreator implements ParamValueProcessorCreator { value = request.getParameterValues(paramPath); } else { value = request.getParameter(paramPath); - if (value == null || value.equals("")) { + if (value == null) { Object defaultValue = getDefaultValue(); if (defaultValue != null) { value = defaultValue; diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java index 64b4df8..8d31fee 100644 --- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java +++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java @@ -23,6 +23,7 @@ import java.util.Map; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response.Status; +import org.apache.http.HttpStatus; import org.apache.servicecomb.common.rest.codec.RestObjectMapper; import org.apache.servicecomb.core.Const; import org.apache.servicecomb.core.CseContext; @@ -34,11 +35,14 @@ import org.apache.servicecomb.demo.validator.Student; import org.apache.servicecomb.foundation.common.utils.BeanUtils; import org.apache.servicecomb.foundation.common.utils.Log4jUtils; import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder; +import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory; import org.apache.servicecomb.swagger.invocation.exception.InvocationException; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; public class JaxrsClient { @@ -63,7 +67,7 @@ public class JaxrsClient { testCompute(templateNew); testValidator(templateNew); testClientTimeOut(templateNew); - testDefaultValues(templateNew); + testJaxRSDefaultValues(templateNew); } private static void testCompute(RestTemplate template) throws Exception { @@ -100,24 +104,96 @@ public class JaxrsClient { } } - private static void testDefaultValues(RestTemplate template) throws Exception { + + private static void testJaxRSDefaultValues(RestTemplate template) { String microserviceName = "jaxrs"; for (String transport : DemoConst.transports) { CseContext.getInstance().getConsumerProviderManager().setTransport(microserviceName, transport); TestMgr.setMsg(microserviceName, transport); - String cseUrlPrefix = "cse://" + microserviceName + "/default/"; - - TestMgr.check("40", - template.getForObject(cseUrlPrefix + "/add", - String.class)); + String cseUrlPrefix = "cse://" + microserviceName + "/JaxRSDefaultValues/"; + + //default values + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED); + MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); + HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); + String result = template.postForObject(cseUrlPrefix + "/form", request, String.class); + TestMgr.check("Hello 20bobo", result); + + headers = new HttpHeaders(); + HttpEntity<String> entity = new HttpEntity<>(null, headers); + result = template.postForObject(cseUrlPrefix + "/header", entity, String.class); + TestMgr.check("Hello 20bobo30", result); + + result = template.getForObject(cseUrlPrefix + "/query?d=10", String.class); + TestMgr.check("Hello 20bobo4010", result); + boolean failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), ExceptionFactory.PRODUCER_INNER_STATUS_CODE); + } - TestMgr.check("hi test your age is : 20", - template.getForObject(cseUrlPrefix + "/sayhei", - String.class)); + failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query2?d=2&e=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(failed, true); + + failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query2?a=&d=2&e=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(failed, true); + result = template.getForObject(cseUrlPrefix + "/query2?d=30&e=2", String.class); + TestMgr.check("Hello 20bobo40302", result); + failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query3?a=2&b=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(failed, true); + + result = template.getForObject(cseUrlPrefix + "/query3?a=30&b=2", String.class); + TestMgr.check("Hello 302", result); + + //input values + headers = new HttpHeaders(); + headers.setContentType(org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED); + Map<String, String> params = new HashMap<String, String>(); + params.put("a", "30"); + params.put("b", "sam"); + HttpEntity<Map<String, String>> requestPara = new HttpEntity<>(params, headers); + result = template.postForObject(cseUrlPrefix + "/form", requestPara, String.class); + TestMgr.check("Hello 30sam", result); + + headers = new HttpHeaders(); + headers.add("a", "30"); + headers.add("b", "sam"); + headers.add("c", "40"); + entity = new HttpEntity<>(null, headers); + result = template.postForObject(cseUrlPrefix + "/header", entity, String.class); + TestMgr.check("Hello 30sam40", result); + + result = template.getForObject(cseUrlPrefix + "/query?a=3&b=sam&c=5&d=30", String.class); + TestMgr.check("Hello 3sam530", result); + + result = template.getForObject(cseUrlPrefix + "/query2?a=3&b=4&c=5&d=30&e=2", String.class); + TestMgr.check("Hello 345302", result); } + } diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/DefaultValues.java b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/DefaultValues.java deleted file mode 100644 index a3688ba..0000000 --- a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/DefaultValues.java +++ /dev/null @@ -1,48 +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.demo.jaxrs.server; - -import javax.validation.constraints.Min; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.FormParam; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; - -import org.apache.servicecomb.provider.rest.common.RestSchema; - -@RestSchema(schemaId = "default") -@Path("/default") -@Produces(MediaType.APPLICATION_JSON) -public class DefaultValues { - - @Path("/add") - @GET - public int add(@DefaultValue("20") @FormParam("a") int a, @DefaultValue("20") @Min(20) @FormParam("b") int b) { - return a + b; - } - - @Path("/sayhei") - @GET - public String sayHei(@DefaultValue("test") @QueryParam("name") String name, - @DefaultValue("20") @QueryParam("age") int age) { - return "hi " + name + " your age is : " + age; - } -} diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxRSDefaultValues.java b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxRSDefaultValues.java new file mode 100644 index 0000000..9a4159e --- /dev/null +++ b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxRSDefaultValues.java @@ -0,0 +1,75 @@ +package org.apache.servicecomb.demo.jaxrs.server; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.apache.servicecomb.provider.rest.common.RestSchema; + +@RestSchema(schemaId = "JaxRSDefaultValues") +@Path("/JaxRSDefaultValues") +@Produces(MediaType.APPLICATION_JSON) +public class JaxRSDefaultValues { + + @Path("/form") + @POST + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public String form(@DefaultValue("20") @FormParam("a") int a, @DefaultValue("bobo") @FormParam("b") String b) { + return "Hello " + a + b; + } + + @Path("/header") + @POST + public String header(@DefaultValue("20") @HeaderParam("a") int a, @DefaultValue("bobo") @HeaderParam("b") String b, + @DefaultValue("30") @HeaderParam("c") Integer c) { + return "Hello " + a + b + c; + } + + @Path("/query") + @GET + public String query(@DefaultValue("20") @QueryParam("a") int a, @DefaultValue("bobo") @QueryParam("b") String b, + @DefaultValue("40") @QueryParam("c") Integer c, @QueryParam("d") int d) { + return "Hello " + a + b + c + d; + } + + @Path("/query2") + @GET + public String query2(@QueryParam("e") int e, @DefaultValue("20") @QueryParam("a") int a, + @DefaultValue("bobo") @QueryParam("b") String b, + @DefaultValue("40") @QueryParam("c") Integer c, @Min(value = 20) @Max(value = 30) @QueryParam("d") int d) { + return "Hello " + a + b + c + d + e; + } + + @Path("/query3") + @GET + public String query3(@QueryParam("a") @Min(value = 20) int a, @QueryParam("b") String b) { + return "Hello " + a + b; + } + + @Path("/packages") + @GET + public String queryPackages(HttpServletRequest httpRequest, + @Max(value = 2147483647L) @Min(value = -1L) @NotNull @QueryParam("pageNo") Integer pageNo, + @Max(value = 2147483647L) @Min(value = -1L) @NotNull @QueryParam("pageSize") Integer pageSize, + @Size(max = 64, min = 0) @QueryParam("packageName") String packageName, + @Max(value = 127L) @Min(value = 0L) @QueryParam("packageType") Integer packageType, + @Max(value = 2147483647L) @Min(value = 1L) @QueryParam("roleID") Integer roleID, + @Max(value = 2147483647L) @Min(value = 1L) @QueryParam("categoryID") Integer categoryID, + @Max(value = 127L) @Min(value = 0L) @QueryParam("appType") @DefaultValue("1") Integer appType, + @Max(value = 2L) @Min(value = 1L) @QueryParam("packageScope") Integer packageScope) { + return "" + appType; + } + +} diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java index 50f4b92..c683862 100644 --- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java +++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java @@ -20,6 +20,7 @@ package org.apache.servicecomb.demo.springmvc.client; import java.util.HashMap; import java.util.Map; +import org.apache.http.HttpStatus; import org.apache.servicecomb.core.CseContext; import org.apache.servicecomb.demo.DemoConst; import org.apache.servicecomb.demo.TestMgr; @@ -30,10 +31,15 @@ import org.apache.servicecomb.foundation.common.utils.Log4jUtils; import org.apache.servicecomb.provider.springmvc.reference.CseRestTemplate; import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder; import org.apache.servicecomb.provider.springmvc.reference.UrlWithServiceNameClientHttpRequestFactory; +import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory; +import org.apache.servicecomb.swagger.invocation.exception.InvocationException; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import com.netflix.config.DynamicPropertyFactory; @@ -84,8 +90,7 @@ public class SpringmvcClient { testController(); - testDefaultValues(templateUrlWithServiceName, microserviceName); - testRequiredBody(templateUrlWithServiceName, microserviceName); + testSpringMvcDefaultValues(templateUrlWithServiceName, microserviceName); } HttpHeaders headers = new HttpHeaders(); headers.set("Accept-Encoding", "gzip"); @@ -220,53 +225,83 @@ public class SpringmvcClient { "newer"); } - private static void testDefaultValues(RestTemplate template, String microserviceName) { - String prefix = "cse://" + microserviceName; - TestMgr.check("hi test your age is : 20", - template.getForObject(prefix + "/annotations/sayhi", - String.class)); - - TestMgr.check("20", - template.getForObject(prefix + "/annotations/add", - String.class)); - - TestMgr.check("hei test", - template.getForObject(prefix + "/annotations/sayhei", - String.class)); - } - - private static void testRequiredBody(RestTemplate template, String microserviceName) { - String prefix = "cse://" + microserviceName; - Person user = new Person(); + private static void testSpringMvcDefaultValues(RestTemplate template, String microserviceName) { + String cseUrlPrefix = "cse://" + microserviceName + "/SpringMvcDefaultValues/"; + //default values + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); + HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); + String result = template.postForObject(cseUrlPrefix + "/form", request, String.class); + TestMgr.check("Hello 20bobo", result); + + headers = new HttpHeaders(); + HttpEntity<String> entity = new HttpEntity<>(null, headers); + result = template.postForObject(cseUrlPrefix + "/header", entity, String.class); + TestMgr.check("Hello 20bobo30", result); + + result = template.getForObject(cseUrlPrefix + "/query?d=10", String.class); + TestMgr.check("Hello 20bobo4010", result); + boolean failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), ExceptionFactory.PRODUCER_INNER_STATUS_CODE); + } - TestMgr.check("No user data found", - template.postForObject(prefix + "/annotations/saysomething?prefix={prefix}", - user, - String.class, - "ha")); + failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query2?d=2&e=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(failed, true); - user.setName("world"); - TestMgr.check("ha world", - template.postForObject(prefix + "/annotations/saysomething?prefix={prefix}", - user, - String.class, - "ha")); + failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query2?a=&d=2&e=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(failed, true); - TestMgr.check("No user data found", - template.postForObject(prefix + "/annotations/saysomething?prefix={prefix}", - null, - String.class, - "ha")); + result = template.getForObject(cseUrlPrefix + "/query2?d=30&e=2", String.class); + TestMgr.check("Hello 20bobo40302", result); - TestMgr.check("No user name found", - template.postForObject(prefix + "/annotations/say", - "", - String.class, - "ha")); - TestMgr.check("test", - template.postForObject(prefix + "/annotations/say", - "test", - String.class, - "ha")); + failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query3?a=2&b=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(failed, true); + + result = template.getForObject(cseUrlPrefix + "/query3?a=30&b=2", String.class); + TestMgr.check("Hello 302", result); + + //input values + headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity<Map<String, String>> requestPara = new HttpEntity<>(null, headers); + result = template.postForObject(cseUrlPrefix + "/form?a=30&b=sam", requestPara, String.class); + TestMgr.check("Hello 30sam", result); + + headers = new HttpHeaders(); + headers.add("a", "30"); + headers.add("b", "sam"); + headers.add("c", "40"); + entity = new HttpEntity<>(null, headers); + result = template.postForObject(cseUrlPrefix + "/header", entity, String.class); + TestMgr.check("Hello 30sam40", result); + + result = template.getForObject(cseUrlPrefix + "/query?a=3&b=sam&c=5&d=30", String.class); + TestMgr.check("Hello 3sam530", result); + + result = template.getForObject(cseUrlPrefix + "/query2?a=3&b=4&c=5&d=30&e=2", String.class); + TestMgr.check("Hello 345302", result); } } diff --git a/demo/demo-springmvc/springmvc-server/pom.xml b/demo/demo-springmvc/springmvc-server/pom.xml index 57073c1..dd3f879 100644 --- a/demo/demo-springmvc/springmvc-server/pom.xml +++ b/demo/demo-springmvc/springmvc-server/pom.xml @@ -37,7 +37,10 @@ <groupId>org.apache.servicecomb</groupId> <artifactId>provider-springmvc</artifactId> </dependency> - + <dependency> + <groupId>org.apache.servicecomb</groupId> + <artifactId>swagger-invocation-validator</artifactId> + </dependency> <dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>metrics-prometheus</artifactId> diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/SpringMvcDefaultValues.java b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/SpringMvcDefaultValues.java new file mode 100644 index 0000000..a67d8b2 --- /dev/null +++ b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/SpringMvcDefaultValues.java @@ -0,0 +1,51 @@ +package org.apache.servicecomb.demo.springmvc.server; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.ws.rs.core.MediaType; + +import org.apache.servicecomb.provider.rest.common.RestSchema; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@RestSchema(schemaId = "SpringMvcDefaultValues") +@RequestMapping(path = "/springmvc/SpringMvcDefaultValues", produces = MediaType.APPLICATION_JSON) +public class SpringMvcDefaultValues { + + @PostMapping(path = "/form", consumes = MediaType.APPLICATION_FORM_URLENCODED) + public String form(@RequestParam(name = "a", defaultValue = "20") int a, + @RequestParam(name = "b", defaultValue = "bobo") String b) { + return "Hello " + a + b; + } + + @PostMapping(path = "/header") + public String header(@RequestHeader(name = "a", defaultValue = "20") int a, + @RequestHeader(name = "b", defaultValue = "bobo") String b, + @RequestHeader(name = "c", defaultValue = "30") Integer c) { + return "Hello " + a + b + c; + } + + @GetMapping("/query") + public String query(@RequestParam(name = "a", defaultValue = "20") int a, + @RequestParam(name = "b", defaultValue = "bobo") String b, + @RequestParam(name = "c", defaultValue = "40") Integer c, @RequestParam(name = "d") int d) { + return "Hello " + a + b + c + d; + } + + @GetMapping("/query2") + public String query2(@RequestParam("e") int e, @RequestParam(name = "a", defaultValue = "20") int a, + @RequestParam(name = "b", defaultValue = "bobo") String b, + @RequestParam(name = "c", defaultValue = "40") Integer c, + @Min(value = 20) @Max(value = 30) @RequestParam("d") int d) { + return "Hello " + a + b + c + d + e; + } + + @GetMapping("/query3") + public String query3(@RequestParam("a") @Min(value = 20) int a, @RequestParam("b") String b) { + return "Hello " + a + b; + } + +} diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java index 49fa2a1..40edc67 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java @@ -39,6 +39,7 @@ import io.swagger.models.Operation; import io.swagger.models.Path; import io.swagger.models.Response; import io.swagger.models.Swagger; +import io.swagger.models.parameters.AbstractSerializableParameter; import io.swagger.models.parameters.Parameter; import io.swagger.models.properties.Property; import io.swagger.util.ReflectionUtils; @@ -74,8 +75,6 @@ public class OperationGenerator { protected String httpMethod; - protected String defaultValue; - public OperationGenerator(SwaggerGenerator swaggerGenerator, Method providerMethod) { this.swaggerGenerator = swaggerGenerator; this.swagger = swaggerGenerator.swagger; @@ -277,18 +276,25 @@ public class OperationGenerator { } protected void processByParameterAnnotation(Annotation[] paramAnnotations, int paramIdx) { + String defaultValue = null; + Parameter parameter = null; for (Annotation annotation : paramAnnotations) { //JAX-RS default value cannot be mapped to parameter name directly, stored it to map with the actual parameter if (annotation instanceof DefaultValue) { - this.defaultValue = ((DefaultValue) annotation).value(); + defaultValue = ((DefaultValue) annotation).value(); } else { ParameterAnnotationProcessor processor = context.findParameterAnnotationProcessor(annotation.annotationType()); if (processor != null) { processor.process(annotation, this, paramIdx); + parameter = this.providerParameters.get(this.providerParameters.size() - 1); } } } + if (parameter instanceof AbstractSerializableParameter && defaultValue != null) { + ((AbstractSerializableParameter<?>) parameter).setDefaultValue(defaultValue); + } + } protected void processByParameterType(Type parameterType, int paramIdx) { @@ -376,8 +382,4 @@ public class OperationGenerator { } pathObj.set(httpMethod, operation); } - - public String getDefaultValue() { - return defaultValue; - } } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java index 3cba80a..da3d14b 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java @@ -39,7 +39,7 @@ public abstract class AbstractParameterProcessor<T extends AbstractSerializableP T parameter) { setParameterName(annotation, operationGenerator, paramIdx, parameter); setParameterType(operationGenerator, paramIdx, parameter); - setParameterDefaultValue(annotation, operationGenerator, parameter); + setParameterDefaultValue(annotation, parameter); } protected void setParameterType(OperationGenerator operationGenerator, int paramIdx, @@ -57,15 +57,10 @@ public abstract class AbstractParameterProcessor<T extends AbstractSerializableP parameter.setName(paramName); } - protected void setParameterDefaultValue(Object annotation, OperationGenerator operationGenerator, T parameter) { - String defaultValue = operationGenerator.getDefaultValue(); - if (StringUtils.isNotEmpty(defaultValue)) { - parameter.setDefaultValue(defaultValue); - } else { - defaultValue = getAnnotationParameterDefaultValue(annotation); + protected void setParameterDefaultValue(Object annotation, T parameter) { + String defaultValue = getAnnotationParameterDefaultValue(annotation); if (StringUtils.isNotEmpty(defaultValue)) { parameter.setDefaultValue(defaultValue); - } } }
