Ошибка получения около java .lang.NullPointerException, несмотря на обновление базы данных в java SpringBoot. Недоступно для записи Json - PullRequest
0 голосов
/ 04 мая 2020

Добрый день, разработчики, я создаю это приложение на основе аренды велосипедов, где с моего бэкенда (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. Если я Комментируйте оба пункта, приложение прекрасно работает, хотя и не отображает релевантную информацию. Любая идея о том, почему это происходит. Заранее большое спасибо !!

...