Skip to content

Commit

Permalink
Fix 'ConditionalOnMissingBean' not work with component scan (#4)
Browse files Browse the repository at this point in the history
* Fix 'ConditionalOnMissingBean' not work with component scan

* Fix json CodecCustomizer configs

* Fix jdbc tests

* Make protected function open
  • Loading branch information
devkanro authored May 21, 2020
1 parent 5377f7d commit 9226109
Show file tree
Hide file tree
Showing 16 changed files with 87 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,13 @@ import org.springframework.amqp.rabbit.connection.CachingConnectionFactory
import org.springframework.amqp.rabbit.connection.ConnectionFactory
import org.springframework.amqp.rabbit.core.RabbitTemplate
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.stereotype.Component

@Component
@ConditionalOnMissingBean(value = [AmqpTemplateFactory::class])
class DefaultAmqpTemplateFactory : AmqpTemplateFactory {
open class DefaultAmqpTemplateFactory : AmqpTemplateFactory {
private val connectionFactories: MutableMap<String, ConnectionFactory> = hashMapOf()

override fun createTemplate(property: MessageQueueProperty): AmqpTemplate {
return RabbitTemplate(
createConnection(property.host, property.port, property)
createConnection(property.host, property.port, property)
).apply {
property.queue?.let {
this.setDefaultReceiveQueue(it)
Expand All @@ -26,7 +22,7 @@ class DefaultAmqpTemplateFactory : AmqpTemplateFactory {
}
}

protected fun createConnection(host: String, port: Int, property: MessageQueueProperty): ConnectionFactory {
protected open fun createConnection(host: String, port: Int, property: MessageQueueProperty): ConnectionFactory {
return connectionFactories.getOrPut("$host:$port/${property.vhost}") {
CachingConnectionFactory(host, port).apply {
this.virtualHost = property.vhost
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
package com.bybutter.sisyphus.middleware.amqp

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration

@Configuration
@ComponentScan(basePackageClasses = [SisyphusAmqpAutoConfiguration::class])
class SisyphusAmqpAutoConfiguration
class SisyphusAmqpAutoConfiguration {
@Bean
@ConditionalOnMissingBean(value = [AmqpTemplateFactory::class])
fun defaultAmqpTemplateFactory(): AmqpTemplateFactory {
return DefaultAmqpTemplateFactory()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,13 @@ import org.apache.http.auth.AuthScope
import org.apache.http.auth.UsernamePasswordCredentials
import org.apache.http.impl.client.BasicCredentialsProvider
import org.elasticsearch.client.RestClient
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.stereotype.Component

@Component
@ConditionalOnMissingBean(value = [ElasticClientFactory::class])
class DefaultElasticClientFactory : ElasticClientFactory {
open class DefaultElasticClientFactory : ElasticClientFactory {
override fun createClient(property: ElasticProperty): RestClient {
return createElasticClient(property.host, property.port, property)
}

protected fun createElasticClient(
protected open fun createElasticClient(
host: String,
port: Int,
property: ElasticProperty
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
package com.bybutter.sisyphus.middleware.elastic

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration

@Configuration
@ComponentScan(basePackageClasses = [SisyphusElasticAutoConfiguration::class])
class SisyphusElasticAutoConfiguration
class SisyphusElasticAutoConfiguration {
@Bean
@ConditionalOnMissingBean(value = [ElasticClientFactory::class])
fun defaultElasticClientFactory(): ElasticClientFactory {
return DefaultElasticClientFactory()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,16 @@ import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.HConstants
import org.apache.hadoop.hbase.client.Connection
import org.apache.hadoop.hbase.client.ConnectionFactory
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.stereotype.Component

@Component
@ConditionalOnMissingBean(value = [HBaseTemplateFactory::class])
class DefaultHBaseTemplateFactory : HBaseTemplateFactory {
open class DefaultHBaseTemplateFactory : HBaseTemplateFactory {
private val connections: MutableMap<String, Connection> = hashMapOf()

override fun createTemplate(property: HBaseTableProperty): HTableTemplate<*, *> {
val connection = createConnection(property.urls, property)
return createTemplate(property.template, connection)
}

protected fun createConnection(urls: List<String>, property: HBaseTableProperty): Connection {
protected open fun createConnection(urls: List<String>, property: HBaseTableProperty): Connection {
return connections.getOrPut(urls.sorted().joinToString()) {
val config = HBaseConfiguration.create().apply {
this[HConstants.ZOOKEEPER_QUORUM] = urls.joinToString(",")
Expand All @@ -26,7 +22,7 @@ class DefaultHBaseTemplateFactory : HBaseTemplateFactory {
}
}

protected fun createTemplate(clazz: Class<*>, connection: Connection): HTableTemplate<*, *> {
protected open fun createTemplate(clazz: Class<*>, connection: Connection): HTableTemplate<*, *> {
val template = clazz.constructors.first {
it.canAccess(null) && it.parameters.isEmpty()
}.newInstance() as HTableTemplate<*, *>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
package com.bybutter.sisyphus.middleware.hbase

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration

@Configuration
@ComponentScan(basePackageClasses = [SisyphusHBaseAutoConfiguration::class])
class SisyphusHBaseAutoConfiguration
class SisyphusHBaseAutoConfiguration {
@Bean
@ConditionalOnMissingBean(value = [HBaseTemplateFactory::class])
fun defaultHBaseTemplateFactory(): HBaseTemplateFactory {
return DefaultHBaseTemplateFactory()
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,10 @@ class SisyphusJdbcAutoConfiguration {
fun sisyphusTransactionProvider(): TransactionProvider {
return SisyphusTransactionProvider()
}

@Bean
@ConditionalOnMissingBean(value = [DslContextFactory::class])
fun defaultDslContextFactory(configInterceptors: List<JooqConfigInterceptor>): DslContextFactory {
return object : AbstractDslContextFactory(configInterceptors) {}
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,11 @@
package com.bybutter.sisyphus.middleware.jdbc.test

import com.bybutter.sisyphus.middleware.jdbc.DefaultDslContextFactory
import com.bybutter.sisyphus.middleware.jdbc.DslContextFactory
import com.bybutter.sisyphus.middleware.jdbc.JdbcDatabaseProperty
import com.bybutter.sisyphus.middleware.jdbc.JooqConfigInterceptor
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class EmbeddedDatasourceConfig {
@Bean
fun dslContextFactory(@Autowired configInterceptors: List<JooqConfigInterceptor>): DslContextFactory {
return DefaultDslContextFactory(configInterceptors)
}

@Bean
fun embeddedDatasource(): JdbcDatabaseProperty {
return JdbcDatabaseProperty(url = "jdbc:h2:mem:test")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,15 @@ package com.bybutter.sisyphus.middleware.redis

import io.lettuce.core.RedisClient
import io.lettuce.core.RedisURI
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.stereotype.Component

@Component
@ConditionalOnMissingBean(value = [RedisClientFactory::class])
class DefaultRedisClientFactory : RedisClientFactory {
open class DefaultRedisClientFactory : RedisClientFactory {
private val clients: MutableMap<String, RedisClient> = hashMapOf()

override fun createClient(property: RedisProperty): RedisClient {
return createRedisClient(property.host, property.port, property)
}

protected fun createRedisClient(host: String, port: Int, property: RedisProperty): RedisClient {
protected open fun createRedisClient(host: String, port: Int, property: RedisProperty): RedisClient {
return clients.getOrPut("$host:$port") {
RedisClient.create(RedisURI.Builder.redis(host, port).withPassword(property.password).build())
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
package com.bybutter.sisyphus.middleware.redis

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration

@Configuration
@ComponentScan(basePackageClasses = [SisyphusRedisAutoConfiguration::class])
class SisyphusRedisAutoConfiguration
class SisyphusRedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(value = [RedisClientFactory::class])
fun defaultRedisClientFactory(): RedisClientFactory {
return DefaultRedisClientFactory()
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,46 @@
package com.bybutter.sisyphus.starter.jackson

import com.bybutter.sisyphus.starter.jackson.cbor.Jackson2CborCodecCustomizer
import com.bybutter.sisyphus.starter.jackson.json.Jackson2JsonCodecCustomizer
import com.bybutter.sisyphus.starter.jackson.smile.Jackson2SmileCodecCustomizer
import com.bybutter.sisyphus.starter.jackson.yaml.Jackson2YamlCodecCustomizer
import com.fasterxml.jackson.dataformat.cbor.CBORFactory
import com.fasterxml.jackson.dataformat.smile.SmileFactory
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import org.springframework.boot.autoconfigure.AutoConfigureBefore
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
import org.springframework.boot.web.codec.CodecCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Import

@AutoConfigureBefore(JacksonAutoConfiguration::class, CodecsAutoConfiguration::class)
@Import(JacksonAutoRegister::class)
@ComponentScan(basePackageClasses = [SisyphusJacksonAutoConfiguration::class])
class SisyphusJacksonAutoConfiguration
class SisyphusJacksonAutoConfiguration {

@Bean
@ConditionalOnClass(CBORFactory::class)
fun jackson2CborCodecCustomizer(): CodecCustomizer {
return Jackson2CborCodecCustomizer()
}

@Bean
@ConditionalOnClass(SmileFactory::class)
fun jackson2SmileCodecCustomizer(): CodecCustomizer {
return Jackson2SmileCodecCustomizer()
}

@Bean
@ConditionalOnClass(YAMLFactory::class)
fun jackson2YamlCodecCustomizer(): CodecCustomizer {
return Jackson2YamlCodecCustomizer()
}

@Bean
fun jackson2JsonCodecCustomizer(): CodecCustomizer {
return Jackson2JsonCodecCustomizer()
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
package com.bybutter.sisyphus.starter.jackson.cbor

import com.bybutter.sisyphus.jackson.Cbor
import com.fasterxml.jackson.dataformat.cbor.CBORFactory
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.boot.web.codec.CodecCustomizer
import org.springframework.http.codec.CodecConfigurer
import org.springframework.http.codec.DecoderHttpMessageReader
import org.springframework.http.codec.EncoderHttpMessageWriter
import org.springframework.http.codec.cbor.Jackson2CborDecoder
import org.springframework.http.codec.cbor.Jackson2CborEncoder
import org.springframework.stereotype.Component

@Component
@ConditionalOnClass(CBORFactory::class)
class Jackson2CborCodecCustomizer : CodecCustomizer {
override fun customize(configurer: CodecConfigurer) {
configurer.customCodecs().register(EncoderHttpMessageWriter(Jackson2CborEncoder(Cbor.mapper)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@ import org.springframework.http.codec.DecoderHttpMessageReader
import org.springframework.http.codec.EncoderHttpMessageWriter
import org.springframework.http.codec.json.Jackson2JsonDecoder
import org.springframework.http.codec.json.Jackson2JsonEncoder
import org.springframework.stereotype.Component

@Component
class Jackson2JsonCodecCustomizer : CodecCustomizer {
override fun customize(configurer: CodecConfigurer) {
configurer.customCodecs().register(EncoderHttpMessageWriter(Jackson2JsonEncoder(Json.mapper)))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
package com.bybutter.sisyphus.starter.jackson.smile

import com.bybutter.sisyphus.jackson.Smile
import com.fasterxml.jackson.dataformat.smile.SmileFactory
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.boot.web.codec.CodecCustomizer
import org.springframework.http.codec.CodecConfigurer
import org.springframework.http.codec.DecoderHttpMessageReader
import org.springframework.http.codec.EncoderHttpMessageWriter
import org.springframework.http.codec.json.Jackson2SmileDecoder
import org.springframework.http.codec.json.Jackson2SmileEncoder
import org.springframework.stereotype.Component

@Component
@ConditionalOnClass(SmileFactory::class)
class Jackson2SmileCodecCustomizer : CodecCustomizer {
override fun customize(configurer: CodecConfigurer) {
configurer.customCodecs().register(EncoderHttpMessageWriter(Jackson2SmileEncoder(Smile.mapper)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@ import org.springframework.boot.web.codec.CodecCustomizer
import org.springframework.http.codec.CodecConfigurer
import org.springframework.http.codec.DecoderHttpMessageReader
import org.springframework.http.codec.EncoderHttpMessageWriter
import org.springframework.stereotype.Component
import org.springframework.util.MimeType

@Component
class Jackson2YamlCodecCustomizer : CodecCustomizer {
companion object {
val DEFAULT_YAML_MIME_TYPES = arrayOf(
Expand Down

0 comments on commit 9226109

Please sign in to comment.