【发布时间】:2014-12-15 16:25:24
【问题描述】:
我有一个带有richfaces 3.3 的过滤器,它不执行filterMethod 中给出的方法。
过滤器:
<r:column filterMethod="#{orderSearchFilter.filterStateText}" >
<f:facet name="header">
<h:selectOneMenu value="#{orderSearchFilter.filterValueStateText}">
<f:selectItems value="#{orderSearchFilter.filterListStateTexts}" />
<a:support event="onchange" reRender="orders,dataScroller_foot" />
</h:selectOneMenu>
</f:facet>
<h:outputText value="#{_data.status}"/>
</r:column>
过滤Bean:
import java.util.ArrayList;
import javax.faces.model.SelectItem;
import org.jboss.seam.annotations.Name;
import ch.ildsoftware.gvs.order.OrderItem;
@Name("orderSearchFilter")
public class OrderSearchFilter {
private ArrayList<SelectItem> filterListStateTexts = new ArrayList<SelectItem>();
private String filterValueInventoryNr="";
private String filterValueSerialNr="";
private SelectionStateText filterValueStateText;
public OrderSearchFilter() {
for(SelectionStateText sT : SelectionStateText.values()) {
SelectItem select = new SelectItem();
select.setLabel(sT.label());
select.setValue(sT);
filterListStateTexts.add(select);
}
}
public ArrayList<SelectItem> getFilterListStateTexts() {
return filterListStateTexts;
}
public String getFilterValueInventoryNr() {
return filterValueInventoryNr;
}
public void setFilterValueInventoryNr(String filterValueInventoryNr) {
this.filterValueInventoryNr = filterValueInventoryNr;
}
public String getFilterValueSerialNr() {
return filterValueSerialNr;
}
public void setFilterValueSerialNr(String filterValueSerialNr) {
this.filterValueSerialNr = filterValueSerialNr;
}
public SelectionStateText getFilterValueStateText() {
return filterValueStateText;
}
public void setFilterValueStateText(SelectionStateText filterValueStateText) {
this.filterValueStateText = filterValueStateText;
}
public Boolean filterStateText(Object current) {
OrderItem item = (OrderItem) current;
SelectionStateText state = getFilterValueStateText();
for(String status : state.states()) {
if (status.isEmpty() || status.equals(item.getStatus()))
return true;
}
return false;
}
public Boolean getFilterStateText(Object current) {
OrderItem item = (OrderItem) current;
SelectionStateText state = getFilterValueStateText();
for(String status : state.states()) {
if (status.isEmpty() || status.equals(item.getStatus()))
return true;
}
return false;
}
}
我发现了不同的实现,这就是为什么该方法写了两次,一次以get 为前缀。现在我基本上保持以下示例:http://livedemo.exadel.com/richfaces-demo/richfaces/filteringFeature.jsf?tab=ex-usage&cid=4110192
在调试器中我可以看到,过滤器值已设置(setFilterValueStateText),但没有调用过滤器方法。
我所看到的,它跳转到另一个类的modify() 方法,其中filterMethod 之后的字符串弹出为FilterField(不是ExtendedFilterField),但是过滤bean 是不可访问的以其当前值。在这个类中处理其他过滤器:
public class OrderSearchDataModel extends QueryDataModel implements Modifiable
{
private OrderSearchCriteria orderSearchCriteria;
public OrderSearchDataModel(OrderSearch query)
{
super(query);
}
@Override
public void modify(List<FilterField> filterFields,
List<SortField2> sortFields)
{
if (filterFields != null && !filterFields.isEmpty()) {
ExtendedFilterField extendedFilterField = null;
String value = null;
Expression expression = null;
String expressionStr = null;
orderSearchCriteria = new OrderSearchCriteria();
for (FilterField filterField : filterFields) {
if (filterField instanceof ExtendedFilterField) {
extendedFilterField = (ExtendedFilterField) filterField;
value = extendedFilterField.getFilterValue();
if (value != null && !value.equals("")) {
expression = extendedFilterField.getExpression();
expressionStr = expression.getExpressionString();
if (!expression.isLiteralText()) {
expressionStr = expressionStr.
replaceAll("[#|$]{1}\\{.*?\\.", "").
replaceAll("\\}", "");
}
if (expressionStr.equals("inventoryNr"))
orderSearchCriteria.setInventoryNr(value);
if (expressionStr.equals("serialNr"))
orderSearchCriteria.setSerialNr(value);
OrderSearch orderSearch = (OrderSearch) getQuery();
orderSearch.setSearchCriteria(orderSearchCriteria);
}
}
}
}
Set<SortField2> validSortFields = new HashSet<SortField2>();
for (SortField2 sortField : sortFields)
{
if (!sortField.getOrdering().equals(Ordering.UNSORTED))
validSortFields.add(sortField);
}
if (validSortFields.size() == 1)
{
SortField2 sortfield = validSortFields.iterator().next();
ValueExpression expression = (ValueExpression) sortfield
.getExpression();
OrderSearchField field = (OrderSearchField) expression.getValue(FacesContext
.getCurrentInstance().getELContext());
boolean asc = sortfield.getOrdering().equals(Ordering.ASCENDING);
Sorting<OrderSearchField> sorting = new Sorting<OrderSearchField>(
field, asc);
OrderSearch orderSearch = (OrderSearch) getQuery();
orderSearch.setSorting(sorting);
}
else if(validSortFields.size() > 1) throw new FacesException("multiple column sorting is not suported");
}
}
我做错了什么?
【问题讨论】: