Skip to content

Commit 89943cf

Browse files
dmealingclaude
andcommitted
fix(core-spring): autoconfigure metaobjects.metadata-sources loader (complete MetaDataAutoConfiguration wiring)
MetaDataLoaderConfiguration (the @ConfigurationProperties(prefix="metaobjects") that builds a MetaDataLoader from metaobjects.metadata-sources) was never wired into MetaDataAutoConfiguration, despite its javadoc claiming auto-discovery. A starter-only user setting metaobjects.metadata-sources got it ignored, and primaryMetaDataLoader then threw "No MetaDataLoader found". - @import(MetaDataLoaderConfiguration.class) on MetaDataAutoConfiguration so the property-driven loader participates in autoconfiguration. - @ConditionalOnMissingBean(MetaDataLoader.class) on applicationMetaDataLoader so it backs off when the app supplies its own loader. - MetaDataSpringIntegrationTest now loads the autoconfig via @ImportAutoConfiguration (real autoconfig-runs-last ordering) instead of as a raw @ContextConfiguration class, so @ConditionalOnMissingBean evaluates against the app-supplied loader as it would in production. TDD red->green via new MetaDataLoaderAutoConfigurationTest. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 3ecfa13 commit 89943cf

5 files changed

Lines changed: 50 additions & 2 deletions

File tree

server/java/core-spring/src/main/java/com/metaobjects/spring/MetaDataAutoConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.springframework.beans.factory.annotation.Autowired;
77
import org.springframework.boot.autoconfigure.AutoConfiguration;
88
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Import;
910
import org.springframework.context.annotation.Primary;
1011

1112
import java.util.List;
@@ -41,6 +42,7 @@
4142
* @since 6.0.0
4243
*/
4344
@AutoConfiguration
45+
@Import(MetaDataLoaderConfiguration.class)
4446
public class MetaDataAutoConfiguration {
4547

4648
/**

server/java/core-spring/src/main/java/com/metaobjects/spring/MetaDataLoaderConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.metaobjects.loader.LoaderOptions;
44
import com.metaobjects.loader.MetaDataLoader;
55

6+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
67
import org.springframework.boot.context.properties.ConfigurationProperties;
78
import org.springframework.context.annotation.Bean;
89
import org.springframework.context.annotation.Configuration;
@@ -63,6 +64,7 @@ public class MetaDataLoaderConfiguration {
6364
* {@link MetaDataAutoConfiguration}.</p>
6465
*/
6566
@Bean
67+
@ConditionalOnMissingBean(MetaDataLoader.class)
6668
public MetaDataLoader applicationMetaDataLoader() throws Exception {
6769
if (metadataSources.isEmpty()) {
6870
// Default: look for metadata files in classpath
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.metaobjects.spring;
2+
3+
import com.metaobjects.loader.MetaDataLoader;
4+
import com.metaobjects.registry.MetaDataLoaderRegistry;
5+
import org.junit.Test;
6+
import org.springframework.boot.autoconfigure.AutoConfigurations;
7+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
/**
12+
* Verifies the starter honors metaobjects.metadata-sources: the autoconfiguration
13+
* builds a MetaDataLoader from the property and exposes it through the registry,
14+
* with no app-supplied loader bean.
15+
*/
16+
public class MetaDataLoaderAutoConfigurationTest {
17+
18+
private final ApplicationContextRunner runner = new ApplicationContextRunner()
19+
.withConfiguration(AutoConfigurations.of(MetaDataAutoConfiguration.class));
20+
21+
@Test
22+
public void buildsLoaderFromMetadataSourcesProperty() {
23+
runner.withPropertyValues("metaobjects.metadata-sources=classpath:metadata/test-omdb-starter.json")
24+
.run(ctx -> {
25+
assertThat(ctx).hasSingleBean(MetaDataLoaderRegistry.class);
26+
assertThat(ctx).hasBean("primaryMetaDataLoader");
27+
MetaDataLoaderRegistry reg = ctx.getBean(MetaDataLoaderRegistry.class);
28+
assertThat(reg.getDataLoaders()).isNotEmpty();
29+
MetaDataLoader primary = ctx.getBean(MetaDataLoader.class);
30+
assertThat(primary).isNotNull();
31+
});
32+
}
33+
}

server/java/core-spring/src/test/java/com/metaobjects/spring/MetaDataSpringIntegrationTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.junit.Test;
1111
import org.junit.runner.RunWith;
1212
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
1314
import org.springframework.context.annotation.Bean;
1415
import org.springframework.context.annotation.Configuration;
1516
import org.springframework.test.context.ContextConfiguration;
@@ -29,7 +30,6 @@
2930
*/
3031
@RunWith(SpringJUnit4ClassRunner.class)
3132
@ContextConfiguration(classes = {
32-
MetaDataAutoConfiguration.class,
3333
MetaDataSpringIntegrationTest.TestConfiguration.class
3434
})
3535
public class MetaDataSpringIntegrationTest {
@@ -47,8 +47,9 @@ public class MetaDataSpringIntegrationTest {
4747
* Test Spring configuration that creates test MetaDataLoader beans
4848
*/
4949
@Configuration
50+
@ImportAutoConfiguration(MetaDataAutoConfiguration.class)
5051
static class TestConfiguration {
51-
52+
5253
@Bean
5354
public MetaDataLoader testMetaDataLoader() throws Exception {
5455
MetaDataLoader loader = new MetaDataLoader(
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"metadata.root": {
3+
"package": "acme::starter",
4+
"children": [
5+
{ "object.entity": { "name": "Widget", "children": [
6+
{ "field.long": { "name": "id" } }
7+
] } }
8+
]
9+
}
10+
}

0 commit comments

Comments
 (0)