¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * Copyright (c) 2018-2028, DreamLu All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * Redistributions in binary form must reproduce the above copyright |
| | | * notice, this list of conditions and the following disclaimer in the |
| | | * documentation and/or other materials provided with the distribution. |
| | | * Neither the name of the dreamlu.net developer nor the names of its |
| | | * contributors may be used to endorse or promote products derived from |
| | | * this software without specific prior written permission. |
| | | * Author: DreamLu 墿¥æ¢¦ (596392912@qq.com) |
| | | */ |
| | | package org.springblade.core.cloud.version; |
| | | |
| | | import org.springblade.core.cloud.annotation.ApiVersion; |
| | | import org.springblade.core.cloud.annotation.UrlVersion; |
| | | import org.springblade.core.tool.utils.StringPool; |
| | | import org.springblade.core.tool.utils.StringUtil; |
| | | import org.springframework.core.annotation.AnnotatedElementUtils; |
| | | import org.springframework.lang.Nullable; |
| | | import org.springframework.web.method.HandlerMethod; |
| | | import org.springframework.web.servlet.mvc.method.RequestMappingInfo; |
| | | import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; |
| | | |
| | | import java.lang.reflect.Method; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * urlçæ¬å·å¤ç å header çæ¬å¤ç |
| | | * |
| | | * <p> |
| | | * url: /v1/user/{id} |
| | | * header: Accept application/vnd.blade.VERSION+json |
| | | * </p> |
| | | * |
| | | * 注æï¼c 代表客æ·ç«¯çæ¬ |
| | | * |
| | | * @author L.cm |
| | | */ |
| | | public class BladeRequestMappingHandlerMapping extends RequestMappingHandlerMapping { |
| | | |
| | | @Nullable |
| | | @Override |
| | | protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) { |
| | | RequestMappingInfo mappinginfo = super.getMappingForMethod(method, handlerType); |
| | | if (mappinginfo != null) { |
| | | RequestMappingInfo apiVersionMappingInfo = getApiVersionMappingInfo(method, handlerType); |
| | | return apiVersionMappingInfo == null ? mappinginfo : apiVersionMappingInfo.combine(mappinginfo); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | @Nullable |
| | | private RequestMappingInfo getApiVersionMappingInfo(Method method, Class<?> handlerType) { |
| | | // url ä¸ççæ¬ï¼ä¼å
è·åæ¹æ³ä¸ççæ¬ |
| | | UrlVersion urlVersion = AnnotatedElementUtils.findMergedAnnotation(method, UrlVersion.class); |
| | | // 忬¡å°è¯ç±»ä¸ççæ¬ |
| | | if (urlVersion == null || StringUtil.isBlank(urlVersion.value())) { |
| | | urlVersion = AnnotatedElementUtils.findMergedAnnotation(handlerType, UrlVersion.class); |
| | | } |
| | | // Media Types çæ¬ä¿¡æ¯ |
| | | ApiVersion apiVersion = AnnotatedElementUtils.findMergedAnnotation(method, ApiVersion.class); |
| | | // 忬¡å°è¯ç±»ä¸ççæ¬ |
| | | if (apiVersion == null || StringUtil.isBlank(apiVersion.value())) { |
| | | apiVersion = AnnotatedElementUtils.findMergedAnnotation(handlerType, ApiVersion.class); |
| | | } |
| | | boolean nonUrlVersion = urlVersion == null || StringUtil.isBlank(urlVersion.value()); |
| | | boolean nonApiVersion = apiVersion == null || StringUtil.isBlank(apiVersion.value()); |
| | | // å
夿忶ä¸çº¯å¨ |
| | | if (nonUrlVersion && nonApiVersion) { |
| | | return null; |
| | | } |
| | | // 妿 header çæ¬ä¸åå¨ |
| | | RequestMappingInfo.Builder mappingInfoBuilder = null; |
| | | if (nonApiVersion) { |
| | | mappingInfoBuilder = RequestMappingInfo.paths(urlVersion.value()); |
| | | } else { |
| | | mappingInfoBuilder = RequestMappingInfo.paths(StringPool.EMPTY); |
| | | } |
| | | // 妿urlçæ¬ä¸åå¨ |
| | | if (nonUrlVersion) { |
| | | String vsersionMediaTypes = new BladeMediaType(apiVersion.value()).toString(); |
| | | mappingInfoBuilder.produces(vsersionMediaTypes); |
| | | } |
| | | return mappingInfoBuilder.build(); |
| | | } |
| | | |
| | | @Override |
| | | protected void handlerMethodsInitialized(Map<RequestMappingInfo, HandlerMethod> handlerMethods) { |
| | | // æå°è·¯ç±ä¿¡æ¯ spring boot 2.1 廿äºè¿ä¸ª æ¥å¿çæå° |
| | | if (logger.isInfoEnabled()) { |
| | | for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : handlerMethods.entrySet()) { |
| | | RequestMappingInfo mapping = entry.getKey(); |
| | | HandlerMethod handlerMethod = entry.getValue(); |
| | | logger.info("Mapped \"" + mapping + "\" onto " + handlerMethod); |
| | | } |
| | | } |
| | | super.handlerMethodsInitialized(handlerMethods); |
| | | } |
| | | } |