Home > Enterprise >  Mapping DTO to inherited class
Mapping DTO to inherited class

Time:02-26

My domain:

public class Moral {

    private String moralId;

    private String socialReason;

    private Framework framework;
}

public class Framework {

    private String externalId;

    private Set<String> identifiers;
}

public class Lab extends Framework {

    private String system;

    private String availability;

}

My DTO:

public class CreateLabRequest {

    private String socialReason;

    private Set<String> identifiers;

    private String system;

    private String availability;

}

My Mapper for this looks like:

@Mapping(source = "system", target = "framework.system")
@Mapping(source = "availability", target = "framework.availability")
@Mapping(source = "identifiers", target = "framework.identifiers")
Moral createLabRequestToMoral (CreateLabRequest createLabRequest);

However, I get the following error:

Unknown property "system" in type Framework for target name "framework.system". Did you mean "framework.externalId"? Unknown property "availability" in type Framework for target name "framework.availability". Did you mean "framework.externalId"?

CodePudding user response:

Simply, It is not Possible !

Maybe you wanted to make Framework inherits from Map ?!

Otherwise, the problem is due that you want to access some field in a class that doesn't have it !

public class Framework {
    private String externalId;
    private Set<String> identifiers;
}

public class Lab extends Framework {
    private String system;
    private String availability;
}

As it says, extends means that your Lab class inherits from Framework, that means that Lab inherits all fields that Framework has, and not the opposite.

So with that being said :

"framework.system" // cannot be accessed 

Since there is no field named "system" in the framework class

However :

"lab.externalId" // CAN be accessed 

Since Lab class inherits it from its parent class "Framework" eventhough there is no such field named "system" in the Lab class

More explanations about JAVA inheritance can be found here : https://www.geeksforgeeks.org/inheritance-in-java/

CodePudding user response:

This is possible as follows:

@Mapping( source = ".", target = "framework" )
Moral createLabRequestToMoral( CreateLabRequest createLabRequest );

Lab createLabFramework( CreateLabRequest createLabRequest )

Since Lab extends Framework mapstruct will use createLabFramework( CreateLabRequest createLabRequest ) since it is an user defined method. Also since all the fields are called the same it is not needed to add those @Mapping annotations.

Edit: expanding a bit about the error.

Unknown property "system" in type Framework for target name "framework.system". Did you mean "framework.externalId"? Unknown property "availability" in type Framework for target name "framework.availability". Did you mean "framework.externalId"?

This is basically caused by MapStruct not knowing that there is a Lab class available that extends Framework. MapStruct can also not know that you want to use the Lab class instead of the Framework class.

As shown above, one of the methods is manually defining an additional mapping method to notify MapStruct about this situation.

  • Related