yes, thank you, that's the reason! The problem is the Comparator in TreeMap.
 
I prefer to use your second proposed solution, however my service returns 
Map<DataGroup, List<Report>> and I render the result in two nested ListView as 
follows:

            final Map<DataGroup, List<Report>> listPerGroup = 
reportService.listPerGroup();

            add(new ListView<DataGroup>("group", new 
ArrayList<>(listPerGroup.keySet())) {

                @Override
                protected void populateItem(ListItem<DataGroup> groupItem) {
                    DataGroup group = groupItem.getModelObject();               
     ...

                    groupItem.add(new ListView<Report>("report", 
listPerGroup.get(group)) {

                        @Override
                        protected void populateItem(ListItem<Report> item) {
                            final Report report = item.getModelObject();        
                    ...
                        }
                    });
                }
            });

In this approach, is it possible to use LoadableDetachableModel or I must 
change my return type? I want to learn the Wicket way.
    On Thursday, June 21, 2018, 4:48:25 PM GMT+4:30, Sven Meier 
<s...@meiers.net> wrote:  
 
 Hi,

your service method is return a TreeMap holding a lambda comparator:

    Comparator.comparing(DataGroup::getName)

Either you make that comparator serializable (you can but you don't *need* to 
use org.danekja as Wicket does it):

    https://stackoverflow.com/questions/22807912/how-to-serialize-a-lambda

... or don't keep the result of your service method in the Wicket component 
tree, e.g. by using a LoadableDetachableModel.

Have fun
Sven




Am 21.06.2018 um 13:26 schrieb m.xinu:
> I manually create the Spring context, which is 
> ClassPathXmlApplicationContext, and pass it to Wicket application by calling
>
>      getComponentInstantiationListeners().add(new 
>SpringComponentInjector(this, MyApp.get().getApplicationContext())).
>
> Then, In my panel I have this
>
>      private class ReportMenuPanel extends WPanel {
>          private static final long serialVersionUID = -9012565863392514416L;
>
>          @Inject
>          private IReportService reportService;
>
>          ...
>      }
>
> I also checked my code with @SpringBean and I got the same exception.
>  
>
>      On Thursday, June 21, 2018, 3:30:29 PM GMT+4:30, Andrea Del Bene 
><an.delb...@gmail.com> wrote:
>  
>  I think you are keeping a reference to your Spring bean in a page or in a
> component, that's why Wicket is trying to serialize it. Are you injecting
> this bean with @SpringBean annotation?
>
> On Thu, Jun 21, 2018 at 12:45 PM, m.xinu <mehdi_x...@yahoo.com.invalid>
> wrote:
>
>> Thanks for your reply.
>>
>> Both of your proposed solutions mean using other interfaces in the Lambda
>> expressions. However most of my Lambda definitions are in my Service tier
>> classes (Spring beans), and the Service tier must be independent from the
>> Web tier, and the force of Wicket serialization (even for the service
>> beans) breaks the aforementioned rule. Is there another solution? Is it
>> possible for Wicket not to serialize the Spring beans? or is there another
>> serialization mechanism in Wicket not based on Serializable interface?
>>
>>
>>      On Thursday, June 21, 2018, 5:44:00 AM GMT+4:30, Maxim Solodovnik <
>> solomax...@gmail.com> wrote:
>>
>>    Wicket7:
>> https://github.com/wicketstuff/core/blob/wicket-
>> 7.x/lambda-parent/lambda/src/main/java/org/wicketstuff/
>> lambda/SerializableBiConsumer.java
>>
>> WBR, Maxim
>> (from mobile, sorry for the typos)
>>
>> On Thu, Jun 21, 2018, 08:13 Maxim Solodovnik <solomax...@gmail.com> wrote:
>>
>>> https://cwiki.apache.org/confluence/display/WICKET/
>> Migration+to+Wicket+8.0#MigrationtoWicket8.0-
>> Provideserializableversionsofjava.util.function.(Supplier|
>> Consumer|Function|BiConsumer)ASFJIRA5aa69414-a9e9-3523-
>> 82ec-879b028fb15bWICKET-5991
>>> <https://cwiki.apache.org/confluence/display/WICKET/
>> Migration+to+Wicket+8.0#MigrationtoWicket8.0-
>> Provideserializableversionsofjava.util.function.(Supplier%
>> 7CConsumer%7CFunction%7CBiConsumer)ASFJIRA5aa69414-a9e9-3523-82ec-
>> 879b028fb15bWICKET-5991>
>>> WBR, Maxim
>>> (from mobile, sorry for the typos)
>>>
>>> On Wed, Jun 20, 2018, 22:42 m.xinu <mehdi_x...@yahoo.com.invalid> wrote:
>>>
>>>> Hi,
>>>>
>>>> I'm using Apache Wicket 7.9.0 alongside Spring 5.0.5.RELEASE. In one of
>>>> my beans, I call some stream API containing multiple lambda expressions.
>>>> During that page execution, I get following exception:
>>>>
>>>> Caused by: java.io.NotSerializableException:
>>>> org.devocative.metis.service.data.ReportService$$Lambda$126/997816965
>>>>
>>>> and it is very strange for me since it is in one of my beans not in any
>>>> Wicket-related part.
>>>>
>>>> I've searched and I've found the Serializable casting solution, however
>>>> it results in a very complex syntax for my code. So is there any other
>>>> solution? Dose Wicket has a way for this type of serialization?
>>>>
>>>>
>>>> P.S: My block of code for stream:
>>>>
>>>> reports.parallelStream()
>>>>      .filter(report ->
>>>>        externalAuthorizationService == null ||
>>>>            externalAuthorizationService.authorizeReport(report, null,
>>>> currentUser.getUserId())
>>>>      )
>>>>      .flatMap(report -> report.getGroups().stream().map(dataGroup -> new
>>>> KeyValueVO<>(dataGroup, report)))
>>>>      .collect(Collectors.groupingBy(
>>>>        KeyValueVO::getKey,
>>>>        () -> new TreeMap<>(Comparator.comparing(DataGroup::getName)),
>>>>        Collectors.mapping(
>>>>            KeyValueVO::getValue,
>>>>            Collectors.toList()))
>>>>      );
>>>>
>>>>
>>
>    


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

  

Reply via email to