--- /dev/null
+package de.juplo.autoconfigure;
+
+
+import com.fasterxml.jackson.core.JsonFactory;
+import de.juplo.jackson.SimpleMapperService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+
+
+
+/**
+ *
+ * @author Kai Moritz
+ */
+@ConditionalOnMissingBean(SimpleMapperService.class)
+public class SimpleMapperServiceAutoConfiguration
+{
+ private final Logger LOG =
+ LoggerFactory.getLogger(SimpleMapperServiceAutoConfiguration.class);
+
+
+ @Bean
+ public SimpleMapperService simpleMapperService(JsonFactory factory)
+ {
+ LOG.info("No SimpleMapperService configured: creating instance.");
+ return new SimpleMapperService(factory);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean(JsonFactory.class)
+ public JsonFactory jsonFactory()
+ {
+ LOG.info("No JsonFactory configured: configuring default factory.");
+ return new JsonFactory();
+ }
+}
import java.util.Map;
import java.util.Spliterator;
import java.util.stream.Stream;
+import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import org.springframework.util.Assert;
* @author kai
*/
@Component
-public class SimpleMapperService extends SimpleMapper
+public class SimpleMapperService
+ extends
+ SimpleMapper
+ implements
+ InitializingBean
{
- @Autowired
+ @Autowired(required = false)
private JsonFactory factory;
+ public SimpleMapperService() {}
+
public SimpleMapperService(JsonFactory factory)
{
this.factory = factory;
}
+ @Override
+ public void afterPropertiesSet() throws Exception
+ {
+ Assert.notNull(factory, "The attribute factory must be set!");
+ }
+
+ public JsonFactory getFactory()
+ {
+ return factory;
+ }
+
+
public Spliterator<Object> getArraySpliterator(File file)
throws
IOException
--- /dev/null
+package de.juplo.autoconfigure;
+
+
+import com.fasterxml.jackson.core.JsonFactory;
+import de.juplo.jackson.SimpleMapperService;
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.springframework.context.annotation.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.context.annotation.Bean;
+
+
+
+public class SimpleMapperServiceAutoConfigurationTest
+{
+ private final Logger LOG =
+ LoggerFactory.getLogger(SimpleMapperServiceAutoConfigurationTest.class);
+
+
+ @Test
+ public void emptyConfiguration()
+ {
+ LOG.info("<-- Start Of New Test-Case!");
+
+ ConfigurableApplicationContext context = load(EmptyConfiguration.class);
+
+ SimpleMapperService service = context.getBean(SimpleMapperService.class);
+ assertNotNull(service);
+ assertNotNull(service.getFactory());
+ JsonFactory factory = context.getBean(JsonFactory.class);
+ assertNotNull(factory);
+ assertEquals(factory, service.getFactory());
+
+ context.close();
+ }
+
+ @Test
+ public void factoryConfigured()
+ {
+ LOG.info("<-- Start Of New Test-Case!");
+
+ ConfigurableApplicationContext context = load(FactoryConfigured.class);
+
+ SimpleMapperService service = context.getBean(SimpleMapperService.class);
+ assertNotNull(service);
+ assertNotNull(service.getFactory());
+ JsonFactory factory = context.getBean(JsonFactory.class);
+ assertNotNull(factory);
+ assertEquals(FactoryConfigured.factory, factory);
+ assertEquals(factory, service.getFactory());
+
+ context.close();
+ }
+
+ @Test
+ public void serviceConfigured()
+ {
+ LOG.info("<-- Start Of New Test-Case!");
+
+ ConfigurableApplicationContext context = load(ServiceConfigured.class);
+
+ SimpleMapperService service = context.getBean(SimpleMapperService.class);
+ assertNotNull(service);
+ assertNotNull(service.getFactory());
+ assertEquals(ServiceConfigured.factory, service.getFactory());
+ try
+ {
+ context.getBean(JsonFactory.class);
+ fail("A bean of type JsonFactory was found!");
+ }
+ catch(NoSuchBeanDefinitionException e)
+ {
+ LOG.trace("expected exception", e);
+ }
+
+ context.close();
+ }
+
+
+ @Configuration
+ static class EmptyConfiguration
+ {
+ }
+
+ @Configuration
+ static class FactoryConfigured
+ {
+ static JsonFactory factory = new JsonFactory();
+
+
+ @Bean
+ public JsonFactory factory()
+ {
+ return factory;
+ }
+ }
+
+ @Configuration
+ static class ServiceConfigured
+ {
+ static JsonFactory factory = new JsonFactory();
+ static SimpleMapperService service = new SimpleMapperService(factory);
+
+
+ @Bean
+ public SimpleMapperService service()
+ {
+ return service;
+ }
+ }
+
+
+ private ConfigurableApplicationContext load(Class<?> config, String... pairs)
+ {
+ AnnotationConfigApplicationContext ctx =
+ new AnnotationConfigApplicationContext();
+ ctx.register(config);
+ ctx.register(SimpleMapperServiceAutoConfiguration.class); // << Does not work as expected, if the autoconfiguration is registered before the configuration!
+ AutoConfigurationReportLoggingInitializer report =
+ new AutoConfigurationReportLoggingInitializer();
+ report.initialize(ctx);
+ ctx.refresh();
+ return ctx;
+ }
+}