Добрый день, разработчики, я создаю это приложение на основе аренды велосипедов, где с моего бэкенда (Java Spring Boot) и проектирую DTO, которые в соответствии с запросом пользователя дают мне определенные ответы. В одном из этих процессов, особенно когда При аренде велосипеда весь процесс, по-видимому, идет хорошо, но, несмотря на внесение корректных изменений в мою базу данных, когда я пытаюсь выполнить обновление переднего плана, выдается следующее сообщение об ошибке:
"Невозможно написать JSON: (было java .lang.NullPointerException); вложенным исключением является com.faster xml .jackson.databind.JsonMappingException: (было java .lang.NullPointerException) (через цепочку ссылок: java .util.HashMap [\ " bikes_inventory \ "] -> java .util.ArrayList [1] -> java .util.HashMap [\" bike_log_rent \ "]".
Здесь немного поясняется:
Class User related to Class Bike.
@ManyToMany(fetch = FetchType.EAGER)
private List<Bike> bikeUserList=new ArrayList<>();
Variables,constructor, getters and setters
-------------------------------------------------
Class Bike related to Class User
@ManyToMany
@JoinTable(
name="user_bike",
joinColumns = @JoinColumn(name="bike_id"),
inverseJoinColumns = @JoinColumn(name="user_id")
)
private List<User> userList=new ArrayList<>();
Variables,constructor, getters and setters
Здесь присоединение классов User и Bike, связывающих друг друга через модальность «многие ко многим», является причиной необходимости получения из обоих репозиториев информации, которая может понадобиться другим, например отчета об аренде. r bike или на пользователя и наоборот
CONTROLLER
@RequestMapping(value="/bikes/all",method= RequestMethod.GET)
public Map<String ,Object> getAllBikesJson(Authentication authentication){
Map<String,Object>dto=new HashMap<>();
dto.put("bikes_inventory",bikeRepository.findAll().stream().map(bike -> makeBikeDto(bike)).collect(Collectors.toList()));
if(authentication==null){
dto.put("user",null);
}
else{
dto.put("user",makeUserDto(securityUser(authentication)));
}
return dto;
}
В этом методе я просто называю все велосипеды json, независимо от того, подписан пользователь или не находит в хранилище велосипедов все доступные элементы, выставляя его, бросая dto в соответствии с парой ключ / значение "bike_inventory" и всеми объектами байков соответственно.
@RequestMapping(value="/XXXXXXX/{idBike}", method=RequestMethod.PUT)
public ResponseEntity<Map<String,Object>>rentBikeMethod(Authentication authentication ,@PathVariable("idBike")Long id,
@RequestBody RentBike rentDetails){
User user=securityUser(authentication);
Bike bikeRented=bikeRepository.getOne(id);
SOME SECURITY RULES
RentBike rentBikeContract=new RentBike(user,bikeRented,
rentDetails.getDaysContract(),rentDetails.getDaysContract()
,rentDetails.getDailyDelayFee(),rentDetails.getTotalCost(),rentDetails.getRentState());
bikeRented.getInventoryBike().setStateRent(true);
user.setUserRentstatus("active");
bikeRented.getRentBikeSet().add(rentBikeContract);
bikeRepository.save(bikeRented);
rentBikeRepository.save(rentBikeContract);
userRepository.save(user);
return new ResponseEntity<>(makeResponseEntity("Success", "Bike rented"), HttpStatus.CREATED);
}
Затем во втором методе просто извлеките информацию, полученную из внешнего интерфейса, через тело запроса и переменную пути, чтобы узнать идентификатор велосипеда, который будет арендован (переменная пути), а также параметры, которые фактически включают аренду (тело запроса)
DTOS
/////////////////////////////////makeUserDto////////////////////////////////////
private Map<String,Object>makeUserDto(User user){
Map<String,Object>dto=new HashMap<>();
dto.put(xxxxxxxxx);
dto.put(xxxxxxxxx);
dto.put("user_log_rent",user.getRentBikeSet().stream().
sorted((r1,r2)->r1.getId().compareTo(r2.getId())).
map(rentBike -> makeRentBikeDto(rentBike)));
return dto;
}
////////////////////////////makeBikeDTO//////////////////////////////////
private Map<String,Object>makeBikeDto(Bike bike){
Map<String,Object>dto=new HashMap<>();
dto.put(xxxxxxxxx)
dto.put(xxxxxxxxx)
dto.put("bike_log_rent",bike.getRentBikeSet().stream().
sorted((r1,r2)->r1.getId().compareTo(r2.getId())).
map(rentBike -> makeRentBikeDto(rentBike)));
dto.put("bike_log_users",bike.getUserList().stream().
sorted((r1,r2)->r1.getId().compareTo(r2.getId())).
map(user -> makeUserDtoName(user)));
return dto;
}
В этих двух DTO, в основном, имея в виду соотношение в между классом User и классом Bike, я только что получил путь для извлечения друг от друга информации, относящейся к журналам истории проката велосипедов пользователя и обратного отчета о прокате и прокате пользователя. Но затем, когда метод арендованного объекта срабатывает, эти два dto выдают ошибку на предметах с ключами "bike_log_rent" и "user_log_rent" соответственно Это связано с неким типом недоступности записи Json ("Невозможно написать JSON: (было java .lang.NullPointerException); вложенное исключение: com.faster xml .jackson.databind.JsonMappingException: (было java .lang.NullPointerException) (через цепочку ссылок: java .util.HashMap [\ "bikes_inventory \"] -> java .util.ArrayList [1] -> java .util.HashMap [\ "bike_log_rent \"] "). База данных обновляется отлично и арендует коммиты, пользовательские обновления и велосипед тоже, но все равно сохраняет эту ошибку 500. Если я Комментируйте оба пункта, приложение прекрасно работает, хотя и не отображает релевантную информацию. Любая идея о том, почему это происходит. Заранее большое спасибо !!