Esta conversa foi bloqueada devido à inatividade. Crie uma nova publicação.
Nível 1
Nível 2
Faça login na Comunidade
Faça logon para exibir todas as medalhas
Esta conversa foi bloqueada devido à inatividade. Crie uma nova publicação.
i want to adapt to sling model from another sling model. While doing so the SlingHttpServletRequest request is always null in second sling model. i tried with @Inject, @self and @@SlingObject. I am able to get request in FirstModel but not in SecondModel, i believe this happens because SecondModel is getting adapted with resource. Had anyone faced this issue and how it worked..
Thanks in advance
basically my code is simlilar to:
@Model(
adaptables = {SlingHttpServletRequest.class, Resource.class},
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL
)
public class SecondModel {
@Inject
private SlingHttpServletRequest request;
}
@Model(
adaptables = SlingHttpServletRequest.class,
resourceType = "mycomponent path",
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL
)
public class FirstModel {
@Inject
private SlingHttpServletRequest request;
@PostConstruct
public void initResource() {
SecondModel obj = request.getResourceResolver().getResource(resourcePath).adaptTo(SecondModel .class)
}
}
Solucionado! Ir para a Solução.
Visualizações
respostas
Total de curtidas
The problem is that the SlingModel AdapterFactory cannot do the adaption properly, because it does not know about the details of FirstModel to inject the request into the SecondModel.
Either you adapt the request directly to SecondModel or you write a custom AdapterFactory which can the proper adaption from FirstModel to SecondModel. This is indepdent of the AEM version you use.
Visualizações
respostas
Total de curtidas
Check if ResourceWrapper (Apache Sling (Builder) 6 API) or acs-aem-samples/SampleResourceWrapper.java at master · Adobe-Consulting-Services/acs-aem-samples · G... works for your use case?
Visualizações
respostas
Total de curtidas
You may try to adaptTo() another Model with request instead of resource and check it that works. Never tried adapting with request but it's just a thought.
https://taradevko.com/aem/sling-model-request-parameter-injector/ - This article might help as fits your scenario.
Visualizações
respostas
Total de curtidas
Hi,
can you show the code you are using to adapt FirstModel to SecondModel? My impression is that the (default) AdapterFactory which is behind these adaptions for the SlingModel cannot handle that case, but because the Request injection is marked as optional, it does not fail.
If you want to handle that case of adapting FirstModel to SecondModel, it's probably best to write a custom AdapterFactory.
Jörg
Visualizações
respostas
Total de curtidas
Visualizações
respostas
Total de curtidas
With request.adaptTo() throws error with complaining unable to bind the injected value
Visualizações
respostas
Total de curtidas
already tried and still request is null
Visualizações
respostas
Total de curtidas
it's not failing but request comes out to be null and my requirement is to get complete Url of the page in sling model class
Visualizações
respostas
Total de curtidas
Just for an update i am using aem 6.3.2.0
Visualizações
respostas
Total de curtidas
In that case, one way is instantiating the model class by creating object and passing request (via constructor or setter). That's the traditional Java way of handling things.
Otherwise, you'll have to write custom AdaptorFactory.
Visualizações
respostas
Total de curtidas
Not Sure if adapTo() accept any parameter other than class name. if you have any reference doc that will be helpful
Visualizações
respostas
Total de curtidas
adapTo() only accept adapting class name. If you need to adapt to request, the link I shared in 1st reply describes how can you create custom adaptorfactory to adapt to request instead of resource.
https://taradevko.com/aem/sling-model-request-parameter-injector/
Visualizações
respostas
Total de curtidas
Visualizações
respostas
Total de curtidas
i tried this code but it's not working, possible because i am using 6.3.2.0 and the example is for aem 6.4. Not sure if this is the reason
Visualizações
respostas
Total de curtidas
The problem is that the SlingModel AdapterFactory cannot do the adaption properly, because it does not know about the details of FirstModel to inject the request into the SecondModel.
Either you adapt the request directly to SecondModel or you write a custom AdapterFactory which can the proper adaption from FirstModel to SecondModel. This is indepdent of the AEM version you use.
Visualizações
respostas
Total de curtidas
If it doesn't work, you can get resource using resource itself.
@Model(adaptables = Resource.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class SecondModel {
@Self
Resource resource;
@PostConstruct
public void initResource() {
SecondModel obj = resource.getResourceResolver().getResource(resourcePath).adaptTo(SecondModel .class)
}
}
Visualizações
respostas
Total de curtidas
resource.getResourceResolver().getResource(resourcePath).adaptTo(SecondModel .class) works but request object in FirstModel always remain null.
Visualizações
respostas
Total de curtidas
Hi I tried the example whicj I shared with you earlier it works for me.
Performing Sling Model Adaptation Using Request and Resource Objects
@Model
(adaptables = {SlingHttpServletRequest.
class
, Resource.
class
}, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public
class
FirstModel {
@SlingObject
private
SlingHttpServletRequest request;
@PostConstruct
public void initResource() {
SecondModel obj = request.getResourceResolver().getResource(resourcePath).adaptTo(SecondModel .class)
}
}
With this approach request object should be available in FirstModel but not in SecondModel.
You should check the imports if doesn't work.
But if resource.getResourceResolver().getResource(resourcePath).adaptTo(SecondModel .class) works, you can use it.
Visualizações
respostas
Total de curtidas
Yes, request is available in FirstModel and also adaptTo() works. My problem is that i have
@SlingObject
private
SlingHttpServletRequest request;
also in SecondModel. This secondModel class uses request object to get requestURl from request and italways remains null. So, if i have above requirement then how can in inject request in SecondModel
Visualizações
respostas
Total de curtidas
you can try with the approach suggested by @Jörg Hoh
Visualizações
respostas
Total de curtidas
Visualizações
Curtida
respostas
Visualizações
Curtida
respostas