SlingModels: внедрение другой модели из запроса SlingHttpServletRequest
Одной из причин моего другого вопроса является следующий вариант использования: я хочу создать TextImageModel, который использует мой ImageModel как внедренное свойство и расширяет мой TextModel:
@Model(adaptables = {SlingHttpServletRequest.class})
public class TextImageModel extends TextModel {
@Inject
private ImageModel image;
}
Но это не работает. Это должно работать, когда я буду использовать Resource
как адаптируемый, но мне нужно SlingHttpServletRequest в моей ImageModel и TextModel, а также:
@Model(adaptables = {SlingHttpServletRequest.class})
public class ImageModel {
@SlingObject
private SlingHttpServletRequest request;
@SlingObject
private Resource resource;
}
Как я могу ввести ImageModel, используя запрос как адаптируемый? Ресурс изображения является дочерним ресурсом с именем image
2 ответа
Используйте ModelFactory:
...
import com.adobe.cq.wcm.core.components.models.Image;
import org.apache.sling.models.factory.ModelFactory;
...
@Inject
private ModelFactory modelFactory;
@Self
private SlingHttpServletRequest request;
private Image image;
@PostConstruct
protected void postInit() {
image = modelFactory.getModelFromWrappedRequest(request, resource.getChild("image"), Image.class);
...
}
Надеюсь, это должно сработать.
Вы можете использовать @Self вместо @Inject, но у вас будет тот же ресурс в ImageModel, что и в TextImageModel. Не детский "имидж", как хотелось бы. Afaik при адаптации из запроса, ресурс всегда будет читаться из запроса.
@Model(adaptables = {SlingHttpServletRequest.class})
public class TextImageModel extends TextModel {
@Self
private ImageModel image;
}
Если вы хотите сделать инъекцию из определенного другого типа, чем ваш адаптируемый, то вы можете использовать @Inject @Via("resource")
больше здесь: https://sling.apache.org/documentation/bundles/models.html
Я не уверен, будет ли это работать с моделью, а не со свойством