All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mxixm.fastboot.weixin.config.invoker.WxInvokerConfiguration Maven / Gradle / Ivy

The newest version!
package com.mxixm.fastboot.weixin.config.invoker;

import com.mxixm.fastboot.weixin.common.WxBeans;
import com.mxixm.fastboot.weixin.config.WxProperties;
import com.mxixm.fastboot.weixin.controller.invoker.WxApiInvokeSpi;
import com.mxixm.fastboot.weixin.controller.invoker.WxInvokerProxyFactory;
import com.mxixm.fastboot.weixin.controller.invoker.common.WxHttpInputMessageConverter;
import com.mxixm.fastboot.weixin.controller.invoker.component.WxApiHttpRequestFactory;
import com.mxixm.fastboot.weixin.controller.invoker.executor.WxApiExecutor;
import com.mxixm.fastboot.weixin.controller.invoker.executor.WxApiInvoker;
import com.mxixm.fastboot.weixin.controller.invoker.handler.WxResponseErrorHandler;
import com.mxixm.fastboot.weixin.module.token.WxTokenServer;
import com.mxixm.fastboot.weixin.support.DefaultWxUserProvider;
import com.mxixm.fastboot.weixin.support.WxAccessTokenManager;
import com.mxixm.fastboot.weixin.support.WxUserProvider;
import com.mxixm.fastboot.weixin.util.WxContextUtils;
import com.mxixm.fastboot.weixin.web.WxUserManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.lang.invoke.MethodHandles;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Configuration
@ConditionalOnClass(RestTemplate.class)
public class WxInvokerConfiguration {

	private static final Log logger = LogFactory.getLog(MethodHandles.lookup().lookupClass());

	private final WxProperties wxProperties;

	private final ObjectProvider messageConverters;

	public WxInvokerConfiguration(
			WxProperties wxProperties,
			ObjectProvider messageConverters) {
		this.wxProperties = wxProperties;
		this.messageConverters = messageConverters;
	}

	@Bean
	public WxContextUtils wxApplicationContextUtils() {
		return new WxContextUtils();
	}

	/**
	 * 是否有必要模仿Spring不提供RestTemplate,只提供RestTemplateBuilder
	 * @return dummy
     */
	@Bean(name = WxBeans.WX_API_INVOKER_NAME)
	public WxApiInvoker wxApiInvoker() {
		RestTemplateBuilder builder = new RestTemplateBuilder();
		builder = builder.requestFactory(new WxApiHttpRequestFactory(wxProperties))
				.errorHandler(new WxResponseErrorHandler());
		HttpMessageConverters converters = this.messageConverters.getIfUnique();
		List> converterList = new ArrayList<>();
		// 加入默认转换
		converterList.add(new WxHttpInputMessageConverter());
		if (converters != null) {
			converterList.addAll(converters.getConverters());
			builder = builder.messageConverters(Collections.unmodifiableList(converterList));
		}
		return new WxApiInvoker(builder.build());
	}

	/*
		┌─────┐
	|  wxInvokerProxyFactory defined in class path resource [com/example/myproject/config/invoker/WxInvokerConfiguration.class]
	↑     ↓
	|  wxApiExecutor defined in class path resource [com/example/myproject/config/invoker/WxInvokerConfiguration.class]
	↑     ↓
	|  org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$EnableWebMvcConfiguration
	↑     ↓
	|  wxButtonArgumentResolver defined in class path resource [com/example/myproject/config/server/WxBuildinMvcConfiguration.class]
	↑     ↓
	|  defaultWxUserProvider (field private com.example.myproject.controller.invoker.WxApiInvokeSpi com.example.myproject.support.DefaultWxUserProvider.wxApiInvokeSpi)
	└─────┘
	 */
	/**
	 * 这里之前引用了conversionService,这个conversionService是在WxMvcConfigurer时初始化的
	 * 于是产生了循环依赖
	 * @param wxAccessTokenManager
	 * @return dummy
	 */
	@Bean
	public WxApiExecutor wxApiExecutor(WxAccessTokenManager wxAccessTokenManager) {
		return new WxApiExecutor(wxApiInvoker(), wxAccessTokenManager);
	}

	@Bean
	public WxInvokerProxyFactory wxInvokerProxyFactory(WxApiExecutor wxApiExecutor) {
		return new WxInvokerProxyFactory(WxApiInvokeSpi.class, wxProperties, wxApiExecutor);
	}


	@Bean
	@ConditionalOnMissingBean
	public WxUserProvider userProvider(WxUserManager wxUserManager) {
		return new DefaultWxUserProvider(wxUserManager);
	}

	@Bean
	public WxUserManager wxUserManager(@Lazy WxTokenServer wxTokenServer, @Lazy WxApiInvokeSpi wxApiInvokeSpi) {
		return new WxUserManager(wxTokenServer, wxApiInvokeSpi);
	}

	/**
	 * 只考虑微信的消息转换,后期可以优化
	 * 其实这里完全可以使用系统的Bean,但是这里我想特殊处理,只对微信消息做转换,所以定制化了几个converter
	 * @return dummy
	 */
	private HttpMessageConverters getDefaultWxMessageConverters() {
		StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
		stringConverter.setWriteAcceptCharset(false);
		MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
		Jaxb2RootElementHttpMessageConverter xmlConverter = new Jaxb2RootElementHttpMessageConverter();
		AllEncompassingFormHttpMessageConverter formConverter = new AllEncompassingFormHttpMessageConverter();
		ResourceHttpMessageConverter resourceConverter = new ResourceHttpMessageConverter();
		HttpMessageConverters wxMessageConverters = new HttpMessageConverters(stringConverter, jsonConverter, xmlConverter, formConverter, resourceConverter);
		return wxMessageConverters;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy