Ratpacked: Handling Exceptions When Reading Configuration Sources
To define configuration sources for our Ratpack application we have several options. We can set default properties, look at environment variables or Java system properties, load JSON or YAML formatted configuration files or implement our own configuration source. When something goes wrong using one of these methods we want to be able to handle that situation. For example if an optional configuration file is not found, we want to inform the user, but the application must still start. The default exception handling will throw the exception and the application is stopped. We want to customise this so we have more flexibility on how to handle exceptions.
We provide the configuration source in the serverConfig
configuration block of our Ratpack application.
We must add the onError
method and provide an error handler implementation before we load any configuration source.
This error handler will be passed to each configuration source and is execute when an exception occurs when the configuration source is invoked.
The error handler implements the Action
interface with the type Throwable
.
In our implementation we can for example check for the type of Throwable
and show a correct status message to the user.
In the following example application we rely on external configuration source files that are optional. If the file is present it must be loaded, otherwise a message must be shown to indicate the file is missing, but the application still starts:
// File: src/ratpack/ratpack.groovy
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.nio.file.NoSuchFileException
import java.nio.file.Paths
import static ratpack.groovy.Groovy.ratpack
final Logger log = LoggerFactory.getLogger('ratpack.server')
ratpack {
serverConfig {
// Use custom error handler, when
// exceptions happen during loading
// of configuration sources.
onError { throwable ->
if (throwable in NoSuchFileException) {
final String file = throwable.file
log.info "Cannot load optional configuration file '{}'", file
} else {
throw throwable
}
}
yaml('application.yml')
// Optional configuration files
// to override values in
// 'application.yml'. This could
// potentially give an exception if
// the files don't exist.
yaml(Paths.get('conf/application.yml'))
json(Paths.get('conf/application.json'))
args(args)
sysProps()
env()
...
}
...
}
Next we start the application with the absence of the optional configuration files conf/application.yml
and conf/application.json
:
$ gradle run
...
:run
12:28:38.887 [main] INFO ratpack.server.RatpackServer - Starting server...
12:28:39.871 [main] INFO ratpack.server - Cannot load optional configuration file 'conf/application.yml'
12:28:39.873 [main] INFO ratpack.server - Cannot load optional configuration file 'conf/application.json'
12:28:40.006 [main] INFO ratpack.server.RatpackServer - Building registry...
12:28:40.494 [main] INFO ratpack.server.RatpackServer - Ratpack started (development) for http://localhost:5050
Notice that application is started and in the logging we have nice status messages that tell us the files are not found.
Written with Ratpack 1.3.3.