1616package org .springframework .data .redis .aot ;
1717
1818import java .util .Arrays ;
19+ import java .util .function .Consumer ;
1920
2021import org .springframework .aot .hint .MemberCategory ;
2122import org .springframework .aot .hint .RuntimeHints ;
4849import org .springframework .data .redis .repository .query .RedisQueryCreator ;
4950import org .springframework .data .redis .repository .support .RedisRepositoryFactoryBean ;
5051import org .springframework .lang .Nullable ;
52+ import org .springframework .util .ClassUtils ;
5153
5254/**
5355 * {@link RuntimeHintsRegistrar} for Redis operations and repository support.
5456 *
5557 * @author Christoph Strobl
5658 * @since 3.0
5759 */
58- class RedisRuntimeHints implements RuntimeHintsRegistrar {
60+ public class RedisRuntimeHints implements RuntimeHintsRegistrar {
61+
62+ /**
63+ * Get a {@link RuntimeHints} instance containing the ones for Redis.
64+ *
65+ * @param config callback to provide additional custom hints.
66+ * @return new instance of {@link RuntimeHints}.
67+ */
68+ public static RuntimeHints redisHints (Consumer <RuntimeHints > config ) {
69+
70+ RuntimeHints hints = new RuntimeHints ();
71+ new RedisRuntimeHints ().registerHints (hints , null );
72+ config .accept (hints );
73+ return hints ;
74+ }
5975
6076 @ Override
6177 public void registerHints (RuntimeHints hints , @ Nullable ClassLoader classLoader ) {
@@ -65,49 +81,62 @@ public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader)
6581 hint -> hint .onReachableType (TypeReference .of (RedisCacheManager .class )));
6682
6783 // REFLECTION
68- hints .reflection ().registerTypes (Arrays .asList (TypeReference .of (RedisConnection .class ),
69- TypeReference .of (StringRedisConnection .class ), TypeReference .of (DefaultedRedisConnection .class ),
70- TypeReference .of (DefaultedRedisClusterConnection .class ), TypeReference .of (RedisKeyCommands .class ),
71- TypeReference .of (RedisStringCommands .class ), TypeReference .of (RedisListCommands .class ),
72- TypeReference .of (RedisSetCommands .class ), TypeReference .of (RedisZSetCommands .class ),
73- TypeReference .of (RedisHashCommands .class ), TypeReference .of (RedisTxCommands .class ),
74- TypeReference .of (RedisPubSubCommands .class ), TypeReference .of (RedisConnectionCommands .class ),
75- TypeReference .of (RedisServerCommands .class ), TypeReference .of (RedisStreamCommands .class ),
76- TypeReference .of (RedisScriptingCommands .class ), TypeReference .of (RedisGeoCommands .class ),
77- TypeReference .of (RedisHyperLogLogCommands .class ), TypeReference .of (RedisClusterCommands .class ),
78- TypeReference .of (ReactiveRedisConnection .class ), TypeReference .of (ReactiveKeyCommands .class ),
79- TypeReference .of (ReactiveStringCommands .class ), TypeReference .of (ReactiveListCommands .class ),
80- TypeReference .of (ReactiveSetCommands .class ), TypeReference .of (ReactiveZSetCommands .class ),
81- TypeReference .of (ReactiveHashCommands .class ), TypeReference .of (ReactivePubSubCommands .class ),
82- TypeReference .of (ReactiveServerCommands .class ), TypeReference .of (ReactiveStreamCommands .class ),
83- TypeReference .of (ReactiveScriptingCommands .class ), TypeReference .of (ReactiveGeoCommands .class ),
84- TypeReference .of (ReactiveHyperLogLogCommands .class ), TypeReference .of (ReactiveClusterKeyCommands .class ),
85- TypeReference .of (ReactiveClusterStringCommands .class ), TypeReference .of (ReactiveClusterListCommands .class ),
86- TypeReference .of (ReactiveClusterSetCommands .class ), TypeReference .of (ReactiveClusterZSetCommands .class ),
87- TypeReference .of (ReactiveClusterHashCommands .class ), TypeReference .of (ReactiveClusterServerCommands .class ),
88- TypeReference .of (ReactiveClusterStreamCommands .class ), TypeReference .of (ReactiveClusterScriptingCommands .class ),
89- TypeReference .of (ReactiveClusterGeoCommands .class ), TypeReference .of (ReactiveClusterHyperLogLogCommands .class ),
90- TypeReference .of (ReactiveRedisOperations .class ), TypeReference .of (ReactiveRedisTemplate .class ),
91- TypeReference .of (RedisOperations .class ), TypeReference .of (RedisTemplate .class ),
92- TypeReference .of (StringRedisTemplate .class ), TypeReference .of (KeyspaceConfiguration .class ),
93- TypeReference .of (MappingConfiguration .class ), TypeReference .of (MappingRedisConverter .class ),
94- TypeReference .of (RedisConverter .class ), TypeReference .of (RedisCustomConversions .class ),
95- TypeReference .of (ReferenceResolver .class ), TypeReference .of (ReferenceResolverImpl .class ),
96- TypeReference .of (IndexConfiguration .class ), TypeReference .of (ConfigurableIndexDefinitionProvider .class ),
97- TypeReference .of (RedisMappingContext .class ), TypeReference .of (RedisRepositoryFactoryBean .class ),
98- TypeReference .of (RedisQueryCreator .class ), TypeReference .of (MessageListener .class ),
99- TypeReference .of (RedisMessageListenerContainer .class ),
100-
101- TypeReference .of (RedisKeyValueAdapter .class ), TypeReference .of (RedisKeyValueTemplate .class ),
102-
103- // Key-Value
104- TypeReference .of (KeySpace .class ), TypeReference .of (AbstractKeyValueAdapter .class ),
105- TypeReference .of (KeyValueAdapter .class ), TypeReference .of (KeyValueOperations .class ),
106- TypeReference .of (KeyValueTemplate .class ), TypeReference .of (KeyValueMappingContext .class ),
107- TypeReference .of (KeyValueRepository .class ), TypeReference .of (KeyValueRepositoryFactoryBean .class ),
108- TypeReference .of (QueryCreatorType .class ), TypeReference .of (KeyValuePartTreeQuery .class )),
109-
110- hint -> hint .withMembers (MemberCategory .INVOKE_DECLARED_CONSTRUCTORS , MemberCategory .INVOKE_PUBLIC_METHODS ));
84+ hints .reflection ().registerTypes (
85+ Arrays .asList (TypeReference .of (RedisConnection .class ), TypeReference .of (StringRedisConnection .class ),
86+ TypeReference .of (DefaultedRedisConnection .class ), TypeReference .of (DefaultedRedisClusterConnection .class ),
87+ TypeReference .of (RedisKeyCommands .class ), TypeReference .of (RedisStringCommands .class ),
88+ TypeReference .of (RedisListCommands .class ), TypeReference .of (RedisSetCommands .class ),
89+ TypeReference .of (RedisZSetCommands .class ), TypeReference .of (RedisHashCommands .class ),
90+ TypeReference .of (RedisTxCommands .class ), TypeReference .of (RedisPubSubCommands .class ),
91+ TypeReference .of (RedisConnectionCommands .class ), TypeReference .of (RedisServerCommands .class ),
92+ TypeReference .of (RedisStreamCommands .class ), TypeReference .of (RedisScriptingCommands .class ),
93+ TypeReference .of (RedisGeoCommands .class ), TypeReference .of (RedisHyperLogLogCommands .class ),
94+ TypeReference .of (RedisClusterCommands .class ), TypeReference .of (ReactiveRedisConnection .class ),
95+ TypeReference .of (ReactiveKeyCommands .class ), TypeReference .of (ReactiveStringCommands .class ),
96+ TypeReference .of (ReactiveListCommands .class ), TypeReference .of (ReactiveSetCommands .class ),
97+ TypeReference .of (ReactiveZSetCommands .class ), TypeReference .of (ReactiveHashCommands .class ),
98+ TypeReference .of (ReactivePubSubCommands .class ), TypeReference .of (ReactiveServerCommands .class ),
99+ TypeReference .of (ReactiveStreamCommands .class ), TypeReference .of (ReactiveScriptingCommands .class ),
100+ TypeReference .of (ReactiveGeoCommands .class ), TypeReference .of (ReactiveHyperLogLogCommands .class ),
101+ TypeReference .of (ReactiveClusterKeyCommands .class ), TypeReference .of (ReactiveClusterStringCommands .class ),
102+ TypeReference .of (ReactiveClusterListCommands .class ), TypeReference .of (ReactiveClusterSetCommands .class ),
103+ TypeReference .of (ReactiveClusterZSetCommands .class ), TypeReference .of (ReactiveClusterHashCommands .class ),
104+ TypeReference .of (ReactiveClusterServerCommands .class ),
105+ TypeReference .of (ReactiveClusterStreamCommands .class ),
106+ TypeReference .of (ReactiveClusterScriptingCommands .class ),
107+ TypeReference .of (ReactiveClusterGeoCommands .class ),
108+ TypeReference .of (ReactiveClusterHyperLogLogCommands .class ), TypeReference .of (ReactiveRedisOperations .class ),
109+ TypeReference .of (ReactiveRedisTemplate .class ), TypeReference .of (RedisOperations .class ),
110+ TypeReference .of (RedisTemplate .class ), TypeReference .of (StringRedisTemplate .class ),
111+ TypeReference .of (KeyspaceConfiguration .class ), TypeReference .of (MappingConfiguration .class ),
112+ TypeReference .of (MappingRedisConverter .class ), TypeReference .of (RedisConverter .class ),
113+ TypeReference .of (RedisCustomConversions .class ), TypeReference .of (ReferenceResolver .class ),
114+ TypeReference .of (ReferenceResolverImpl .class ), TypeReference .of (IndexConfiguration .class ),
115+ TypeReference .of (ConfigurableIndexDefinitionProvider .class ), TypeReference .of (RedisMappingContext .class ),
116+ TypeReference .of (RedisRepositoryFactoryBean .class ), TypeReference .of (RedisQueryCreator .class ),
117+ TypeReference .of (MessageListener .class ), TypeReference .of (RedisMessageListenerContainer .class ),
118+
119+ TypeReference
120+ .of ("org.springframework.data.redis.core.BoundOperationsProxyFactory$DefaultBoundKeyOperations" ),
121+ TypeReference .of ("org.springframework.data.redis.core.DefaultGeoOperations" ),
122+ TypeReference .of ("org.springframework.data.redis.core.DefaultHashOperations" ),
123+ TypeReference .of ("org.springframework.data.redis.core.DefaultKeyOperations" ),
124+ TypeReference .of ("org.springframework.data.redis.core.DefaultListOperations" ),
125+ TypeReference .of ("org.springframework.data.redis.core.DefaultSetOperations" ),
126+ TypeReference .of ("org.springframework.data.redis.core.DefaultStreamOperations" ),
127+ TypeReference .of ("org.springframework.data.redis.core.DefaultValueOperations" ),
128+ TypeReference .of ("org.springframework.data.redis.core.DefaultZSetOperations" ),
129+
130+ TypeReference .of (RedisKeyValueAdapter .class ), TypeReference .of (RedisKeyValueTemplate .class ),
131+
132+ // Key-Value
133+ TypeReference .of (KeySpace .class ), TypeReference .of (AbstractKeyValueAdapter .class ),
134+ TypeReference .of (KeyValueAdapter .class ), TypeReference .of (KeyValueOperations .class ),
135+ TypeReference .of (KeyValueTemplate .class ), TypeReference .of (KeyValueMappingContext .class ),
136+ TypeReference .of (KeyValueRepository .class ), TypeReference .of (KeyValueRepositoryFactoryBean .class ),
137+ TypeReference .of (QueryCreatorType .class ), TypeReference .of (KeyValuePartTreeQuery .class )),
138+
139+ hint -> hint .withMembers (MemberCategory .INVOKE_DECLARED_CONSTRUCTORS , MemberCategory .INVOKE_DECLARED_METHODS ));
111140
112141 // PROXIES
113142 hints .proxies ().registerJdkProxy (TypeReference .of (RedisConnection .class ));
@@ -117,24 +146,31 @@ public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader)
117146 TypeReference .of (DecoratedRedisConnection .class ));
118147
119148 // keys are bound by a proxy
120- boundOperationsProxy (BoundGeoOperations .class , hints );
121- boundOperationsProxy (BoundHashOperations .class , hints );
122- boundOperationsProxy (BoundKeyOperations .class , hints );
123- boundOperationsProxy (BoundListOperations .class , hints );
124- boundOperationsProxy (BoundSetOperations .class , hints );
125- boundOperationsProxy (BoundStreamOperations .class , hints );
126- boundOperationsProxy (BoundValueOperations .class , hints );
127- boundOperationsProxy (BoundZSetOperations .class , hints );
128- boundOperationsProxy (
129- TypeReference .of ("org.springframework.data.redis.core.BoundOperationsProxyFactory$DefaultBoundKeyOperations" ),
130- hints );
149+ boundOperationsProxy (BoundGeoOperations .class , classLoader , hints );
150+ boundOperationsProxy (BoundHashOperations .class , classLoader , hints );
151+ boundOperationsProxy (BoundKeyOperations .class , classLoader , hints );
152+ boundOperationsProxy (BoundListOperations .class , classLoader , hints );
153+ boundOperationsProxy (BoundSetOperations .class , classLoader , hints );
154+ boundOperationsProxy (BoundStreamOperations .class , classLoader , hints );
155+ boundOperationsProxy (BoundValueOperations .class , classLoader , hints );
156+ boundOperationsProxy (BoundZSetOperations .class , classLoader , hints );
131157 }
132158
133- private void boundOperationsProxy (Class <?> type , RuntimeHints hints ) {
134- boundOperationsProxy (TypeReference .of (type ), hints );
159+ static void boundOperationsProxy (Class <?> type , ClassLoader classLoader , RuntimeHints hints ) {
160+ boundOperationsProxy (TypeReference .of (type ), classLoader , hints );
135161 }
136162
137- private void boundOperationsProxy (TypeReference typeReference , RuntimeHints hints ) {
163+ static void boundOperationsProxy (TypeReference typeReference , ClassLoader classLoader , RuntimeHints hints ) {
164+
165+ String boundTargetClass = typeReference .getPackageName () + "." + typeReference .getSimpleName ().replace ("Bound" , "" );
166+ if (ClassUtils .isPresent (boundTargetClass , classLoader )) {
167+ hints .reflection ().registerType (TypeReference .of (boundTargetClass ), hint -> hint
168+ .withMembers (MemberCategory .INVOKE_DECLARED_METHODS ));
169+ }
170+
171+ hints .reflection ().registerType (typeReference , hint -> hint
172+ .withMembers (MemberCategory .INVOKE_DECLARED_METHODS ));
173+
138174 hints .proxies ().registerJdkProxy (typeReference , //
139175 TypeReference .of ("org.springframework.aop.SpringProxy" ), //
140176 TypeReference .of ("org.springframework.aop.framework.Advised" ), //
0 commit comments