Grid Filter Null value

Hi,

I’m trying a simple example of filter:

  1. First I define my DataProvider. This DataProvider is located in an AbstractClass, but T = User in this case.
DataProvider<T, String> dataProvider =
    DataProvider.fromFilteringCallbacks(
    query -> {
        // getFilter returns Optional<String>
        String filter = query.getFilter().orElse(null);
        return entityDataService.getItems(query.getOffset(), query.getLimit(), query.getSortOrders(), filter).stream();
    },
    query -> {
        return entityDataService.count();
    }
);
this.grid.setDataProvider(dataProvider);
  1. Then the text field and the DataProvider wrapper
TextField nameFilter = new TextField();
nameFilter.setPlaceholder("filter by name");
nameFilter.addStyleName(ValoTheme.TEXTFIELD_SMALL);

ConfigurableFilterDataProvider<User, Void, String> wrapper;
wrapper = grid.getDataProvider().withConfigurableFilter();
nameFilter.addValueChangeListener(valueChangeEvent -> {
    wrapper.setFilter(valueChangeEvent.getValue());
});

Everything works nice, sorting, pagination, etc, but query.getFilter().orElse(null) is always returning null. I have verified that wrapper.setFilter(valueChangeEvent.getValue()) is setting the filter value correctly. Any ideas as to what could be the problem?

Thanks,

Julio

Solved it. After:

wrapper = grid.getDataProvider().withConfigurableFilter(); had to:

grid.setDataProvider(wrapper); Julio

Hi, I try this solution with vaadin 14, and as soon as i enter second Character in textfield Filter, i have an exception:

java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Void (java.lang.String and java.lang.Void are in module java.base of loader ‘bootstrap’)
at com.vaadin.flow.data.provider.FilterUtils.combineFilters(FilterUtils.java:56)
at com.vaadin.flow.data.provider.DataProvider$2.combineFilters(DataProvider.java:240)
at com.vaadin.flow.data.provider.ConfigurableFilterDataProviderWrapper.getFilter(ConfigurableFilterDataProviderWrapper.java:59)
at com.vaadin.flow.data.provider.DataProviderWrapper.size(DataProviderWrapper.java:86)
at com.vaadin.flow.data.provider.DataProviderWrapper.size(DataProviderWrapper.java:85)
at com.vaadin.flow.data.provider.DataCommunicator.getDataProviderSize(DataCommunicator.java:336)
at com.vaadin.flow.data.provider.DataCommunicator.flush(DataCommunicator.java:453)
at com.vaadin.flow.data.provider.DataCommunicator.lambda$requestFlush$2f364bb9$1(DataCommunicator.java:425)
at com.vaadin.flow.internal.StateTree.lambda$runExecutionsBeforeClientResponse$1(StateTree.java:368)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
at com.vaadin.flow.internal.StateTree.runExecutionsBeforeClientResponse(StateTree.java:365)
at com.vaadin.flow.server.communication.UidlWriter.encodeChanges(UidlWriter.java:411)
at com.vaadin.flow.server.communication.UidlWriter.createUidl(UidlWriter.java:187)
at com.vaadin.flow.server.communication.UidlRequestHandler.writeUidl(UidlRequestHandler.java:121)
at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1540)
at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:247)
at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:95)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)

The exception occurs in combineFilters method.

Can you help me? Any Ideas?

`default <Q, C> ConfigurableFilterDataProvider<T, Q, C> withConfigurableFilter(
        SerializableBiFunction<Q, C, F> filterCombiner) {
    return new ConfigurableFilterDataProviderWrapper<T, Q, C, F>(this) {
        @Override
        protected F combineFilters(Q queryFilter, C configuredFilter) {
            return FilterUtils.combineFilters(filterCombiner, queryFilter,
                    configuredFilter);
        }
    };
}`

João Levy:
Hi, I try this solution with vaadin 14, and as soon as i enter second Character in textfield Filter, i have an exception:

I solved the problem By changing From:

ConfigurableFilterDataProvider<T, Void, String> filteredDataProvider = dataProvider.withConfigurableFilter();

TO:

ConfigurableFilterDataProvider<T, String, String> filteredDataProvider = dataProvider.withConfigurableFilter((String queryFilter, String filter) -> filter);

But i’m completely ignoring any filter that comes from an upstream query, So The first option is the way to go.