Skip to content

Commit b650dae

Browse files
🎨 优化使用 wx-java-open-spring-boot-starter 注册 ConfigStorage 需要同时依赖 jedis、redissson、spring-data-redis 包,否则启动报错的问题
1 parent fcc34c3 commit b650dae

File tree

9 files changed

+275
-139
lines changed

9 files changed

+275
-139
lines changed

spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenAutoConfiguration.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
*/
1313
@Configuration
1414
@EnableConfigurationProperties(WxOpenProperties.class)
15-
@Import({WxOpenStorageAutoConfiguration.class, WxOpenServiceAutoConfiguration.class})
15+
@Import({
16+
WxOpenStorageAutoConfiguration.class,
17+
WxOpenServiceAutoConfiguration.class
18+
})
1619
public class WxOpenAutoConfiguration {
1720
}

spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import me.chanjar.weixin.open.api.WxOpenService;
66
import me.chanjar.weixin.open.api.impl.WxOpenMessageRouter;
77
import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl;
8+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
89
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
910
import org.springframework.context.annotation.Bean;
1011
import org.springframework.context.annotation.Configuration;
@@ -19,9 +20,10 @@ public class WxOpenServiceAutoConfiguration {
1920

2021
@Bean
2122
@ConditionalOnMissingBean
22-
public WxOpenService wxOpenService(WxOpenConfigStorage configStorage) {
23+
@ConditionalOnBean(WxOpenConfigStorage.class)
24+
public WxOpenService wxOpenService(WxOpenConfigStorage wxOpenConfigStorage) {
2325
WxOpenService wxOpenService = new WxOpenServiceImpl();
24-
wxOpenService.setWxOpenConfigStorage(configStorage);
26+
wxOpenService.setWxOpenConfigStorage(wxOpenConfigStorage);
2527
return wxOpenService;
2628
}
2729

@@ -34,6 +36,4 @@ public WxOpenMessageRouter wxOpenMessageRouter(WxOpenService wxOpenService) {
3436
public WxOpenComponentService wxOpenComponentService(WxOpenService wxOpenService) {
3537
return wxOpenService.getWxOpenComponentService();
3638
}
37-
38-
3939
}
Original file line numberDiff line numberDiff line change
@@ -1,141 +1,23 @@
11
package com.binarywang.spring.starter.wxjava.open.config;
22

3-
import com.binarywang.spring.starter.wxjava.open.properties.RedisProperties;
4-
import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties;
5-
import lombok.RequiredArgsConstructor;
6-
import me.chanjar.weixin.common.redis.JedisWxRedisOps;
7-
import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps;
8-
import me.chanjar.weixin.common.redis.RedissonWxRedisOps;
9-
import me.chanjar.weixin.common.redis.WxRedisOps;
10-
import me.chanjar.weixin.open.api.WxOpenConfigStorage;
11-
import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage;
12-
import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage;
13-
import org.apache.commons.lang3.StringUtils;
14-
import org.redisson.Redisson;
15-
import org.redisson.api.RedissonClient;
16-
import org.redisson.config.Config;
17-
import org.redisson.config.TransportMode;
18-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
19-
import org.springframework.context.ApplicationContext;
20-
import org.springframework.context.annotation.Bean;
3+
import com.binarywang.spring.starter.wxjava.open.config.storage.WxOpenInMemoryConfigStorageConfiguration;
4+
import com.binarywang.spring.starter.wxjava.open.config.storage.WxOpenInRedisConfigStorageConfiguration;
5+
import com.binarywang.spring.starter.wxjava.open.config.storage.WxOpenInRedisTemplateConfigStorageConfiguration;
6+
import com.binarywang.spring.starter.wxjava.open.config.storage.WxOpenInRedissonConfigStorageConfiguration;
217
import org.springframework.context.annotation.Configuration;
22-
import org.springframework.data.redis.core.StringRedisTemplate;
23-
import redis.clients.jedis.JedisPool;
24-
import redis.clients.jedis.JedisPoolConfig;
8+
import org.springframework.context.annotation.Import;
259

2610
/**
2711
* 微信公众号存储策略自动配置.
2812
*
2913
* @author someone
3014
*/
3115
@Configuration
32-
@RequiredArgsConstructor
16+
@Import({
17+
WxOpenInMemoryConfigStorageConfiguration.class,
18+
WxOpenInRedisTemplateConfigStorageConfiguration.class,
19+
WxOpenInRedisConfigStorageConfiguration.class,
20+
WxOpenInRedissonConfigStorageConfiguration.class
21+
})
3322
public class WxOpenStorageAutoConfiguration {
34-
private final WxOpenProperties properties;
35-
private final ApplicationContext applicationContext;
36-
37-
@Bean
38-
@ConditionalOnMissingBean(WxOpenConfigStorage.class)
39-
public WxOpenConfigStorage wxOpenConfigStorage() {
40-
WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
41-
WxOpenProperties.StorageType type = storage.getType();
42-
43-
WxOpenInMemoryConfigStorage config;
44-
if (type == WxOpenProperties.StorageType.redis || type == WxOpenProperties.StorageType.jedis) {
45-
config = getWxOpenInRedisConfigStorage();
46-
} else if (type == WxOpenProperties.StorageType.redisson) {
47-
config = getWxOpenInRedissonConfigStorage();
48-
} else if (type == WxOpenProperties.StorageType.redistemplate) {
49-
config = getWxOpenInRedisTemplateConfigStorage();
50-
} else {
51-
config = getWxOpenInMemoryConfigStorage();
52-
}
53-
54-
WxOpenProperties.ConfigStorage configStorageProperties = properties.getConfigStorage();
55-
config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey());
56-
config.setHttpProxyHost(configStorageProperties.getHttpProxyHost());
57-
config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername());
58-
config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword());
59-
if (configStorageProperties.getHttpProxyPort() != null) {
60-
config.setHttpProxyPort(configStorageProperties.getHttpProxyPort());
61-
}
62-
return config;
63-
}
64-
65-
private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() {
66-
WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage();
67-
return config;
68-
}
69-
70-
private WxOpenInRedisConfigStorage getWxOpenInRedisConfigStorage() {
71-
RedisProperties redisProperties = properties.getConfigStorage().getRedis();
72-
JedisPool jedisPool;
73-
if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) {
74-
jedisPool = getJedisPool();
75-
} else {
76-
jedisPool = applicationContext.getBean(JedisPool.class);
77-
}
78-
WxRedisOps redisOps = new JedisWxRedisOps(jedisPool);
79-
WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix());
80-
return config;
81-
}
82-
83-
private WxOpenInRedisConfigStorage getWxOpenInRedissonConfigStorage() {
84-
RedisProperties redisProperties = properties.getConfigStorage().getRedis();
85-
RedissonClient redissonClient;
86-
if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) {
87-
redissonClient = getRedissonClient();
88-
} else {
89-
redissonClient = applicationContext.getBean(RedissonClient.class);
90-
}
91-
WxRedisOps redisOps = new RedissonWxRedisOps(redissonClient);
92-
WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix());
93-
return config;
94-
}
95-
96-
private WxOpenInRedisConfigStorage getWxOpenInRedisTemplateConfigStorage() {
97-
StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
98-
WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate);
99-
WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix());
100-
return config;
101-
}
102-
103-
104-
private JedisPool getJedisPool() {
105-
WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
106-
RedisProperties redis = storage.getRedis();
107-
108-
JedisPoolConfig config = new JedisPoolConfig();
109-
if (redis.getMaxActive() != null) {
110-
config.setMaxTotal(redis.getMaxActive());
111-
}
112-
if (redis.getMaxIdle() != null) {
113-
config.setMaxIdle(redis.getMaxIdle());
114-
}
115-
if (redis.getMaxWaitMillis() != null) {
116-
config.setMaxWaitMillis(redis.getMaxWaitMillis());
117-
}
118-
if (redis.getMinIdle() != null) {
119-
config.setMinIdle(redis.getMinIdle());
120-
}
121-
config.setTestOnBorrow(true);
122-
config.setTestWhileIdle(true);
123-
124-
JedisPool pool = new JedisPool(config, redis.getHost(), redis.getPort(),
125-
redis.getTimeout(), redis.getPassword(), redis.getDatabase());
126-
return pool;
127-
}
128-
129-
private RedissonClient getRedissonClient() {
130-
WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
131-
RedisProperties redis = storage.getRedis();
132-
133-
Config config = new Config();
134-
config.useSingleServer()
135-
.setAddress("redis://" + redis.getHost() + ":" + redis.getPort())
136-
.setDatabase(redis.getDatabase())
137-
.setPassword(redis.getPassword());
138-
config.setTransportMode(TransportMode.NIO);
139-
return Redisson.create(config);
140-
}
14123
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.binarywang.spring.starter.wxjava.open.config.storage;
2+
3+
import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties;
4+
import lombok.RequiredArgsConstructor;
5+
import me.chanjar.weixin.open.api.WxOpenConfigStorage;
6+
import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage;
7+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
8+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
9+
import org.springframework.context.annotation.Bean;
10+
import org.springframework.context.annotation.Configuration;
11+
12+
/**
13+
* @author yl
14+
*/
15+
@Configuration
16+
@ConditionalOnProperty(
17+
prefix = WxOpenProperties.PREFIX + ".config-storage", name = "type",
18+
matchIfMissing = true, havingValue = "memory"
19+
)
20+
@RequiredArgsConstructor
21+
public class WxOpenInMemoryConfigStorageConfiguration {
22+
private final WxOpenProperties properties;
23+
24+
@Bean
25+
@ConditionalOnMissingBean(WxOpenConfigStorage.class)
26+
public WxOpenConfigStorage wxOpenConfigStorage() {
27+
WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage();
28+
29+
WxOpenProperties.ConfigStorage configStorageProperties = properties.getConfigStorage();
30+
config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey());
31+
config.setHttpProxyHost(configStorageProperties.getHttpProxyHost());
32+
config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername());
33+
config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword());
34+
if (configStorageProperties.getHttpProxyPort() != null) {
35+
config.setHttpProxyPort(configStorageProperties.getHttpProxyPort());
36+
}
37+
return config;
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.binarywang.spring.starter.wxjava.open.config.storage;
2+
3+
import com.binarywang.spring.starter.wxjava.open.properties.RedisProperties;
4+
import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties;
5+
import lombok.RequiredArgsConstructor;
6+
import me.chanjar.weixin.common.redis.JedisWxRedisOps;
7+
import me.chanjar.weixin.common.redis.WxRedisOps;
8+
import me.chanjar.weixin.open.api.WxOpenConfigStorage;
9+
import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage;
10+
import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage;
11+
import org.apache.commons.lang3.StringUtils;
12+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
14+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
15+
import org.springframework.context.ApplicationContext;
16+
import org.springframework.context.annotation.Bean;
17+
import org.springframework.context.annotation.Configuration;
18+
import redis.clients.jedis.JedisPool;
19+
import redis.clients.jedis.JedisPoolConfig;
20+
21+
/**
22+
* @author yl
23+
*/
24+
@Configuration
25+
@ConditionalOnProperty(
26+
prefix = WxOpenProperties.PREFIX + ".config-storage", name = "type", havingValue = "jedis"
27+
)
28+
@ConditionalOnClass({JedisPool.class, JedisPoolConfig.class})
29+
@RequiredArgsConstructor
30+
public class WxOpenInRedisConfigStorageConfiguration {
31+
private final WxOpenProperties properties;
32+
private final ApplicationContext applicationContext;
33+
34+
@Bean
35+
@ConditionalOnMissingBean(WxOpenConfigStorage.class)
36+
public WxOpenConfigStorage wxOpenConfigStorage() {
37+
WxOpenInMemoryConfigStorage config = getWxOpenInRedisConfigStorage();
38+
39+
WxOpenProperties.ConfigStorage configStorageProperties = properties.getConfigStorage();
40+
config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey());
41+
config.setHttpProxyHost(configStorageProperties.getHttpProxyHost());
42+
config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername());
43+
config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword());
44+
if (configStorageProperties.getHttpProxyPort() != null) {
45+
config.setHttpProxyPort(configStorageProperties.getHttpProxyPort());
46+
}
47+
return config;
48+
}
49+
50+
private WxOpenInRedisConfigStorage getWxOpenInRedisConfigStorage() {
51+
RedisProperties redisProperties = properties.getConfigStorage().getRedis();
52+
JedisPool jedisPool;
53+
if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) {
54+
jedisPool = getJedisPool();
55+
} else {
56+
jedisPool = applicationContext.getBean(JedisPool.class);
57+
}
58+
WxRedisOps redisOps = new JedisWxRedisOps(jedisPool);
59+
return new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix());
60+
}
61+
62+
private JedisPool getJedisPool() {
63+
WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
64+
RedisProperties redis = storage.getRedis();
65+
66+
JedisPoolConfig config = new JedisPoolConfig();
67+
if (redis.getMaxActive() != null) {
68+
config.setMaxTotal(redis.getMaxActive());
69+
}
70+
if (redis.getMaxIdle() != null) {
71+
config.setMaxIdle(redis.getMaxIdle());
72+
}
73+
if (redis.getMaxWaitMillis() != null) {
74+
config.setMaxWaitMillis(redis.getMaxWaitMillis());
75+
}
76+
if (redis.getMinIdle() != null) {
77+
config.setMinIdle(redis.getMinIdle());
78+
}
79+
config.setTestOnBorrow(true);
80+
config.setTestWhileIdle(true);
81+
82+
return new JedisPool(config, redis.getHost(), redis.getPort(),
83+
redis.getTimeout(), redis.getPassword(), redis.getDatabase());
84+
}
85+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.binarywang.spring.starter.wxjava.open.config.storage;
2+
3+
import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties;
4+
import lombok.RequiredArgsConstructor;
5+
import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps;
6+
import me.chanjar.weixin.common.redis.WxRedisOps;
7+
import me.chanjar.weixin.open.api.WxOpenConfigStorage;
8+
import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage;
9+
import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage;
10+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
12+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
13+
import org.springframework.context.ApplicationContext;
14+
import org.springframework.context.annotation.Bean;
15+
import org.springframework.context.annotation.Configuration;
16+
import org.springframework.data.redis.core.StringRedisTemplate;
17+
18+
/**
19+
* @author yl
20+
*/
21+
@Configuration
22+
@ConditionalOnProperty(
23+
prefix = WxOpenProperties.PREFIX + ".config-storage", name = "type", havingValue = "redistemplate"
24+
)
25+
@ConditionalOnClass(StringRedisTemplate.class)
26+
@RequiredArgsConstructor
27+
public class WxOpenInRedisTemplateConfigStorageConfiguration {
28+
private final WxOpenProperties properties;
29+
private final ApplicationContext applicationContext;
30+
31+
@Bean
32+
@ConditionalOnMissingBean(WxOpenConfigStorage.class)
33+
public WxOpenConfigStorage wxOpenConfigStorage() {
34+
WxOpenInMemoryConfigStorage config = getWxOpenInRedisTemplateConfigStorage();
35+
36+
WxOpenProperties.ConfigStorage configStorageProperties = properties.getConfigStorage();
37+
config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey());
38+
config.setHttpProxyHost(configStorageProperties.getHttpProxyHost());
39+
config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername());
40+
config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword());
41+
if (configStorageProperties.getHttpProxyPort() != null) {
42+
config.setHttpProxyPort(configStorageProperties.getHttpProxyPort());
43+
}
44+
return config;
45+
}
46+
47+
private WxOpenInRedisConfigStorage getWxOpenInRedisTemplateConfigStorage() {
48+
StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
49+
WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate);
50+
return new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix());
51+
}
52+
}

0 commit comments

Comments
 (0)