[
https://issues.apache.org/jira/browse/MYFACES-4770?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Thomas Andraschko resolved MYFACES-4770.
----------------------------------------
Resolution: Fixed
> ViewScopeCDIMap.put() returns internal ContextualInstanceInfo instead of the
> previous value
> -------------------------------------------------------------------------------------------
>
> Key: MYFACES-4770
> URL: https://issues.apache.org/jira/browse/MYFACES-4770
> Project: MyFaces Core
> Issue Type: Bug
> Affects Versions: 4.0.4, 4.1.4
> Reporter: Markus Jung
> Priority: Major
> Fix For: 5.0.0, 4.0.5, 4.1.5
>
>
> When CDI is available, UIViewRoot#getViewMap() is backed by ViewScopeCDIMap.
> Its put() returns whatever the underlying contextual storage returns, which
> is the previous internal ContextualInstanceInfo wrapper and not the previous
> value:
> {code:java}
> ContextualInstanceInfo info = new ContextualInstanceInfo();
> info.setContextualInstance(value);
> return getCreationalContextInstances().put(beanKey, info);
> {code}
> get() and remove() in the same class unwrap via info.getContextualInstance(),
> put() doesn't.
> UIViewRoot#getViewMap(boolean) specifies the view scope as a plain
> java.util.Map ([Faces 4.1
> Javadoc|https://jakarta.ee/specifications/faces/4.1/apidocs/jakarta.faces/jakarta/faces/component/UIViewRoot.html#getViewMap(boolean)])
> and only adds requirements for clear(), so the Map contract applies
> ([Map#put|https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Map.html#put(K,V)]):
> bq. Returns: the previous value associated with key, or null if there was no
> mapping for key.
> Example:
> {code:java}
> var viewMap = facesContext.getViewRoot().getViewMap();
> viewMap.put("key", "first");
> Object previous = viewMap.put("key", "second");
> // expected "first", actual
> org.apache.myfaces.cdi.util.ContextualInstanceInfo@608f1caa
> {code}
> I ran into this in an application that does
> {code:java}
> if (value.equals(viewMap.put(KEY, value))) { return; }
> {code}
> which never matches with MyFaces + CDI, so the "only act when the value
> changed" logic ran on every request.
> Fix is to unwrap the previous ContextualInstanceInfo in put() the same way
> remove() already does. The behavior goes back to the original implementation
> and is still present in 4.0.4, 4.1.4 and main.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)