Отображение сущности домена и некоторого списка на объект Dto - PullRequest
0 голосов
/ 22 октября 2019

Я хочу использовать modelMapper, потому что сущность домена соответствует объекту dto. Но есть некоторые проблемы. В объекте dto он имеет некоторый список массивов, например orderList, codeList ....

Это мой код

Это примеры кодов user, userDto, userServiceImpl по сравнению с моими объектами и сервисом.

// it is my User domain
@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer seq;

    @ManyToOne
    @JoinColumn(name="role_seq")
    private Role role;

    @Column(name="first_name")
    private String firstName;

    @Column(name="last_name")
    private String lastName;
}

// it is my UserDto
@Data
public class UserDto {
    private Integer userSeq;
    private Integer roleSeq;
    private String firstName;
    private String lastName;
    private List<Integer> orderList = new ArrayList<>();
    private List<String> codeList = new ArrayList<>();
}

// and Last it is service layer
@Service
public class UserServiceImpl implements UserService {
    @Override
    public UserDto getUserDto(Integer userSeq) {
        User user = userRepository.findBySeq(userSeq);
        List<UserCode> userCodeList = userCodeRepository.findAllByUserSeqOrderByOrderNoAscNullsLast(userSeq);

        ModelMapper modelMapper = new ModelMapper();
        UserDto userDto = modelMapper.map(user, UserDto.class);

        for (int i = 0; i < userCodeList.size(); i++) {
            userDto.getOrderList().add(userCodeList.get(i).getOrderNo()); // I don't like this code...
            userDto.getCodeSeqList().add(userCodeList.get(i).getCode().getCodeName()); // I don't like this code too...
        }

        PropertyMap<User, UserDto> userToUserDtoPropertyMap = new PropertyMap<User, UserDto>() {
            protected void configure() {
                map().setUserSeq(source.getSeq());
                map().setRoleSeq(source.getRole().getSeq()); // I don't know why it is not mapping...
            }
        };
        modelMapper.addMappings(userToUserDtoPropertyMap);

        return userDto;
    }
}

В примере есть только два списка, а в моих кодах 7 списков. Я хочу использовать только маппер, а не "получить и добавить". пожалуйста, помогите мне ... как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Вы можете использовать аннотацию jsonignoreproperties, чтобы игнорировать отсутствующие свойства в DTO. Таким образом, он будет заполнять только те свойства, которые доступны в обоих. Пожалуйста, проверьте ниже URL, который использует ObjectMapper для той же цели. https://www.thetechnojournals.com/2019/10/entity-object-conversion-to-dto-object.html

0 голосов
/ 22 октября 2019

В объекте USER

{
@Id
@Column(name = "id")
private String id;
@Column(name = "email")
private String email;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<Address> address;
}

В USERDTO

{
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private String id;
private String email;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private List<Address> address;
}

IN Уровень контроллера или сервиса (используйте BeanUtils.copyProperties (user, userDto))

@RequestMapping(value = "/create-new-user", method = RequestMethod.POST)
public ResponseEntity<UserDto> createNewUserAndSendEmail(@RequestBody SignUpDto signUpDto) {
    User user = new User();
    UserDto userDto = new UserDto();
    BeanUtils.copyProperties(signUpDto, user);
    user = userService.createNewUserAndSendEmail(user);
    BeanUtils.copyProperties(user, userDto);
    return ResponseEntity.ok().body(userDto);
}

На уровне обслуживания

//Generate a new user and send email
    public User createNewUserAndSendEmail(User user) {
        if (user != null && utilService.checkUserAvailability(user.getEmail()) == false) {
            user = User.initFrom(user);
            userRepository.saveAndFlush(user);
            String token = jwtTokenUtil.generateTokenWithPinAndEmail(user);
            String emailBody = AppConstant.EMAIL_VERIFICATION_BODY + token;
            emailService.sendEmail(user.getEmail(), AppConstant.EMAIL_VERIFICATION_SUBJECT, emailBody);
            user.setPasswordVerifiedCode(emailBody);
            return user;
        } else {
            throw new BadRequestException("The Request Cannot Be Fulfilled Due To Bad Syntax Exception.");
        }
    }

Эти 2 статических метода находятся на уровне пользователя, но на уровне вызова.

public static User initFrom(User user) {
        user.setPassword(UtilService.bCryptPassword(user.getPassword()));
        user.setId("USER-" + UtilService.generateFourDigitCode());
        user.setStatus(AppConstant.PENDING);
        user.setEmailVerifiedCode(UtilService.generateRandomString());
        user.setIsEmailVerified(false);
        user.setProvider(AppConstant.PROVIDER_GENERAL);
        user.setRole(AppConstant.PENDING);
        return user;
    }

    public static List<UserDto> fromUsersToUserDtoList(List<User> users) {
        List<UserDto> userDtos = new ArrayList<>();
        for (User user : users) {
            UserDto userDto = new UserDto();
            BeanUtils.copyProperties(user, userDto);
            userDtos.add(userDto);
        }
        return userDtos;
    }
...