'Spring Boot "FirebaseApp with name [DEFAULT] doesn't exist."

Launching Spring Boot's jar file throws me these errors:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'temperatureController' defined in URL <...>

Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'temperatureService' defined in URL <...>

Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.temperaturetracker.services.TokenService]: Constructor threw exception; nested exception is java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist.

Each class contains appropriate @: @Service or @RestController or @SpringBootApplication or @Entity or @Repository.

Some classes:

@Service
public class TemperatureService {

    private final AlertService alertService;

    @Autowired
    public TemperatureService(AlertService alertService) {
        this.alertService = alertService;
    }

    <...>
}

@Service
class AlertService @Autowired constructor(private val tokenService: TokenService,
                                          private val cloudMessagingService: CloudMessagingService) {
  
    @PostConstruct
    fun initialize() {
        <...>
    }
}

@Service
public class CloudMessagingService {

    final Logger logger = LoggerFactory.getLogger(CloudMessagingService.class);

    public void sendFirebaseMessage() {
        <...>

        try {
            var response = FirebaseMessaging.getInstance().send(fbMessage);
            logger.debug("Notification response: " + response);
        } catch (FirebaseMessagingException e) {
            e.printStackTrace();
            logger.error("Error sending Firebase Cloud Message: " + e);
        }
    }

}

@Service
public class FirebaseInitialize {

    @PostConstruct
    public void initialize() {
        try {
            FileInputStream serviceAccount =
                    new FileInputStream("hidden-path");

            FirebaseOptions options = FirebaseOptions.builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setDatabaseUrl("hidden-path")
                    .build();

            FirebaseApp.initializeApp(options);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

@SpringBootApplication
public class TemperatureTrackerApplication {

    public static void main(String[] args) {
        SpringApplication.run(TemperatureTrackerApplication.class, args);
    }

}

These errors occurs only when I launch my jar file. Running app via green arrow or Shift + F10 everything works perfectly.



Solution 1:[1]

Make sure your Firebase configuration is ok because the error is thrown when SpringBoot try to execute the class

FirebaseInitialize

Solution 2:[2]

I've changed my class's FirebaseInitialize method initialize() to:

try {
    ClassPathResource serviceAccount =
            new ClassPathResource("myFile.json"); // it is in resources folder

    FirebaseOptions options = FirebaseOptions.builder()
            .setCredentials(GoogleCredentials.fromStream(serviceAccount.getInputStream()))
            .setDatabaseUrl("database-path-provided-by-firebase.app")
            .build();

    FirebaseApp.initializeApp(options);
} catch (Exception e) {
    e.printStackTrace();
}

FileInputStream I've used before expected the resource to be on the file system, which cannot be nested in a jar file. Thus, using getInputStream() of ClassPathResource worked.

Please read more: Classpath resource not found when running as jar

Solution 3:[3]

Use a @PostConstruct method to initialize Firebase inside your @SpringBootApplication class. So the case above should become

@SpringBootApplication
public class TemperatureTrackerApplication {

public static void main(String[] args) {
    SpringApplication.run(TemperatureTrackerApplication.class, args);
}

@PostConstruct
public void initialize() {
    try {
        FileInputStream serviceAccount =
                new FileInputStream("hidden-path");

        FirebaseOptions options = FirebaseOptions.builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("hidden-path")
                .build();

        FirebaseApp.initializeApp(options);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Dupeyrat Kevin
Solution 2 Captain Jacky
Solution 3 Joshua Philips