Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
<artifactId>spring-boot-conditions</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>spring-boot-properties</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
8 changes: 8 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

<modules>
<module>spring-boot-conditions</module>
<module>spring-boot-properties</module>
<module>bom</module>
</modules>

Expand Down Expand Up @@ -77,6 +78,13 @@
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<compilerPlugins>
<plugin>spring</plugin>
<plugin>no-arg</plugin>
<plugin>all-open</plugin>
</compilerPlugins>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand Down
11 changes: 11 additions & 0 deletions spring-boot-conditions/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,16 @@
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.toolisticon.spring.condition

import com.sun.tools.javac.util.AbstractDiagnosticFormatter
import io.toolisticon.spring.condition.fixture.MyComponent
import io.toolisticon.spring.condition.fixture.MyTestConfiguration
import io.toolisticon.spring.condition.fixture.SimpleConfiguration
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.boot.context.annotation.UserConfigurations
import org.springframework.boot.test.context.runner.ApplicationContextRunner

class ConditionalOnMissingQualifiedBeanTest {

private val contextRunner = ApplicationContextRunner()

@Test
fun `should load qualified default bean`() {
contextRunner
.withConfiguration(UserConfigurations.of(MyTestConfiguration::class.java))
.run {
assertThat(it.getBean(MyComponent::class.java)).isNotNull
val component: MyComponent = it.getBean(MyComponent::class.java)
assertThat(component.qualifier).isEqualTo("qualifier1")
}
}

@Test
fun `should load user qualified bean`() {
contextRunner
.withConfiguration(UserConfigurations.of(SimpleConfiguration::class.java))
.withConfiguration(UserConfigurations.of(MyTestConfiguration::class.java))
.run {
assertThat(it.getBean(MyComponent::class.java)).isNotNull
val component: MyComponent = it.getBean(MyComponent::class.java)
assertThat(component.qualifier).isEqualTo("qualifier2")
}
}

}
4 changes: 4 additions & 0 deletions spring-boot-conditions/src/test/kotlin/fixture/MyComponent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package io.toolisticon.spring.condition.fixture

class MyComponent(val qualifier: String) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.toolisticon.spring.condition.fixture

import io.toolisticon.spring.condition.ConditionalOnMissingQualifiedBean
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class MyTestConfiguration {

@ConditionalOnMissingQualifiedBean(beanClass = MyComponent::class, qualifier = "qualifier")
@Bean
@Qualifier("qualifier")
fun component1(): MyComponent = MyComponent("qualifier1")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.toolisticon.spring.condition.fixture

import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class SimpleConfiguration {

@Bean
@Qualifier(value = "qualifier")
fun component2(): MyComponent = MyComponent("qualifier2")

}
44 changes: 44 additions & 0 deletions spring-boot-properties/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>io.toolisticon.spring</groupId>
<artifactId>spring-boot-support</artifactId>
<version>1.0.1-SNAPSHOT</version>
</parent>

<artifactId>spring-boot-properties</artifactId>
<name>Spring-Boot Properties</name>
<description>Set of useful Spring Boot properties helpers</description>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>

</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package io.toolisticon.spring.properties

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean
import org.springframework.core.env.PropertiesPropertySource
import org.springframework.core.env.PropertySource
import org.springframework.core.io.support.EncodedResource
import org.springframework.core.io.support.PropertySourceFactory
import org.springframework.lang.NonNull
import java.util.*

/**
* Property source factory to read properties from YAML files.
* Inspired by [spring-yaml-propertysource](https://www.baeldung.com/spring-yaml-propertysource).
*/
class YamlPropertySourceFactory : PropertySourceFactory {

@NonNull
override fun createPropertySource(name: String?, encodedResource: EncodedResource): PropertySource<*> {

val factory = YamlPropertiesFactoryBean()

factory.setResources(encodedResource.resource)
val properties = factory.getObject()

return PropertiesPropertySource(
Objects.requireNonNull(name ?: encodedResource.resource.filename),
Objects.requireNonNull(properties)
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package io.toolisticon.spring.properties

import io.toolisticon.spring.properties.fixture.MyProperties
import io.toolisticon.spring.properties.fixture.MyTestConfiguration
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.boot.context.annotation.UserConfigurations
import org.springframework.boot.test.context.runner.ApplicationContextRunner

class YamlPropertySourceFactoryTest {

private val contextRunner = ApplicationContextRunner()
.withConfiguration(UserConfigurations.of(MyTestConfiguration::class.java))

@Test
fun `properties are loaded from defaults`() {
contextRunner
.run {

assertThat(it.getBean(MyProperties::class.java)).isNotNull
val props: MyProperties = it.getBean(MyProperties::class.java)

assertThat(props.foo).isEqualTo("bar")
assertThat(props.zee).isEqualTo(12)
assertThat(props.baz).isTrue()
}
}

@Test
fun `properties are loaded from defaults and overridden`() {
contextRunner
.withPropertyValues(
"test.foo=nobar",
"test.zee=42"
)
.run {
assertThat(it.getBean(MyProperties::class.java)).isNotNull
val props: MyProperties = it.getBean(MyProperties::class.java)

assertThat(props.foo).isEqualTo("nobar")
assertThat(props.zee).isEqualTo(42)
assertThat(props.baz).isTrue()
}
}

}


10 changes: 10 additions & 0 deletions spring-boot-properties/src/test/kotlin/fixture/MyProperties.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.toolisticon.spring.properties.fixture

import org.springframework.boot.context.properties.ConfigurationProperties

@ConfigurationProperties(prefix = "test")
data class MyProperties(
val foo: String,
val zee: Int,
val baz: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.toolisticon.spring.properties.fixture

import io.toolisticon.spring.properties.YamlPropertySourceFactory
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.PropertySource

@PropertySource(
name = "defaultTestingProperties",
value = ["classpath:/application-testing.yaml"],
factory = YamlPropertySourceFactory::class
)
@EnableConfigurationProperties(MyProperties::class)
@Configuration
@ComponentScan
class MyTestConfiguration
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
test:
foo: "bar"
zee: 12
baz: true
Loading