From 4f2ebdcd31c0df8f17ac3c711baf8164ee4b71a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johnny=20Miller=20=28=E9=94=BA=E4=BF=8A=29?= Date: Fri, 25 Dec 2020 17:30:07 +0800 Subject: [PATCH] feat($Starter): provide exposing HTTP resources --- .../src/main/resources/application.yml | 1 + .../HttpApiResourcesResponse.java | 23 +++++++++ .../src/main/resources/application.yml | 1 + muscle-mis/src/main/resources/application.yml | 1 + .../src/main/resources/application.yml | 2 +- .../src/main/resources/application.yml | 1 + .../configuration/MafAutoConfiguration.java | 8 ++++ .../configuration/MafConfiguration.java | 8 +++- .../HttpApiResourceRemoteApiController.java | 47 +++++++++++++++++++ 9 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.java create mode 100644 spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/controller/HttpApiResourceRemoteApiController.java diff --git a/auth-center/src/main/resources/application.yml b/auth-center/src/main/resources/application.yml index bb18c8b0..87464206 100644 --- a/auth-center/src/main/resources/application.yml +++ b/auth-center/src/main/resources/application.yml @@ -119,3 +119,4 @@ maf: - "/*/v2/api-docs/**" - "/webjars/**" - "/doc.html" + included-package-for-http-api-scan: ${project.property.base-package} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.java new file mode 100644 index 00000000..e104b0a8 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.java @@ -0,0 +1,23 @@ +package com.jmsoftware.maf.common.domain.springbootstarter; + +import com.google.common.collect.Lists; +import lombok.Data; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.util.List; + +/** + * Description: HttpApiResourcesResponse, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/25/2020 4:58 PM + **/ +@Data +public class HttpApiResourcesResponse { + private List list = Lists.newLinkedList(); + + @Data + public static class HttpApiResource { + private RequestMethod method; + private String urlPattern; + } +} diff --git a/exercise-mis/src/main/resources/application.yml b/exercise-mis/src/main/resources/application.yml index 5de98c29..21dbff0f 100644 --- a/exercise-mis/src/main/resources/application.yml +++ b/exercise-mis/src/main/resources/application.yml @@ -112,3 +112,4 @@ maf: - "/*/v2/api-docs/**" - "/webjars/**" - "/doc.html" + included-package-for-http-api-scan: ${project.property.base-package} diff --git a/muscle-mis/src/main/resources/application.yml b/muscle-mis/src/main/resources/application.yml index b5d8ab75..ba8c6145 100644 --- a/muscle-mis/src/main/resources/application.yml +++ b/muscle-mis/src/main/resources/application.yml @@ -100,3 +100,4 @@ maf: - "/*/v2/api-docs/**" - "/webjars/**" - "/doc.html" + included-package-for-http-api-scan: ${project.property.base-package} diff --git a/service-registry/src/main/resources/application.yml b/service-registry/src/main/resources/application.yml index f92a0545..6a3f808f 100644 --- a/service-registry/src/main/resources/application.yml +++ b/service-registry/src/main/resources/application.yml @@ -53,4 +53,4 @@ maf: ignored-url: pattern: - "/actuator/**" - super-user: "admin" + included-package-for-http-api-scan: ${project.property.base-package} diff --git a/spring-boot-admin/src/main/resources/application.yml b/spring-boot-admin/src/main/resources/application.yml index 7a5e7d69..4c54d8b4 100644 --- a/spring-boot-admin/src/main/resources/application.yml +++ b/spring-boot-admin/src/main/resources/application.yml @@ -75,3 +75,4 @@ maf: - "/*/v2/api-docs/**" - "/webjars/**" - "/doc.html" + included-package-for-http-api-scan: ${project.property.base-package} diff --git a/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/configuration/MafAutoConfiguration.java b/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/configuration/MafAutoConfiguration.java index a68fcab7..2c288dd3 100644 --- a/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/configuration/MafAutoConfiguration.java +++ b/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/configuration/MafAutoConfiguration.java @@ -3,6 +3,7 @@ import com.jmsoftware.maf.springbootstarter.aspect.ExceptionControllerAdvice; import com.jmsoftware.maf.springbootstarter.aspect.WebRequestLogAspect; import com.jmsoftware.maf.springbootstarter.controller.GlobalErrorController; +import com.jmsoftware.maf.springbootstarter.controller.HttpApiResourceRemoteApiController; import com.jmsoftware.maf.springbootstarter.controller.RedirectController; import com.jmsoftware.maf.springbootstarter.filter.AccessLogFilter; import com.jmsoftware.maf.springbootstarter.helper.HttpApiScanHelper; @@ -107,4 +108,11 @@ public HttpApiScanHelper httpApiScanHelper(RequestMappingHandlerMapping requestM log.warn("Initial bean: {}", HttpApiScanHelper.class.getName()); return new HttpApiScanHelper(requestMappingHandlerMapping); } + + @Bean + public HttpApiResourceRemoteApiController httpApiResourceRemoteController(MafConfiguration mafConfiguration, + HttpApiScanHelper httpApiScanHelper) { + log.warn("Initial bean: {}", HttpApiResourceRemoteApiController.class.getName()); + return new HttpApiResourceRemoteApiController(mafConfiguration, httpApiScanHelper); + } } diff --git a/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/configuration/MafConfiguration.java b/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/configuration/MafConfiguration.java index c725e883..cf434c75 100644 --- a/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/configuration/MafConfiguration.java +++ b/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/configuration/MafConfiguration.java @@ -33,7 +33,7 @@ public class MafConfiguration { @NotBlank private String superUser = "admin"; /** - * Ignore URLs + * Ignore URLs, used by web access log filter and web security. */ @Valid private IgnoredUrl ignoredUrl; @@ -50,7 +50,11 @@ public class MafConfiguration { */ @NotNull private Boolean webRequestLogDisabled = false; - + /** + * Included package for http api scan, could be base package + */ + @NotBlank + private String includedPackageForHttpApiScan; /** * Flatten ignored urls string [ ]. * diff --git a/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/controller/HttpApiResourceRemoteApiController.java b/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/controller/HttpApiResourceRemoteApiController.java new file mode 100644 index 00000000..b5e92fc1 --- /dev/null +++ b/spring-boot-starter/src/main/java/com/jmsoftware/maf/springbootstarter/controller/HttpApiResourceRemoteApiController.java @@ -0,0 +1,47 @@ +package com.jmsoftware.maf.springbootstarter.controller; + +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse; +import com.jmsoftware.maf.springbootstarter.configuration.MafConfiguration; +import com.jmsoftware.maf.springbootstarter.helper.HttpApiScanHelper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.val; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Optional; + +/** + * Description: HttpApiResourceRemoteApiController, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/25/2020 4:33 PM + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = {"HTTP API Resource Remote API"}) +public class HttpApiResourceRemoteApiController { + private final MafConfiguration mafConfiguration; + private final HttpApiScanHelper httpApiScanHelper; + + @GetMapping("/http-api-resources") + @ApiOperation(value = "Get HTTP API resources", notes = "Get HTTP API resources (Remote)") + public ResponseBodyBean getHttpApiResource() { + val handlerMethodMap = httpApiScanHelper.scan(mafConfiguration.getIncludedPackageForHttpApiScan()); + HttpApiResourcesResponse response = new HttpApiResourcesResponse(); + handlerMethodMap.forEach((requestMappingInfo, handlerMethod) -> { + val requestMethod = Optional.ofNullable( + new ArrayList<>(requestMappingInfo.getMethodsCondition().getMethods()).get(0)) + .orElseThrow(() -> new RuntimeException("Request method mustn't be null!")); + val httpApiResource = new HttpApiResourcesResponse.HttpApiResource(); + httpApiResource.setMethod(requestMethod); + httpApiResource.setUrlPattern( + new LinkedList<>(requestMappingInfo.getPatternsCondition().getPatterns()).get(0)); + response.getList().add(httpApiResource); + }); + return ResponseBodyBean.ofSuccess(response); + } +}