mapping list to sorted set

3,527 views
Skip to first unread message

Sushma Kumari

unread,
Sep 30, 2015, 8:09:19 AM9/30/15
to mapstruct-users
Hi,

I am new to mapstruct and i really liked it. but my question is :

i am having two classes:

class A{

List<class C> list;

}


class B{

SortedSet <class D> set ;

}


i need to map these two collections. Is there anyway that i can do it as i' m getting error while mapping them using @Mapping(source = "list", target = "set")

I even tried with expression then also its not working.


Thank you in advance,
Sushma

Gunnar Morling

unread,
Sep 30, 2015, 8:37:25 AM9/30/15
to mapstruct-users
Hi Sushma,

What is the exact error you get?

You'd have to declare a method for mapping C to D on your mapper interface:

    D cToD(C c);

Then the generated implementation of

    @Mapping(source="list", target="set")
    B aToB(A a);

should automatically make use of another generated (private) method for the conversion of the collection (which in turn will invoke cToD() for each element).

In case no such private collection mapping method is generated (which I'd consider a bug, though), then you may make it work by explicitly declaring it:

    SortedSet csToSortedDs(Iterable<C> cs);

Hth,

--Gunnar

Sushma Kumari

unread,
Oct 1, 2015, 7:03:26 AM10/1/15
to mapstruct-users
Hi,

Thanks for your fast response.
 i got error stating : 

can't map property consider to declare/implement mapping method

I tried by declaring mapping method as you suggested  ( D cToD(C c);) , error is not there but mapperImplementation class is not getting generated. 

still i used explicit way ( SortedSet csToSortedDs(Iterable<C> cs)) i got following error

- Internal error in the mapping processor: java.util.NoSuchElementException at java.util.ArrayList$Itr.next(Unknown Source) at org.mapstruct.ap.internal.util.Collections.first(Collections.java:77) at 
org.mapstruct.ap.internal.model.IterableMappingMethod$Builder.build(IterableMappingMethod.java:102) at 
org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMappingMethods(MapperCreationProcessor.java:289) at 
org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMapper(MapperCreationProcessor.java:143) at 
org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:114) at 
org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:73) at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:223) at 
org.mapstruct.ap.MappingProcessor.processMapperTypeElement(MappingProcessor.java:203) at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:169) at 
org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:139) at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:121) at 
org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:159) at 
org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:134) at 
org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:818) at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:434) at 
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:367) at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:179) at 
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:304) at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:61) at 
org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:256) at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:175) at org.eclipse.core.internal.events.BuildManager
$2.run(BuildManager.java:734) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206) at 
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:246) at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:299) at 
org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:302) at 
org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:358) at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:381) at 
org.eclipse.core.internal.resources.Workspace.buildInternal(Workspace.java:496) at org.eclipse.core.internal.resources.Workspace.build(Workspace.java:415) at org.eclipse.ui.actions.BuildAction
$1.runInWorkspace(BuildAction.java:305) at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

Thanks,
Sushma

Sjaak Derksen

unread,
Oct 1, 2015, 1:54:23 PM10/1/15
to mapstruct-users
HI Sushma,

For me it works.. I just tried with 1.0.0.CR2..

Here's the code:


package mapstruct.ex;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

/**
 *
 * @author Sjaak Derksen
 */
@Mapper
public abstract class MyMapper {


    @Mapping(target = "set", source = "list" )
    public abstract B aToB(A c);

    public abstract D cToD(C c);

}


Generated code:

package mapstruct.ex;

import java.util.List;

import java.util.SortedSet;

import java.util.TreeSet;

import javax.annotation.Generated;

@Generated(

    value = "org.mapstruct.ap.MappingProcessor",

    date = "2015-10-01T19:51:06+0200",

    comments = "version: 1.0.0.CR2, compiler: javac, environment: Java 1.8.0_05 (Oracle Corporation)"

)

public class MyMapperImpl extends MyMapper {

    @Override

    public B aToB(A c) {

        if ( c == null ) {

            return null;
        }

        B b = new B();

        b.setSet( cListToDSortedSet( c.getList() ) );

        return b;
    }

    @Override

    public D cToD(C c) {

        if ( c == null ) {

            return null;
        }

        D d_ = new D();

        return d_;
    }

    protected SortedSet<D> cListToDSortedSet(List<C> list) {

        if ( list == null ) {

            return null;
        }

        SortedSet<D> sortedSet = new TreeSet<D>();

        for ( C c : list ) {

            sortedSet.add( cToD( c ) );
        }

        return sortedSet;
    }
}


On Wednesday, September 30, 2015 at 2:09:19 PM UTC+2, Sushma Kumari wrote:
Hi,

I am new to mapstruct and i really liked it. but my question is :

i am having two classes:

class A{

List<class C> list;

}


class B{

SortedSet <class D> set ;

}

Full code attached.

Best regards,
Sjaak
MapStructExListToOrderedSet.zip

Sushma Kumari

unread,
Oct 5, 2015, 2:17:30 AM10/5/15
to mapstruct-users
Hi Sjaak,

Thanks a lot  now its working for me also.

Regards,
Sushma
Reply all
Reply to author
Forward
0 new messages