У меня есть класс Rent с полем «Список игр», RentDto с полем «Список игр». И RentMapper, как показано ниже.
Но когда я тестирую с помощью почтальона, метод get возвращает игры в виде пустого массива. Я не понимаю, почему в методе createRent точнее в prepareRentToSave я устанавливаю игры. Метод POST возвращает правильный json (список типа GameDto), но метод GET возвращает пустой массив для свойства games
@Component
@Mapper(componentModel = "spring")
public interface RentMapper {
@Mappings({
@Mapping(target = "games", source = "games",qualifiedByName = "mapGamesToGamesDto")
})
RentDto fromRentToRentDto(Rent source);
@Mapping(target = "games", source = "games")
Rent fromRentDtoToRent(RentDto source);
Rent updateFromRentUpdateDtoToRent(@MappingTarget Rent entity, RentUpdateDto update);
default GameDto fromGameToGameDto(Game game) {
return Mappers.getMapper(GameMapper.class).fromGameToGameDto(game);
}
@Named("mapGamesToGamesDto")
default List mapGamesToGamesDto(List games){
List gameDtoList = new ArrayList();
for(Game game:games){
gameDtoList.add(fromGameToGameDto(game));
}
return gameDtoList;
}
}
метод службы для создания арендной платы
@Transactional
public RentDto createRent(RentCreationDto rentCreationDto) {
List gamesIdToRent = rentCreationDto.getGames();
List chosenGamesToRent = new ArrayList();
boolean isGameRented = false;
User user = userRepository.findByUsername(rentCreationDto.getUsername()).orElseThrow(() ->
new EntityNotFoundException(EntityNotFoundException.ENTITY_USER_NOT_FOUND, rentCreationDto.getUsername()));
StringBuilder message = new StringBuilder();
for (Long gameId : gamesIdToRent) {
Game gameToRent = gameRepository.findById(gameId).orElseThrow(() ->
new EntityNotFoundException(EntityNotFoundException.ENTITY_GAME_NOT_FOUND_BY_ID, String.valueOf(gameId)));
if (gameToRent.getStatus().equals(GameStatus.AVAILABLE)) {
gameToRent.setStatus(GameStatus.RENTED);
chosenGamesToRent.add(gameToRent);
gameRepository.save(gameToRent);
isGameRented = true;
} else {
message.append(gameToRent.getTitle()).append(" ");
}
}
if (isGameRented) {
Rent rentToSave=prepareRentToSave(rentCreationDto, chosenGamesToRent, user);
Rent savedRent = rentRepository.save(rentToSave);
return rentMapper.fromRentToRentDto(savedRent);
} else {
throw new GameNotAvailableException(GameNotAvailableException.NOT_AVAILABLE_MESSAGE, message.toString());
}
}
private static Rent prepareRentToSave(RentCreationDto rentCreationDto, List chosenGamesToRent, User user) {
Rent rentToSave = new Rent();
rentToSave.setCreationTs(LocalDateTime.now());
rentToSave.setStartDate(rentCreationDto.getStartDate());
rentToSave.setEndDate(rentCreationDto.getStartDate().plusDays(7));
rentToSave.setGames(chosenGamesToRent);
rentToSave.setUser(user);
rentToSave.setStatus(RentStatus.ACTIVE);
rentToSave.setSettled(false);
rentToSave.setUpdateTs(LocalDateTime.now());
rentToSave.setCost(BigDecimal.valueOf(20.00));
return rentToSave;
}
Я добавил метод вqualByName, который сопоставляет список игр со списком GameDto. Запустите mvn clean install, но id вообще не помог
Аренда
@Data
@Entity
@Table(name = "rents")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Rent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@OneToMany(mappedBy = "rent", cascade = CascadeType.ALL, orphanRemoval = true)
private List games;
...
Игра
public class Game {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "rent_id")
public Rent rent;
Подробнее здесь: https://stackoverflow.com/questions/790 ... ist-of-dto
Сопоставитель из Mapstruct не сопоставляет список объектов со списком Dto ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Сопоставитель MapStruct не правильно отображает вложенные DTO при весенней загрузке
Anonymous » » в форуме JAVA - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-
-
-
MapStruct - сопоставляет одно свойство класса каждому объекту в списке другого класса.
Anonymous » » в форуме JAVA - 0 Ответы
- 93 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Сопоставитель .NET 8 EF Include() не работает — возвращает пустой список рейтингов
Anonymous » » в форуме C# - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-
-
-
MapStruct: список объектов карты, когда объект отображается из двух объектов.
Anonymous » » в форуме JAVA - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-