diff --git a/spring-cloud-stream-schema-server/src/main/java/org/springframework/cloud/stream/schema/server/config/SchemaServerConfiguration.java b/spring-cloud-stream-schema-server/src/main/java/org/springframework/cloud/stream/schema/server/config/SchemaServerConfiguration.java index 78912590c..93c11ecf8 100644 --- a/spring-cloud-stream-schema-server/src/main/java/org/springframework/cloud/stream/schema/server/config/SchemaServerConfiguration.java +++ b/spring-cloud-stream-schema-server/src/main/java/org/springframework/cloud/stream/schema/server/config/SchemaServerConfiguration.java @@ -16,11 +16,18 @@ package org.springframework.cloud.stream.schema.server.config; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.boot.autoconfigure.domain.EntityScanPackages; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.stream.schema.server.controllers.ServerController; +import org.springframework.cloud.stream.schema.server.model.Schema; import org.springframework.cloud.stream.schema.server.repository.SchemaRepository; import org.springframework.cloud.stream.schema.server.support.AvroSchemaValidator; import org.springframework.cloud.stream.schema.server.support.SchemaValidator; @@ -47,4 +54,19 @@ public class SchemaServerConfiguration { validatorMap.put("avro", new AvroSchemaValidator()); return validatorMap; } + + @Bean + public static BeanFactoryPostProcessor entityScanPackagesPostProcessor() { + return new BeanFactoryPostProcessor() { + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws + BeansException { + if (beanFactory instanceof BeanDefinitionRegistry) { + EntityScanPackages.register((BeanDefinitionRegistry) beanFactory, Collections.singletonList(Schema.class.getPackage().getName())); + } + } + }; + } + } diff --git a/spring-cloud-stream-schema-server/src/test/java/org/springframework/cloud/stream/schema/server/entityScanning/EntityScanningTests.java b/spring-cloud-stream-schema-server/src/test/java/org/springframework/cloud/stream/schema/server/entityScanning/EntityScanningTests.java new file mode 100644 index 000000000..dba2b38ac --- /dev/null +++ b/spring-cloud-stream-schema-server/src/test/java/org/springframework/cloud/stream/schema/server/entityScanning/EntityScanningTests.java @@ -0,0 +1,41 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.stream.schema.server.entityScanning; + +import org.junit.Test; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cloud.stream.schema.server.EnableSchemaRegistryServer; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * @author Marius Bogoevici + */ +public class EntityScanningTests { + + @Test + public void testApplicationWithEmbeddedSchemaRegistryServerOutsideOfRootPackage() throws Exception { + final ConfigurableApplicationContext context = SpringApplication.run(CustomApplicationEmbeddingSchemaServer.class, "--server.port=0"); + context.close(); + } + + @EnableAutoConfiguration + @EnableSchemaRegistryServer + public static class CustomApplicationEmbeddingSchemaServer { + } +} diff --git a/spring-cloud-stream-schema-server/src/test/java/org/springframework/cloud/stream/schema/server/entityScanning/EntityScanningTestsWithEntityScan.java b/spring-cloud-stream-schema-server/src/test/java/org/springframework/cloud/stream/schema/server/entityScanning/EntityScanningTestsWithEntityScan.java new file mode 100644 index 000000000..69264024f --- /dev/null +++ b/spring-cloud-stream-schema-server/src/test/java/org/springframework/cloud/stream/schema/server/entityScanning/EntityScanningTestsWithEntityScan.java @@ -0,0 +1,43 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.stream.schema.server.entityScanning; + +import org.junit.Test; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.cloud.stream.schema.server.EnableSchemaRegistryServer; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * @author Marius Bogoevici + */ +public class EntityScanningTestsWithEntityScan { + + @Test + public void testApplicationWithEmbeddedSchemaRegistryServerOutsideOfRootPackage() throws Exception { + final ConfigurableApplicationContext context = SpringApplication.run(CustomApplicationEmbeddingSchemaServer.class, "--server.port=0"); + context.close(); + } + + @EnableAutoConfiguration + @EnableSchemaRegistryServer + @EntityScan(basePackages = "org.springframework.cloud.stream.schema.server.entityScanning.domain") + public static class CustomApplicationEmbeddingSchemaServer { + } +} diff --git a/spring-cloud-stream-schema-server/src/test/java/org/springframework/cloud/stream/schema/server/entityScanning/domain/TestEntity.java b/spring-cloud-stream-schema-server/src/test/java/org/springframework/cloud/stream/schema/server/entityScanning/domain/TestEntity.java new file mode 100644 index 000000000..bfdad1702 --- /dev/null +++ b/spring-cloud-stream-schema-server/src/test/java/org/springframework/cloud/stream/schema/server/entityScanning/domain/TestEntity.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.stream.schema.server.entityScanning.domain; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +/** + * @author Marius Bogoevici + */ +@Entity +public class TestEntity { + + @Id + private long id; + + @Column(name = "name") + private String name; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +}