Inject In Sling Model

adobe/skills/plugins/aem/cloud-service/skills/code-assessment/inject-in-sling-model

by adobe940b8795c0dfApache-2.0197 starsListed Oct 9, 2026Updated Oct 8, 2026Repository updated today

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.

Instructions onlySoftware Development
AI-generated overview

Migrates javax.inject @Inject fields in AEM Sling Model classes to injector-specific annotations.

What it does
This skill supplies detection criteria and a migration recipe for AEM as a Cloud Service projects: it identifies @Model classes that have field-level @Inject annotations and replaces each one with an injector-specific annotation such as @ValueMapValue, @OSGiService or @SlingObject. The replacement is chosen deterministically from the field's declared Java type using a decision table, with companion annotations like @Named, @Default, @Via and @Optional handled and imports updated. It is instructions only and produces edited Java source files, not commits.
When to use it
Use it when modernizing Sling Models in an AEM project, for example fixing @Inject usage in a specific model class or scanning a project for @Inject misuse. It applies to field-level @Inject in @Model classes; constructor-parameter and setter-method @Inject are out of scope and cause a file-level skip.
Requirements
Requires an AEM Java project with Sling Model classes and the referenced analyzer script and runbook from the surrounding skill collection; no scripts ship with this skill itself, and no credentials or network access are stated.

@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
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

  • Each migrated field maps to exactly one injector-specific annotation per the decision table
  • Sling objects (Resource / ResourceResolver / request / response) → @SlingObject, not @Self
  • @Named merged into the new annotation's name; @Default / @Via preserved
  • @Optional → per-field injectionStrategy = InjectionStrategy.OPTIONAL (never a class-level defaultInjectionStrategy change)
  • Unused imports removed; new imports added and ordered per the file's convention
  • File-level skip respected — no partial migration of a file with any ambiguous field

Recipe

Read recipe.md [blocked] 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.

Source and attribution

Source:adobe/skillsinplugins/aem/cloud-service/skills/code-assessment/inject-in-sling-modelat commit940b879

License: Apache-2.0

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal