You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2025/11/12 17:33:14 UTC
(sling-site) branch master updated: Update documentation on Sling Model constructors and injectors
This is an automated email from the ASF dual-hosted git repository.
kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-site.git
The following commit(s) were added to refs/heads/master by this push:
new 855974a71 Update documentation on Sling Model constructors and injectors
855974a71 is described below
commit 855974a71878b7a9f3d605f823d05c8d044ea875
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Wed Oct 29 17:15:17 2025 +0100
Update documentation on Sling Model constructors and injectors
Clarify constructor injection requirements and adaptable types for Sling
Models. Clarify support for records.
---
.../jbake/content/documentation/bundles/models.md | 28 +++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/src/main/jbake/content/documentation/bundles/models.md b/src/main/jbake/content/documentation/bundles/models.md
index d253f6d36..9eaf3132f 100644
--- a/src/main/jbake/content/documentation/bundles/models.md
+++ b/src/main/jbake/content/documentation/bundles/models.md
@@ -88,11 +88,37 @@ Constructor injection is also supported (as of [Sling Models 1.1.0](https://issu
}
}
-Because the name of a constructor argument parameter cannot be detected via the Java Reflection API a `@Named` annotation (or a `name` element on injector specific annotations) is mandatory for injectors that require a name for resolving the injection.
+Because the name of a constructor argument parameter cannot be detected via the Java Reflection API a `@Named` annotation (or a `name` element on injector specific annotations) is mandatory for injectors that require a name for resolving the injection. This restriction can be bypassed since [Sling Models 1.7.0](https://issues.apache.org/jira/browse/SLING-11917) when the compiler generates metadata for method names via [javac option `-parameters`](https://docs.oracle.com/en/java/javase/21 [...]
In order for a constructor to be used for injection *it has to be annotated on method level with `@Inject`*. In addition using injector-specific annotations on parameter level is supported.
+You can also reference the adaptable itself via a constructor argument with the `@Self` annotation.
Constructors may use any visibility modifier (as of [Sling Models 1.5.0](https://issues.apache.org/jira/browse/SLING-8069)).
+In addition to that constructors taking a single argument of the adaptable type are supported. Those don't need any annotations. So
+
+ ::java
+ @Model(adaptables=Resource.class)
+ public class MyModel {
+ @Inject
+ public MyModel(@Self Resource resource) {
+ // constructor code
+ }
+ }
+
+and
+
+ ::java
+ @Model(adaptables=Resource.class)
+ public class MyModel {
+ public MyModel(Resource resource) {
+ // constructor code
+ }
+ }
+
+are functionally equivalent.
+
+The implicit constructors of [record classes] are supported since [Sling Models 1.7.0](https://issues.apache.org/jira/browse/SLING-12359) as well.
+
## @Model and Adaptable Types
When defining a Sling Model class, the `adaptables` parameter to the `@Model` annotation is mostly determined by the injectors being used. The provided class must satisfy the needs of all injectors (for the details see [the table below](#available-injectors-1)). For example if the model class only uses the `ValueMap` injector, the adaptables parameter can be a `Resource`, a `SlingJakartaHttpServletRequest`, a `SlingHttpServletRequest` or both. But if the `Request Attribute` injector is u [...]