I have two entity TaskDTO and UserDTO
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@Builder
public class TaskDTO {
private Long id;
private String name;
private String description;
private LocalDateTime creationDate;
private Priority priority;
private Status status;
private UserDTO user;
}
/**
* Class that provide DTO pattern
*
* @author Zhytariuk Oleksandr
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@Builder
public class UserDTO {
private Long id;
private String firstName;
private String lastName;
private String email;
// @JsonIgnore
// private List<TaskDTO> tasks = new ArrayList<>();
}
I have commended TaskDTO List. So my problem next, if I try to convert some of this entities I will have stack overflow exception. What is the best practice for resolver this problem. I have one idea for create TaskDTOWithoutUser, and UserDTO will have List? This is my mapping classes:
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2021-09-23T17:17:00+0300",
comments = "version: 1.4.2.Final, compiler: javac, environment: Java 11.0.1 (AdoptOpenJDK)"
)
@Component
public class TaskMapperImpl implements TaskMapper {
@Autowired
private UserMapper userMapper;
@Override
public Task toTask(TaskDTO taskDTO) {
if ( taskDTO == null ) {
return null;
}
TaskBuilder task = Task.builder();
task.id( taskDTO.getId() );
task.name( taskDTO.getName() );
task.description( taskDTO.getDescription() );
task.creationDate( taskDTO.getCreationDate() );
task.priority( taskDTO.getPriority() );
task.status( taskDTO.getStatus() );
task.user( userMapper.toUser( taskDTO.getUser() ) );
return task.build();
}
@Override
public TaskDTO toDTO(Task task) {
if ( task == null ) {
return null;
}
TaskDTOBuilder taskDTO = TaskDTO.builder();
taskDTO.id( task.getId() );
taskDTO.name( task.getName() );
taskDTO.description( task.getDescription() );
taskDTO.creationDate( task.getCreationDate() );
taskDTO.priority( task.getPriority() );
taskDTO.status( task.getStatus() );
taskDTO.user( userMapper.toDTO( task.getUser() ) );
return taskDTO.build();
}
@Override
public List<Task> toList(List<TaskDTO> tasksDTO) {
if ( tasksDTO == null ) {
return null;
}
List<Task> list = new ArrayList<Task>( tasksDTO.size() );
for ( TaskDTO taskDTO : tasksDTO ) {
list.add( toTask( taskDTO ) );
}
return list;
}
@Override
public List<TaskDTO> toDTO(List<Task> tasks) {
if ( tasks == null ) {
return null;
}
List<TaskDTO> list = new ArrayList<TaskDTO>( tasks.size() );
for ( Task task : tasks ) {
list.add( toDTO( task ) );
}
return list;
}
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2021-09-23T17:17:00+0300",
comments = "version: 1.4.2.Final, compiler: javac, environment: Java 11.0.1 (AdoptOpenJDK)"
)
@Component
public class UserMapperImpl implements UserMapper {
@Override
public User toUser(UserDTO userDTO) {
if ( userDTO == null ) {
return null;
}
UserBuilder user = User.builder();
user.id( userDTO.getId() );
user.firstName( userDTO.getFirstName() );
user.lastName( userDTO.getLastName() );
user.email( userDTO.getEmail() );
return user.build();
}
@Override
public UserDTO toDTO(User user) {
if ( user == null ) {
return null;
}
UserDTOBuilder userDTO = UserDTO.builder();
userDTO.id( user.getId() );
userDTO.firstName( user.getFirstName() );
userDTO.lastName( user.getLastName() );
userDTO.email( user.getEmail() );
return userDTO.build();
}
@Override
public List<User> toList(List<UserDTO> usersDTO) {
if ( usersDTO == null ) {
return null;
}
List<User> list = new ArrayList<User>( usersDTO.size() );
for ( UserDTO userDTO : usersDTO ) {
list.add( toUser( userDTO ) );
}
return list;
}
@Override
public List<UserDTO> toDTOList(List<User> users) {
if ( users == null ) {
return null;
}
List<UserDTO> list = new ArrayList<UserDTO>( users.size() );
for ( User user : users ) {
list.add( toDTO( user ) );
}
return list;
}
}