Home > Mobile >  How do i handle or log exception for Method references?
How do i handle or log exception for Method references?

Time:08-17

I have the code snippet below. But i was wondering how to try catch exception with method references. I want to write try catch block for getUserByUserId method, probably log it and catch with NotFoundException. How do i refactor this code in case of method reference userService::getUserByUserId?

   List<String> listofIds= ldapUsers.stream()
                    .map(PersonDTO::getUserId)
                    .map(userService::getUserByUserId)
                    .filter(Optional::isPresent)
                    .map(Optional::get)
                    .map(User::get_id)
                    .collect(Collectors.toList());

CodePudding user response:

Leave the stream like that add the logic you want in the getUserByUserId method. If it doesn't find a user it logs the error and throws the exception.

EDIT: since you can't modify the method, you can do the following:

List<String> listofIds= ldapUsers.stream()
                .map(PersonDTO::getUserId)
                .map(userId -> {
                    User user = userService.getUserByUserId(userId);
                    if(user == null) {
                        log.error("User not found");
                        throw new NotFoundException();                        
                    }                    
                    return user;
                })
                .filter(Optional::isPresent)
                .map(Optional::get)
                .map(User::get_id)
                .collect(Collectors.toList());

CodePudding user response:

If it's unchecked exception, you don't need to do anything. But if its checked exception then you can do something like this:

..
.map((userService) -> {
   try{
    ...//call userService#getUserByUserId
   }catch(NotFoundException e){
    //log or do something else
  }

}) ...

CodePudding user response:

You could write a mapper function in the class you are doing the chaining of calls:

private Optional<User> getUser(PersonDTO personDTO) {
    try {
        return userService.getUserByUserId(personDTO.getUserId());
    } catch (Exception ex) {
        log.error("Your message here", ex);
        throw new NotFoundException();
    }
}

And use it like this:

List<String> listofIds = ldapUsers.stream()
                                  .map(PersonDTO::getUserId)
                                  .map(this::getUser)
                                  .filter(Optional::isPresent)
                                  .map(Optional::get)
                                  .map(User::get_id)
                                  .collect(Collectors.toList());
  • Related