I have a composite component with an interface that contains this:
<cc:attribute name="model"
shortDescription="Bean that contains Location" >
<cc:attribute name="location" type="pkg.Location"
required="true" />
</cc:attribute>
</cc:interface>
So I can access the Location object in the markup with #{cc.attrs.model.location}.
I also access that object from the backing bean of the composite component like this:
FacesContext fc = FacesContext.getCurrentInstance();
Object obj = fc.getApplication().evaluateExpressionGet(fc,
"#{cc.attrs.model.location}", Location.class);
So now my composite component has done its work -- how do I call the setter method on the model from the backing bean? (i.e. model.setLocation(someValue) ?
Use ValueExpression#setValue()
.
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ValueExpression valueExpression = facesContext.getApplication().getExpressionFactory()
.createValueExpression(elContext, "#{cc.attrs.model.location}", Location.class);
valueExpression.setValue(elContext, newLocation);
The Application#evaluateExpressionGet()
by the way calls ValueExpression#getValue()
under the covers, exactly as described by its javadoc (if you have ever read it...)
Unrelated to the concrete problem, are you aware about the possibility to create backing UIComponent
class for the composite component? I bet that this is much easier than fiddling with ValueExpression
s this way. You could then just use the inherited getAttributes()
method to get the model
.
Model model = (Model) getAttributes().get("model);
// ...
You can find an example in our composite component wiki page.