¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * 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 feign.MethodMetadata; |
| | | 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.cloud.openfeign.AnnotatedParameterProcessor; |
| | | import org.springframework.cloud.openfeign.support.SpringMvcContract; |
| | | import org.springframework.core.annotation.AnnotatedElementUtils; |
| | | import org.springframework.core.convert.ConversionService; |
| | | import org.springframework.http.HttpHeaders; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | |
| | | import java.lang.annotation.Annotation; |
| | | import java.lang.reflect.Method; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æ¯æ blade-boot ç çæ¬ å¤ç |
| | | * |
| | | * @see org.springblade.core.cloud.annotation.UrlVersion |
| | | * @see org.springblade.core.cloud.annotation.ApiVersion |
| | | * @author L.cm |
| | | */ |
| | | public class BladeSpringMvcContract extends SpringMvcContract { |
| | | |
| | | public BladeSpringMvcContract(List<AnnotatedParameterProcessor> annotatedParameterProcessors, ConversionService conversionService) { |
| | | super(annotatedParameterProcessors, conversionService); |
| | | } |
| | | |
| | | @Override |
| | | protected void processAnnotationOnMethod(MethodMetadata data, Annotation methodAnnotation, Method method) { |
| | | if (RequestMapping.class.isInstance(methodAnnotation) || methodAnnotation.annotationType().isAnnotationPresent(RequestMapping.class)) { |
| | | Class<?> targetType = method.getDeclaringClass(); |
| | | // url ä¸ççæ¬ï¼ä¼å
è·åæ¹æ³ä¸ççæ¬ |
| | | UrlVersion urlVersion = AnnotatedElementUtils.findMergedAnnotation(method, UrlVersion.class); |
| | | // 忬¡å°è¯ç±»ä¸ççæ¬ |
| | | if (urlVersion == null || StringUtil.isBlank(urlVersion.value())) { |
| | | urlVersion = AnnotatedElementUtils.findMergedAnnotation(targetType, UrlVersion.class); |
| | | } |
| | | if (urlVersion != null && StringUtil.isNotBlank(urlVersion.value())) { |
| | | String versionUrl = "/" + urlVersion.value(); |
| | | data.template().uri(versionUrl); |
| | | } |
| | | |
| | | // 注æï¼å¨ç¶ç±»ä¹å æ·»å urlçæ¬ï¼å¨ç¶ç±»ä¹åï¼å¤ç Media Types çæ¬ |
| | | super.processAnnotationOnMethod(data, methodAnnotation, method); |
| | | |
| | | // å¤ç Media Types çæ¬ä¿¡æ¯ |
| | | ApiVersion apiVersion = AnnotatedElementUtils.findMergedAnnotation(method, ApiVersion.class); |
| | | // 忬¡å°è¯ç±»ä¸ççæ¬ |
| | | if (apiVersion == null || StringUtil.isBlank(apiVersion.value())) { |
| | | apiVersion = AnnotatedElementUtils.findMergedAnnotation(targetType, ApiVersion.class); |
| | | } |
| | | if (apiVersion != null && StringUtil.isNotBlank(apiVersion.value())) { |
| | | BladeMediaType bladeMediaType = new BladeMediaType(apiVersion.value()); |
| | | data.template().header(HttpHeaders.ACCEPT, bladeMediaType.toString()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åèï¼https://gist.github.com/rmfish/0ed59a9af6c05157be2a60c9acea2a10 |
| | | * @param annotations 注解 |
| | | * @param paramIndex åæ°ç´¢å¼ |
| | | * @return æ¯å¦ http 注解 |
| | | */ |
| | | @Override |
| | | protected boolean processAnnotationsOnParameter(MethodMetadata data, Annotation[] annotations, int paramIndex) { |
| | | boolean httpAnnotation = super.processAnnotationsOnParameter(data, annotations, paramIndex); |
| | | // å¨ springMvc ä¸å¦ææ¯ Get 请æ±ä¸åæ°ä¸æ¯å¯¹è±¡ 没æå£°æä¸º@RequestBody åé»è®¤ä¸º Param |
| | | if (!httpAnnotation && StringPool.GET.equals(data.template().method().toUpperCase())) { |
| | | for (Annotation parameterAnnotation : annotations) { |
| | | if (!(parameterAnnotation instanceof RequestBody)) { |
| | | return false; |
| | | } |
| | | } |
| | | data.queryMapIndex(paramIndex); |
| | | return true; |
| | | } |
| | | return httpAnnotation; |
| | | } |
| | | } |