Skip to content

Commit 1ff951e

Browse files
authored
Merge branch 'master' into no-ts-check-jar-resources
2 parents 2029518 + 895c1ee commit 1ff951e

File tree

6 files changed

+87
-9
lines changed

6 files changed

+87
-9
lines changed

vaadin-spring/src/main/java/com/vaadin/flow/spring/SpringBootAutoConfiguration.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package com.vaadin.flow.spring;
1717

18-
import jakarta.servlet.MultipartConfigElement;
1918
import java.util.HashMap;
2019
import java.util.Map;
2120

@@ -37,6 +36,9 @@
3736

3837
import com.vaadin.flow.server.Constants;
3938
import com.vaadin.flow.server.VaadinServlet;
39+
import com.vaadin.flow.spring.springnative.VaadinBeanFactoryInitializationAotProcessor;
40+
41+
import jakarta.servlet.MultipartConfigElement;
4042

4143
/**
4244
* Spring boot auto-configuration class for Flow.

vaadin-spring/src/main/java/com/vaadin/flow/spring/AtmosphereHintsRegistrar.java renamed to vaadin-spring/src/main/java/com/vaadin/flow/spring/springnative/AtmosphereHintsRegistrar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.vaadin.flow.spring;
1+
package com.vaadin.flow.spring.springnative;
22

33
import java.util.Collection;
44
import java.util.HashSet;

vaadin-spring/src/main/java/com/vaadin/flow/spring/VaadinBeanFactoryInitializationAotProcessor.java renamed to vaadin-spring/src/main/java/com/vaadin/flow/spring/springnative/VaadinBeanFactoryInitializationAotProcessor.java

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package com.vaadin.flow.spring;
1+
package com.vaadin.flow.spring.springnative;
22

33
import java.util.ArrayList;
44
import java.util.Collection;
55
import java.util.HashSet;
66
import java.util.List;
7+
import java.util.Set;
78

89
import org.reflections.Reflections;
910
import org.slf4j.Logger;
@@ -13,7 +14,11 @@
1314
import org.springframework.beans.factory.BeanFactory;
1415
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
1516
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
17+
import org.springframework.beans.factory.config.BeanDefinition;
1618
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
19+
import org.springframework.beans.factory.support.AbstractBeanDefinition;
20+
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
21+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
1722
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
1823

1924
import com.vaadin.flow.component.Component;
@@ -26,14 +31,30 @@
2631
import com.vaadin.flow.router.RouteAlias;
2732
import com.vaadin.flow.router.RouterLayout;
2833

29-
class VaadinBeanFactoryInitializationAotProcessor
34+
public class VaadinBeanFactoryInitializationAotProcessor
3035
implements BeanFactoryInitializationAotProcessor {
3136

3237
private final Logger logger = LoggerFactory.getLogger(getClass());
3338

39+
public static class Marker {
40+
41+
}
42+
3443
@Override
3544
public BeanFactoryInitializationAotContribution processAheadOfTime(
3645
ConfigurableListableBeanFactory beanFactory) {
46+
// Find and register @Route classes so they can be created as beans at
47+
// runtime
48+
if (beanFactory instanceof BeanDefinitionRegistry) {
49+
findAndRegisterRoutes(
50+
(BeanDefinitionRegistry & BeanFactory) beanFactory);
51+
} else {
52+
logger.error(
53+
"Unable to register @Route classes as beans because the used bean factory is of type {} which does not implement {}",
54+
beanFactory.getClass().getName(),
55+
BeanDefinitionRegistry.class.getName());
56+
}
57+
3758
return (generationContext, beanFactoryInitializationCode) -> {
3859
var hints = generationContext.getRuntimeHints();
3960
for (var pkg : getPackages(beanFactory)) {
@@ -78,6 +99,60 @@ public BeanFactoryInitializationAotContribution processAheadOfTime(
7899
};
79100
}
80101

102+
private static List<String> getPackagesWithRoutes(BeanFactory beanFactory) {
103+
List<String> packages = new ArrayList<String>();
104+
packages.add("com.vaadin");
105+
packages.addAll(AutoConfigurationPackages.get(beanFactory));
106+
return packages;
107+
}
108+
109+
private <T extends BeanFactory & BeanDefinitionRegistry> void findAndRegisterRoutes(
110+
T beanFactory) {
111+
String markerBeanName = Marker.class.getName();
112+
logger.debug("Finding and registering routes");
113+
114+
if (beanFactory.containsBeanDefinition(markerBeanName)) {
115+
logger.debug("Routes already registered");
116+
return;
117+
}
118+
119+
Set<String> registeredClasses = new HashSet<>();
120+
for (String beanName : beanFactory.getBeanDefinitionNames()) {
121+
// Routes can be manually registered using @Component.
122+
// We should not register those again
123+
BeanDefinition def = beanFactory.getBeanDefinition(beanName);
124+
if (def.getBeanClassName() != null) {
125+
registeredClasses.add(def.getBeanClassName());
126+
}
127+
}
128+
129+
for (String pkg : getPackagesWithRoutes(beanFactory)) {
130+
logger.debug("Scanning for @{} or @{} annotated beans in {}",
131+
Route.class.getSimpleName(),
132+
RouteAlias.class.getSimpleName(), pkg);
133+
var reflections = new Reflections(pkg);
134+
for (var c : getRouteTypesFor(reflections, pkg)) {
135+
if (registeredClasses.contains(c.getName())) {
136+
logger.debug(
137+
"Skipping route class {} as it has already been registered as a bean",
138+
c.getName());
139+
continue;
140+
}
141+
142+
logger.debug("Registering a bean for route class {}",
143+
c.getName());
144+
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder
145+
.rootBeanDefinition(c).setScope("prototype")
146+
.getBeanDefinition();
147+
beanFactory.registerBeanDefinition(c.getName(), beanDefinition);
148+
}
149+
}
150+
151+
beanFactory.registerBeanDefinition(markerBeanName, BeanDefinitionBuilder
152+
.rootBeanDefinition(Marker.class).getBeanDefinition());
153+
154+
}
155+
81156
private static Collection<Class<?>> getRouteTypesFor(
82157
Reflections reflections, String packageName) {
83158
var routeTypes = new HashSet<Class<?>>();

vaadin-spring/src/main/java/com/vaadin/flow/spring/VaadinHintsRegistrar.java renamed to vaadin-spring/src/main/java/com/vaadin/flow/spring/springnative/VaadinHintsRegistrar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.vaadin.flow.spring;
1+
package com.vaadin.flow.spring.springnative;
22

33
import org.springframework.aot.hint.MemberCategory;
44
import org.springframework.aot.hint.ReflectionHints;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
org.springframework.aot.hint.RuntimeHintsRegistrar=com.vaadin.flow.spring.VaadinHintsRegistrar, com.vaadin.flow.spring.AtmosphereHintsRegistrar
1+
org.springframework.aot.hint.RuntimeHintsRegistrar=com.vaadin.flow.spring.springnative.VaadinHintsRegistrar, com.vaadin.flow.spring.springnative.AtmosphereHintsRegistrar

vaadin-spring/src/test/java/com/vaadin/flow/spring/SpringClassesSerializableTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,11 @@ protected Stream<String> getExcludedPatterns() {
8787
"com\\.vaadin\\.flow\\.spring\\.SpringApplicationConfigurationFactory(\\$.*)?",
8888
"com\\.vaadin\\.flow\\.spring\\.SpringLookupInitializer(\\$.*)?",
8989
"com\\.vaadin\\.flow\\.spring\\.VaadinConfigurationProperties",
90-
"com\\.vaadin\\.flow\\.spring\\.AtmosphereHintsRegistrar",
91-
"com\\.vaadin\\.flow\\.spring\\.VaadinBeanFactoryInitializationAotProcessor",
92-
"com\\.vaadin\\.flow\\.spring\\.VaadinHintsRegistrar",
9390
"com\\.vaadin\\.flow\\.spring\\.SpringDevToolsPortHandler",
91+
"com\\.vaadin\\.flow\\.spring\\.springnative\\.AtmosphereHintsRegistrar",
92+
"com\\.vaadin\\.flow\\.spring\\.springnative\\.VaadinBeanFactoryInitializationAotProcessor",
93+
"com\\.vaadin\\.flow\\.spring\\.springnative\\.VaadinBeanFactoryInitializationAotProcessor\\$Marker",
94+
"com\\.vaadin\\.flow\\.spring\\.springnative\\.VaadinHintsRegistrar",
9495
"com\\.vaadin\\.flow\\.spring\\.scopes\\.VaadinSessionScope",
9596
"com\\.vaadin\\.flow\\.spring\\.scopes\\.AbstractScope",
9697
"com\\.vaadin\\.flow\\.spring\\.scopes\\.VaadinUIScope",

0 commit comments

Comments
 (0)