| name | inject-in-sling-model |
| description | AEM Cloud Service expert skill — migrate javax.inject.@Inject fields in Sling Model (@Model) classes to injector-specific annotations (@ValueMapValue / @OSGiService / @SlingObject). Self-discoverable (scan for @Model classes with field-level @Inject); the replacement is chosen deterministically from each field's declared type. Use for "fix @Inject in HeroModel.java", "modernize my Sling Models", or when scanning an AEM project for @Inject misuse. Detailed decision table, companion-annotation handling, import management, and file-level skip policy are in recipe.md.
|
| license | Apache-2.0 |
@Inject in Sling Models — AEM as a Cloud Service
This pattern is executed by the code-assessment runbook — follow ../references/runbook.md for the full flow (preflight → plan → apply → verify, run log). This skill supplies the detection + recipe the runbook applies.
Overview
javax.inject.@Inject on fields of @Model classes is discouraged by the Apache Sling Models documentation. Removing @Inject without a replacement breaks injection, so each field is migrated to an injector-specific annotation chosen from its declared type.
Classification — confirm this pattern applies
- A
*.java file whose class is annotated @Model, with at least one field annotated @Inject.
- Constructor-parameter and setter-method
@Inject are out of scope (trigger the file-level skip).
Discovery
Detection is performed by the analyzer (../scripts/analyze.sh), run by
the runbook:
bash ../scripts/analyze.sh <workspace-root> --pattern inject-in-sling-model
Match criteria (what the detector flags): a class annotated @Model
(org.apache.sling.models.annotations.Model, confirmed import-aware) with at least one field
annotated @Inject (javax.inject.Inject or jakarta.inject.Inject). One finding per matching
field. Constructor/setter @Inject and non-@Model classes are not flagged. The replacement
annotation is chosen from the field's declared type by the decision table in recipe.md.
Resolution contract
self-evident — the replacement annotation is fully determined by the field's declared Java type via the decision table in recipe.md. No external input is required.
Review checklist
Recipe
Read recipe.md in full before editing: input contract, decision table, companion annotations, import management, unlocatable / skip-file policy, per-file procedure, before/after example, editing strategy.
Handoff
The skill never commits. See ../references/git-workflow.md for git vs in-place handoff and the suggested commit message.