hi paul,

in this (unfortunate) case the only (simple) option is a producer-method
with @Dependent instead of @FacesScoped (which doesn't make sense at all).
+ we have to document that users have to be careful (if they believe that
they need to use it).
i still don't really see the use-case outside the context of the component
itself and artifacts like validators have access to the current component
anyway.

regards,
gerhard



2017-09-01 15:33 GMT+02:00 Paul Nicolucci <[email protected]>:

> It looks like the JSF 2.3 spec says the following about this:
>
> 5.6.3 CDI for EL Resolution
> If the any of the managed beans in the application have the
> @javax.faces.annotation.FacesConfig
> annotation, the ImplicitObjectELResolver from Section 5.6.2.1 “Implicit
> Object ELResolver for Facelets and
> Programmatic Access” is not present in the chain. Instead, CDI is used to
> perform EL resolution in the same manner is
> in Section TABLE 5-11 “ImplicitObjectELResolver for Programmatic Access”
> with the following additional implicit
> objects:
> ? externalContext
> ? the current ExternalContext from the current FacesContext
>
> This to me means that if you have the @FacesConfig annotation in your app
> the Implicit ELResolver is not available and we need to use CDI to perform
> the implicit object lookup. So I don't think we can depend on the
> ELResolver in this instance.
>
> Regards,
>
> Paul Nicolucci
>
>
> [image: Inactive hide details for Gerhard Petracek ---09/01/2017 09:17:05
> AM---yes - there are some cases which would break with interf]Gerhard
> Petracek ---09/01/2017 09:17:05 AM---yes - there are some cases which would
> break with interface-proxies and some with subclass-proxies.
>
> From: Gerhard Petracek <[email protected]>
> To: MyFaces Development <[email protected]>
> Date: 09/01/2017 09:17 AM
> Subject: Re: JSF 2.3: Scopes of new CDI artifact in
> FacesScopeObjectProducer
> ------------------------------
>
>
>
> yes - there are some cases which would break with interface-proxies and
> some with subclass-proxies. subclass-proxies would just support the
> instanceof checks used by some component-libraries, but would only work if
> just the resolved instance but not the type of the resolved instance would
> change (per dependent-scoped subclass-proxy instance).
>
> -> therefore i (still) prefer the el-resolver (if possible).
>
> please notice that even dependent-scoped beans can cause side-effects here
> (depending on the scope of the instance which stores such a
> dependent-scoped bean).
> you could only bypass possible side-effects in this special case if
> consuming instances don't store the resolved bean + use an approach like
> org.apache.deltaspike.core.api.provider.DependentProvider for them.
> -> in this case you could use injected instances only if you know all the
> implications -> resovling the instances via el-resolver is easier...
>
> regards,
> gerhard
>
>
>
> 2017-09-01 14:15 GMT+02:00 Thomas Andraschko <
> *[email protected]* <[email protected]>>:
>
>    I fear that even proxies would not solve this problem as the compoent
>    classes can be different (e.g. HtmlInputText <> HtmlCommandButton).
>    So the only solution is to use @Dependent which leads to worse
>    performance.
>
>    As you already said Gerhard, a producer doesn't make sense here.
>    Neither as a ELResolver replacement, nor for using @Inject UIComponent.
>
>    2017-09-01 12:25 GMT+02:00 Gerhard Petracek <*[email protected]*
>    <[email protected]>>:
>    @thomas: +1
>
>    if we don't need to use producers here, we should drop them again.
>    (if someone would use it as a kind of "component-binding", it would be
>    broken in almost every case.)
>    -> the el-resolver approach mentioned by thomas is the only reliable
>    way here.
>    if we have to keep those producers, we have a spec. issue here and the
>    best chance to limit the possible side-effects to a minimum are
>    dependent-scoped instances and/or subclass-proxies which intercept all
>    public method-calls to resolve the current instance lazily.
>
>    regards,
>    gerhard
>
>
>
>    2017-09-01 9:42 GMT+02:00 Thomas Andraschko <
>    *[email protected]* <[email protected]>>:
>       Hi,
>
>       i just checked the FacesScopeObjectProducer:
>
>          @Produces
>          @Named("component")
>          @FacesScoped
>          public UIComponent getComponent()
>          {
>              return UIComponent.getCurrentComponen
>       t(FacesContext.getCurrentInstance());
>          }
>
>          @Produces
>          @Named("cc")
>          @FacesScoped
>          public UIComponent getCompositeComponent()
>          {
>              return UIComponent.getCurrentComposit
>       eComponent(FacesContext.getCurrentInstance());
>          }
>
>       I wonder if this is this the right scope for it?
>       Shoudln't it be @Dependendent as the component changes multiple
>       times?
>       Not sure about the performance then... I think it would be perform
>       much slower as in 2.2.
>       Does 2.3 force us to use @Named instead ElResolver for it?
>
>       Regards,
>       Thomas
>
>
>
>
>
>

Reply via email to