下面列出了org.springframework.core.MethodParameter#hasMethodAnnotation ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* 有WxAsyncMessage注解且
* 返回值是WxMessage的子类
* 或者是CharSequence的子类,且有注解WxButton或者WXMessageMapping
* 这里其实应该判断反向的,即不需要Async发送的。只有几个用户类型的消息不需要异步发送
*
* @param returnType
* @return result
*/
@Deprecated
public boolean supportsReturnTypeOld(MethodParameter returnType) {
// 如果是iterable或者array,都只能作为asyncMessage消息处理
boolean isIterableType = Iterable.class.isAssignableFrom(returnType.getParameterType());
boolean isArrayType = returnType.getParameterType().isArray();
// 如果是群发消息,只能作为asyncMessage消息处理
boolean isGroupMessage = WxGroupMessage.class.isAssignableFrom(returnType.getParameterType());
// 如果是模板消息,只能作为asyncMessage消息处理
boolean isTemplateMessage = WxTemplateMessage.class.isAssignableFrom(returnType.getParameterType());
// 如果是模板消息,只能作为asyncMessage消息处理
boolean isMiniProgramMessage = WxUserMessage.MiniProgram.class.isAssignableFrom(returnType.getParameterType());
// 理论上WxAsyncMessage已经被上层处理过了,这里保险起见再处理一次
boolean needAsyncSend = isIterableType || isArrayType || isGroupMessage || isTemplateMessage || isMiniProgramMessage;
Class realType = getGenericType(returnType);
boolean isWxMessage = WxMessage.class.isAssignableFrom(realType);
boolean isWxStringMessage = CharSequence.class.isAssignableFrom(realType) &&
returnType.hasMethodAnnotation(WxMapping.class);
return needAsyncSend && (isWxMessage || isWxStringMessage);
}
@Override
public boolean supports(MethodParameter returnType,
Class<? extends HttpMessageConverter<?>> converterType) {
return StringHttpMessageConverter.class.isAssignableFrom(converterType) &&
CharSequence.class.isAssignableFrom(returnType.getParameterType()) &&
returnType.hasMethodAnnotation(WxMapping.class);
}
@Override
public boolean supports(HandlerResult result) {
MethodParameter returnType = result.getReturnTypeSource();
Class<?> containingClass = returnType.getContainingClass();
return (AnnotatedElementUtils.hasAnnotation(containingClass, ResponseBody.class) ||
returnType.hasMethodAnnotation(ResponseBody.class));
}
@Override
protected boolean supportsReturnTypeInternal(MethodParameter returnType) {
// 是否显式声明为async了,如果是则直接异步发送
boolean isAsyncMessage = returnType.hasMethodAnnotation(WxAsyncMessage.class);
// 是否是WxMapping,如果声明为wxMapping,则直接异步发送(因为这种类型没有必要同步,报错了还会返回到客户端提示异常,不友好)
boolean isWxMapping = returnType.hasMethodAnnotation(WxMapping.class);
return isAsyncMessage || isWxMapping;
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
if (returnType.hasMethodAnnotation(WxMapping.class)) {
return false;
}
ResolvableType resolvableType = ResolvableType.forMethodParameter(returnType);
ResolvableType arrayType = ResolvableType.forArrayComponent(ResolvableType.forClass(WxMessage.class));
ResolvableType iterableType = ResolvableType.forClassWithGenerics(Iterable.class, WxMessage.class);
return arrayType.isAssignableFrom(resolvableType) || iterableType.isAssignableFrom(resolvableType);
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return (returnType.hasMethodAnnotation(SendTo.class) ||
AnnotatedElementUtils.hasAnnotation(returnType.getDeclaringClass(), SendTo.class) ||
returnType.hasMethodAnnotation(SendToUser.class) ||
AnnotatedElementUtils.hasAnnotation(returnType.getDeclaringClass(), SendToUser.class) ||
!this.annotationRequired);
}
@Override
public boolean supports(HandlerResult result) {
MethodParameter returnType = result.getReturnTypeSource();
Class<?> containingClass = returnType.getContainingClass();
return (AnnotatedElementUtils.hasAnnotation(containingClass, ResponseBody.class) ||
returnType.hasMethodAnnotation(ResponseBody.class));
}
@Override
protected boolean supportsReturnTypeInternal(MethodParameter returnType) {
// 是否显式声明为async了,如果是不从这里发送
boolean isAsyncMessage = returnType.hasMethodAnnotation(WxAsyncMessage.class);
// 是否是WxMapping,如果声明为wxMapping,则不通过这里而是直接异步发送
// 理论上可控制顺序来控制这里的判断减少,但是稳妥起见多判断一次
boolean isWxMapping = returnType.hasMethodAnnotation(WxMapping.class);
Class realType = getGenericType(returnType);
// 对于非WxMapping的handler,判断返回类型是否是WxMessage,如果是则同步发送消息
boolean isWxMessage = WxMessage.class.isAssignableFrom(realType);
return !isAsyncMessage && !isWxMapping && isWxMessage;
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return (returnType.hasMethodAnnotation(SubscribeMapping.class) &&
!returnType.hasMethodAnnotation(SendTo.class) &&
!returnType.hasMethodAnnotation(SendToUser.class));
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) ||
returnType.hasMethodAnnotation(ResponseBody.class));
}
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return returnType.hasMethodAnnotation(ResponseBody.class);
}
@Override
public boolean supportsReturnType(MethodParameter methodParameter) {
return methodParameter.hasMethodAnnotation(ExcelRead.class);
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return (returnType.hasMethodAnnotation(SubscribeMapping.class) &&
!returnType.hasMethodAnnotation(SendTo.class) &&
!returnType.hasMethodAnnotation(SendToUser.class));
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return returnType.hasMethodAnnotation(WxMapping.class);
}
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return super.supports(returnType, converterType) && returnType.hasMethodAnnotation(JsonView.class);
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) ||
returnType.hasMethodAnnotation(ResponseBody.class));
}
/**
* Return {@code true} if there is a method-level {@code @ModelAttribute}
* or, in default resolution mode, for any return value type that is not
* a simple type.
*/
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return (returnType.hasMethodAnnotation(ModelAttribute.class) ||
(this.annotationNotRequired && !BeanUtils.isSimpleProperty(returnType.getParameterType())));
}
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return super.supports(returnType, converterType) && returnType.hasMethodAnnotation(JsonView.class);
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) ||
returnType.hasMethodAnnotation(ResponseBody.class));
}
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return FastJsonHttpMessageConverter.class.isAssignableFrom(converterType)
&&
(returnType.getContainingClass().isAnnotationPresent(ResponseJSONP.class) || returnType.hasMethodAnnotation(ResponseJSONP.class));
}