From 7ed34af6cc62779a77b3a9a0647477bf46034631 Mon Sep 17 00:00:00 2001 From: Vladimir Orany Date: Mon, 30 Nov 2020 16:12:27 +0100 Subject: [PATCH 1/2] more details about missing beans --- .../grails/DefaultGrailsMicronautBeanProcessor.java | 10 ++++++++-- .../micronaut/grails/GrailsMicronautBeanFactory.java | 10 +++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/DefaultGrailsMicronautBeanProcessor.java b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/DefaultGrailsMicronautBeanProcessor.java index efbeaf51..bf0303ea 100644 --- a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/DefaultGrailsMicronautBeanProcessor.java +++ b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/DefaultGrailsMicronautBeanProcessor.java @@ -36,6 +36,7 @@ import java.util.Collection; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; /** * Adds Micronaut beans to a Grails' Spring application context. This processor will @@ -83,11 +84,16 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) : micronautContext.getBeanDefinitions(type, micronautBeanQualifier); if (beanDefinitions.size() > 1) { - throw new IllegalArgumentException("There is too many candidates of type " + type + " for " + micronautBeanQualifier + "! Candidates: " + beanDefinitions); + throw new IllegalArgumentException("There is too many candidates of type '" + type + "' for qualifier '" + micronautBeanQualifier + "'! Candidates: " + beanDefinitions); } Optional> firstBean = beanDefinitions.stream().findFirst(); - BeanDefinition definition = firstBean.orElseThrow(()-> new IllegalArgumentException("There is no candidate for " + micronautBeanQualifier)); + BeanDefinition definition = firstBean.orElseThrow(()-> { + String message = "There is no candidate for type " + type + " and qualifier " + micronautBeanQualifier + "\n" + + "Known beans:\n" + micronautContext.getAllBeanDefinitions().stream().map(d -> d.getBeanType().getName() + " " + d.getName()).collect(Collectors.joining("\n ")); + + return new IllegalArgumentException(message); + }); final BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder .rootBeanDefinition(GrailsMicronautBeanFactory.class); diff --git a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsMicronautBeanFactory.java b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsMicronautBeanFactory.java index bb1e783e..a4e21ea2 100644 --- a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsMicronautBeanFactory.java +++ b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsMicronautBeanFactory.java @@ -52,7 +52,6 @@ public void setMicronautContext(DefaultApplicationContext micronautContext) { } /** - * * @param isMicronautSingleton indicates if the Micronaut bean is a singleton */ public void setMicronautSingleton(boolean isMicronautSingleton) { @@ -68,8 +67,13 @@ public void setMicronautQualifier(Qualifier micronautQualifier) { @Override public Object getObject() throws Exception { - if (GrailsMicronautBeanProcessor.LOGGER.isWarnEnabled() && micronautContext.getEnvironment().getActiveNames().contains(MicronautGrailsApp.ENVIRONMENT)) { - GrailsMicronautBeanProcessor.LOGGER.warn("Bean " + (micronautQualifier == null ? "" : micronautQualifier) + micronautBeanType.getName() + " has been created using GrailsMicronautBeanProcessor. Consider annotating the injection point with @Inject switching the compatibility mode to MicronautGrailsApp.Compatibility.STRICT"); + if (GrailsMicronautBeanProcessor.LOGGER.isWarnEnabled()) { + GrailsMicronautBeanProcessor.LOGGER.warn( + "Bean " + (micronautQualifier == null ? "" : micronautQualifier + " ") + micronautBeanType.getName() + + " has been created using GrailsMicronautBeanProcessor in a separate Micronaut ApplicationContext." + + " Please, consider annotating the injection point with @Inject and switching the compatibility mode to MicronautGrailsApp.Compatibility.STRICT.\n" + + " See https://agorapulse.github.io/micronaut-grails/#_grails_4 for more details!" + ); } Optional bean = micronautContext.findBean(micronautBeanType, micronautQualifier); From 66c7996b222d013ad080b8c1553b388d4b07b0e1 Mon Sep 17 00:00:00 2001 From: Vladimir Orany Date: Mon, 30 Nov 2020 16:27:51 +0100 Subject: [PATCH 2/2] translated properties warnings --- .../GrailsPropertyTranslatingEnvironment.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsPropertyTranslatingEnvironment.java b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsPropertyTranslatingEnvironment.java index 9b41760b..a2f34252 100644 --- a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsPropertyTranslatingEnvironment.java +++ b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsPropertyTranslatingEnvironment.java @@ -20,6 +20,8 @@ import io.micronaut.context.env.DefaultEnvironment; import io.micronaut.core.convert.ArgumentConversionContext; import io.micronaut.core.convert.ConversionService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.core.env.AbstractEnvironment; import org.springframework.core.env.Environment; import org.springframework.core.env.MapPropertySource; @@ -30,6 +32,8 @@ class GrailsPropertyTranslatingEnvironment extends DefaultEnvironment { + private static final Logger LOGGER = LoggerFactory.getLogger(GrailsPropertyTranslatingEnvironment.class); + private final Environment environment; private final PropertyTranslatingCustomizer customizer; @@ -47,6 +51,10 @@ class GrailsPropertyTranslatingEnvironment extends DefaultEnvironment { mps.getSource().forEach((k, v) -> { Optional expectedPrefix = expectedMapProperties.stream().filter(k::startsWith).findFirst(); if (expectedPrefix.isPresent()) { + if (LOGGER.isWarnEnabled()) { + LOGGER.warn("Prefix " + expectedPrefix + " is mapped to map property." + + " This only works in LEGACY compatibility mode but it might work natively in different modes."); + } String[] parts = k.split("\\."); Map currentLevelMap = multilayer; String prefix = ""; @@ -104,7 +112,15 @@ public boolean containsProperty(@Nullable String name) { return false; } - return alternativeNames.stream().anyMatch(environment::containsProperty); + Optional alternative = alternativeNames.stream().filter(environment::containsProperty).findFirst(); + if (alternative.isPresent()) { + if (LOGGER.isWarnEnabled()) { + LOGGER.warn("Using alternative property name '" + alternative.get() + "' instead of '" + name + "'!" + + " This is only supported in LEGACY mode. Please declare the property directly as '" + name + "'."); + } + return true; + } + return false; } @Override @@ -130,6 +146,10 @@ public Optional getProperty(@Nullable String name, ArgumentConversionCont Object altProperty = environment.getProperty(alternativeName, Object.class); Optional alternativeValue = ConversionService.SHARED.convert(altProperty, type, conversionContext); if (alternativeValue.isPresent()) { + if (LOGGER.isWarnEnabled()) { + LOGGER.warn("Property '" + name + "' has been loaded using the value of '" + alternativeName + "' property!" + + " This is only supported in LEGACY mode. Please declare the property directly as '" + name + "'."); + } return alternativeValue; } }