diff --git a/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/AuthzeroTokenResolverAutoConfiguration.java b/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/AuthzeroTokenResolverAutoConfiguration.java
index f08ef03..9e70b47 100644
--- a/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/AuthzeroTokenResolverAutoConfiguration.java
+++ b/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/AuthzeroTokenResolverAutoConfiguration.java
@@ -25,11 +25,13 @@ import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.DependsOn;
/**
*
@@ -61,6 +63,8 @@ import org.springframework.context.annotation.Bean;
@EnableConfigurationProperties(value = {SimpleJwtProperties.class})
@ConditionalOnClass({DecodedJWT.class, AuthzeroTokenResolver.class})
@ConditionalOnMissingBean({TokenResolver.class})
+@ConditionalOnBean(value = {GuidCreator.class}, name = "jtiCreator")
+@AutoConfigureAfter(value = GuidAutoConfiguration.class)
public class AuthzeroTokenResolverAutoConfiguration {
/**
@@ -96,8 +100,8 @@ public class AuthzeroTokenResolverAutoConfiguration {
* @return the {@link TokenResolver} instance
*/
@Bean
- @ConditionalOnBean(value = {GuidCreator.class}, name = "jtiCreator")
public TokenResolver tokenResolver() {
+ log.debug("Creating bean TokenResolver.");
return new AuthzeroTokenResolver(
jtiCreator,
simpleJwtProperties.algorithm(),
diff --git a/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/GuidAutoConfiguration.java b/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/GuidAutoConfiguration.java
index ffad4fb..ad005ae 100644
--- a/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/GuidAutoConfiguration.java
+++ b/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/GuidAutoConfiguration.java
@@ -18,10 +18,13 @@
package cn.org.codecrafters.simplejwt.autoconfiguration;
import cn.org.codecrafters.guid.GuidCreator;
+import cn.org.codecrafters.simplejwt.autoconfiguration.conditions.GuidCreatorCondition;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.SearchStrategy;
import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
import java.util.UUID;
@@ -32,11 +35,12 @@ import java.util.UUID;
*/
@Slf4j
@AutoConfiguration
-@ConditionalOnMissingBean(value = GuidCreator.class, name = "jtiCreator")
public class GuidAutoConfiguration {
@Bean
+ @Conditional(GuidCreatorCondition.class)
public GuidCreator> jtiCreator() {
+ log.debug("[GuidAutoConfiguration] --- Initializing default jtiCreator.");
return UUID::randomUUID;
}
diff --git a/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/JjwtTokenResolverAutoConfiguration.java b/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/JjwtTokenResolverAutoConfiguration.java
index f0fbd12..b822474 100644
--- a/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/JjwtTokenResolverAutoConfiguration.java
+++ b/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/JjwtTokenResolverAutoConfiguration.java
@@ -27,6 +27,7 @@ import io.jsonwebtoken.Jws;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -63,6 +64,8 @@ import org.springframework.context.annotation.Bean;
@EnableConfigurationProperties(value = {SimpleJwtProperties.class})
@ConditionalOnClass({Jws.class, Claims.class, JjwtTokenResolver.class})
@ConditionalOnMissingBean({TokenResolver.class})
+@ConditionalOnBean(value = {GuidCreator.class}, name = "jtiCreator")
+@AutoConfigureAfter(value = GuidAutoConfiguration.class)
public class JjwtTokenResolverAutoConfiguration {
/**
@@ -98,7 +101,6 @@ public class JjwtTokenResolverAutoConfiguration {
* @return the {@link TokenResolver} instance
*/
@Bean
- @ConditionalOnBean(value = {GuidCreator.class}, name = "jtiCreator")
public TokenResolver> tokenResolver() {
return new JjwtTokenResolver(
jtiCreator,
diff --git a/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/conditions/GuidCreatorCondition.java b/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/conditions/GuidCreatorCondition.java
new file mode 100644
index 0000000..486cf08
--- /dev/null
+++ b/simple-jwt-spring-boot-starter/src/main/java/cn/org/codecrafters/simplejwt/autoconfiguration/conditions/GuidCreatorCondition.java
@@ -0,0 +1,34 @@
+package cn.org.codecrafters.simplejwt.autoconfiguration.conditions;
+
+import cn.org.codecrafters.guid.GuidCreator;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+import java.util.Objects;
+
+/**
+ * GuidCreatorCondition
+ *
+ * Created on 28 Aug 2023
+ *
+ * @author Zihlu Wang
+ */
+@Slf4j
+public class GuidCreatorCondition implements Condition {
+ @Override
+ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
+ log.debug("[GuidCreatorCondition] --- Detecting bean jtiCreator.");
+ final var beanFactory = Objects.requireNonNull(context.getBeanFactory());
+ var isContainJtiCreator = beanFactory.containsBean("jtiCreator");
+ log.debug("[GuidCreatorCondition] --- Bean jtiCreator {} been created.", isContainJtiCreator ? "has" : "has not");
+ if (isContainJtiCreator) {
+ var result = !(beanFactory.getBean("jtiCreator") instanceof GuidCreator>);
+ log.debug("[GuidCreatorCondition] --- Create jtiCreator now? {}.", result ? "yes" : "no");
+ return result;
+ }
+ log.debug("[GuidCreatorCondition] --- Condition passed.");
+ return true;
+ }
+}