1

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;
    }
}
David Conrad
  • 15,432
  • 2
  • 42
  • 54
  • If you're getting a stack overflow, it means you are doing something that's blowing the stack, most likely a recursive operation that is not terminating. – Robert Harvey Sep 23 '21 at 14:32
  • 1
    The "best practice" for solving the problem is troubleshooting to identify the code that is causing the problem, and either removing it or modifying it so that the problem no longer exists. – Robert Harvey Sep 23 '21 at 14:34
  • What you want `toString` to return? – talex Sep 23 '21 at 14:52
  • 1
    Does [this answer](https://stackoverflow.com/a/48973365/636009) answer your question? – David Conrad Sep 23 '21 at 15:00
  • Does this answer your question? [How to Map an object contains other object with @oneToMany](https://stackoverflow.com/questions/48924232/how-to-map-an-object-contains-other-object-with-onetomany) – Filip Sep 24 '21 at 06:43

0 Answers0