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; + } +}