spring boot - springboot application handle application startup errors - Stack Overflow

admin2025-05-02  1

I am creating a standalone java application, application will be used by novice users, we will be sharing a set of error codes for trouble shooting the application. The requirement is to customize the error message, if the spring boot application failed to start with errors.

2025-01-02 15:33:14 - [] - [WARN] - [org.springframework.context.support.AbstractApplicationContext.refresh] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'
2025-01-02 15:33:14 - [] - [INFO] - [org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLogger.logMessage] - 

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-01-02 15:33:14 - [] - [ERROR] - [org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter.report] - 

***************************
APPLICATION FAILED TO START
***************************

Description:

Web server failed to start. Port 7000 was already in use.

Action:

Identify and stop the process that's listening on port 7000 or configure this application to listen on another port.

I tried using ControllerAdvice but didn't worked out.

@ControllerAdvice
public class GenericExceptionHandler {

    private static final Logger log = LoggerFactory.getLogger(GenericExceptionHandler.class);

   
    @ExceptionHandler(ApplicationContextException.class)
    public void handleApplicationContextException(ApplicationContextException exception) {
        log.error("Port Already in use, Refer Step 3.1 for configuring new port");
    }
}

I am creating a standalone java application, application will be used by novice users, we will be sharing a set of error codes for trouble shooting the application. The requirement is to customize the error message, if the spring boot application failed to start with errors.

2025-01-02 15:33:14 - [] - [WARN] - [org.springframework.context.support.AbstractApplicationContext.refresh] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'
2025-01-02 15:33:14 - [] - [INFO] - [org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLogger.logMessage] - 

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-01-02 15:33:14 - [] - [ERROR] - [org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter.report] - 

***************************
APPLICATION FAILED TO START
***************************

Description:

Web server failed to start. Port 7000 was already in use.

Action:

Identify and stop the process that's listening on port 7000 or configure this application to listen on another port.

I tried using ControllerAdvice but didn't worked out.

@ControllerAdvice
public class GenericExceptionHandler {

    private static final Logger log = LoggerFactory.getLogger(GenericExceptionHandler.class);

   
    @ExceptionHandler(ApplicationContextException.class)
    public void handleApplicationContextException(ApplicationContextException exception) {
        log.error("Port Already in use, Refer Step 3.1 for configuring new port");
    }
}
Share Improve this question edited Jan 2 at 13:40 basil daniel asked Jan 2 at 13:34 basil danielbasil daniel 11 bronze badge
Add a comment  | 

2 Answers 2

Reset to default 0

We can listen for the ApplicationFailedEvent for dealing with Exceptions occurring during the startup of spring boot application. Attaching the sample code how i dealt with same.

@Component
public class PortConflictListener implements ApplicationListener<ApplicationFailedEvent> {


    private static final Logger log = LoggerFactory.getLogger(PortConflictListener.class);

    @Value("${server.port}")
    private String serverPort;

    @Override
    public void onApplicationEvent(ApplicationFailedEvent event) {

        Throwable exception = event.getException();
        if (exception instanceof ApplicationContextException
                && exception.getCause() instanceof PortInUseException) {
            log.error("custom error message");
            System.exit(1);
        }
    }
}

Based on spring documentation @ControllerAdvice is annotated with @Component which means it will be scanned by Spring Boot normally.

So, let's focus on your calss implementation, I see you are depending on the @ExceptionHandler(ApplicationContextException.class) although you want to listen to application failed event, right? I have good news ! there is something ready to use already provided by springboot, the ApplicationFailedEvent.

All what you need is just to create a custom expetion handler that listen for the ApplicationFailedEvent, I have tweaked you code submitted above to work as the explanasion above:

@ControllerAdvice
public class GenericExceptionHandler implements ApplicationListener<ApplicationFailedEvent> {
    private static final Logger log = LoggerFactory.getLogger(GenericExceptionHandler.class);

    @Value("${server.port}")
    private String serverPort;


    @Override
    public void onApplicationEvent(ApplicationFailedEvent event) {
        Throwable exception = event.getException();
        if (exception instanceof ApplicationContextException
                && exception.getCause() instanceof PortInUseException) {
            log.error("Port Already in use, Refer Step 3.1 for configuring new port");
            System.exit(1);
        }
    }

}
转载请注明原文地址:http://anycun.com/QandA/1746117522a91910.html