Unfortunately, method expressions does not accept value expressions. Your best bet is to have a single method entry point which in turn delegates further to the desired action methods based on the detailsMode
which you also pass/set to the bean.
E.g.
<h:dataTable ... rowSelectListener="#{cc.attrs.bean.onRowSelect}">
public void onRowSelect(SelectEvent event) {
if ("single".equals(detailsMode)) {
onRowSingleSelect(event);
} else {
onRowUrlSelect(event);
}
}
Given that you're actually using a composite component, you can if necessary hide it away in the backing component to reduce boilerplate in backing bean:
<cc:interface componentType="yourComponent">
...
<h:dataTable ... rowSelectListener="#{cc.onRowSelect}">
@FacesComponent("yourComponent")
public class YourComponent extends UINamingContainer {
public void onRowSelect(SelectEvent event) {
String methodName = "single".equals(detailsMode) ? "onRowSingleSelect" : "onRowUrlSelect";
MethodExpression method = (MethodExpression) getAttributes().get(methodName);
method.invoke(getFacesContext().getELContext(), new Object[] { event });
}
}