Java ModelMapper – flattening and vice versa

Here is an example of the flattening of a complex object model to a simple model and the opposite using ModelMapper (Java).

Consider the following classes:

PersonDTO – the flatten class

package model_mapper_test.modelmapper;

public class PersonDTO {

	private boolean a;
	private boolean b;
	private boolean c;

	public boolean isA() {
		return a;
	}

	public void setA(boolean a) {
		this.a = a;
	}

	public boolean isB() {
		return b;
	}

	public void setB(boolean b) {
		this.b = b;
	}

	public boolean isC() {
		return c;
	}

	public void setC(boolean c) {
		this.c = c;
	}

	@Override
	public String toString() {
		return "PersonDTO [a=" + a + ", b=" + b + ", c=" + c + "]";
	}

Person and Consensus – the complex classes

package model_mapper_test.modelmapper;

public class Person {

	private Consensus consensus;


	public Consensus getConsensus() {
		return consensus;
	}


	public void setConsensus(Consensus consensus) {
		this.consensus = consensus;
	}


	@Override
	public String toString() {
		return "Person [consensus=" + consensus + "]";
	}

}
package model_mapper_test.modelmapper;


public class Consensus {

	private boolean a;
	private boolean b;
	private boolean c;

	public boolean isA() {
		return a;
	}

	public void setA(boolean a) {
		this.a = a;
	}

	public boolean isB() {
		return b;
	}

	public void setB(boolean b) {
		this.b = b;
	}

	public boolean isC() {
		return c;
	}

	public void setC(boolean c) {
		this.c = c;
	}

	@Override
	public String toString() {
		return "Consensus [a=" + a + ", b=" + b + ", c=" + c + "]";
	}

}

In order to map from PersonDTO to Person and from Person to PersonDTO we should proceed in this way:

package andreidodu.modelmapper;

import org.modelmapper.ModelMapper;

public class App {


	public static void main(String[] args) {

		ModelMapper modelMapper = new ModelMapper();

		modelMapper.typeMap(Person.class, PersonDTO.class).addMappings(mapper -> {
			mapper.<Boolean> map(src -> src.getConsensus().isA(), PersonDTO::setA);
			mapper.<Boolean> map(src -> src.getConsensus().isB(), PersonDTO::setB);
			mapper.<Boolean> map(src -> src.getConsensus().isC(), PersonDTO::setC);
		});

		modelMapper.typeMap(PersonDTO.class, Person.class).addMappings(mapper -> {
			mapper.<Boolean> map(src -> src.isA(), (db, value) -> db.getConsensus().setA(value));
			mapper.<Boolean> map(src -> src.isB(), (db, value) -> db.getConsensus().setB(value));
			mapper.<Boolean> map(src -> src.isC(), (db, value) -> db.getConsensus().setC(value));
		});

		modelMapper.validate();

		Person db = new Person();
		Consensus consensus = new Consensus();
		consensus.setA(true);
		consensus.setB(false);
		consensus.setC(true);
		db.setConsensus(consensus);

		System.out.println(modelMapper.map(db, PersonDTO.class));

		PersonDTO dto = new PersonDTO();
		dto.setA(true);
		dto.setB(false);
		dto.setC(true);
		System.out.println(modelMapper.map(dto, Person.class));
	}
}

You can find this example on GitHub.