I have a function that goes through a list of HappyObjects and sets their fields asynchronously. In the Callable, a JsonProcessingException can occur. I have to wrap this and other exceptions from this function into a custom exception (ControllerException) and throw that instead.
Other Stack Overflow posts seem to suggest collect into a List of Futures and use get() to catch the exceptions. Thus, this is what I have so far:
default List<HappyObj> fillfunction(final List<HappyObj> happyObjs) throws ControllerException {
    ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
    List<Future<HappyObj>> futures = new ArrayList<>();
    for (HappyObj happyObj : happyObjs) {
      Future<HappyObj> future = executor.submit(
          () -> {
            final List<Mood> moods = getMoods();
            for (Mood mood : moods) {
              final String json = getJsonEmotion();
              ObjectMapper mapper = new ObjectMapper();
              mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
              List<Emotion> emotions =
                  mapper.readValue(json, new TypeReference<List<Emotion>>() {}); //JsonProcessingException can occur here
              MoodMetadata metadata = mood.getMoodMetadata();
              if (metadata != null && metadata.getEmotionMetadata() != null) {
                metadata.getEmotionMetadata().setEmotions(emotions);
              }
            }
            happyObj.setMoods(moods);
            return happyObj;
          });
      futures.add(future);
    }
    executor.shutdown();
    final long maxSlaSec = 1;
    try {
      executor.awaitTermination(maxSlaSec, TimeUnit.SECONDS);
      List<HappyObj> happyResult = new ArrayList<>();
      for (Future<HappyObj> future : futures) {
        happyResult.add(future.get());
      }
      return happyResult;
    } catch (InterruptedException | ExecutionException e) {
      executor.shutdownNow();
      throw new ControllerException(e);
    }
  }
Is there a more elegant way than iterating through List<Future> and calling get on each to catch ExecutorException? I thought about using execute() vs. submit(), but then I can't handle the JsonProcessingException. I saw another post suggesting creating a ThreadPoolExecutor subclass and override the afterExecute(), but I wasn't able to handle the JsonProcessingException.
One of the reasons I asked this question is because since this method consists mainly of setters, the function was originally manipulating the given objects and returning void.
 
     
    