The Server API provides methods for associating configuration files with REST servlets so that
configuration properties can be defined in external files. It uses the following annotation:
- {@link oajr.annotation.Rest}
- {@link oajr.annotation.Rest#config() config}
| @Rest(
| // Config file is located at ./config_dir/myconfig.cfg
| config="config_dir/myconfig.cfg",
| ...
| )
| public class MyResource {...}
In recap, the Configuration API provides support for INI-style configuration files with embedded string variables:
| #--------------------------
| # Examples
| #--------------------------
| [MyProperties]
| path = $E{PATH}
| javaHome = $S{java.home}
| customMessage = Java home is $C{MyProperties/javaHome} and the
| environment path is $C{MyProperties/path}.
These properties are then accessible through the {@link oaj.config.Config} class.
| @RestGet("/")
| public String sample(Config config) {
| String path = config.get("MyProperties/path").get();
| File javaHome = config.get("MyProperties/javaHome").as(File.class).orElse(null);
| String customMessage = config.get("MyProperties/customMessage").orElse("Hello");
| ...
| }
The annotation itself can contain string variables.
For example, the Microservice API {@link oajr.servlet.BasicRestServlet} class defines the
location of the config file as a system property "juneau.configFile":
| @Rest(
| // Config file location is defined as a system property
| config="$S{juneau.configFile}",
| ...
| )
| public class MyResource {...}
Spring Boot applications typically define an application.properties file. You can reuse it
as a config file like so:
| @Rest(
| config="application.properties",
| ...
| )
| public class MyResource {...}
Note that properties files are a subset of functionality of INI files (they're basically just INI files with a single default section).
It's therefore possible to use INI-style syntax such as sections in your application.properties file.
Once a config file has been associated with a REST resource, it can be accessed through one of the following:
{@link oajr.RestContext.Builder#getConfig()} method. It can also be access by passing in a {@link oaj.config.Config} bean to any of your
REST OP methods.
A common usage is to use this method to initialize fields in your servlet.
| @Rest(
| // Config file is located at ./config_dir/myconfig.cfg
| config="config_dir/myconfig.cfg",
| ...
| )
| public class MyResource {
| private final String path;
| private final File javaHome;
|
| public MyResource(RestContext.Builder builder) {
| Config config = builder.getConfig();
| path = config.get("MyProperties/path").orElse("mypath");
| javaHome = config.get("MyProperties/javaHome").as(File.class).orElse(null);
| }
Another common usage is to refer to config properties through $C variables in your annotations:
| @Rest
| // Get stylesheet from myconfig.cfg but default to devops.css if it's not specified
| @HtmlDoc(
| stylesheet="$C{MyServlet/stylesheet,servlet:/styles/devops.css}",
| )
| public class MyResource {...}
It's even possible to reference request-level variables in your config file if you use
{@link oajr.RestRequest#getConfig()} to access the config file:
| #-------------------------------------
| # Contents of config_dir/myconfig.cfg
| #-------------------------------------
| [HelloWorldResource]
| message = Hello $RQ{person}!
| /**
| * Sample REST resource that prints out a simple "Hello world!" message.
| */
| @Rest(
| config="config_dir/myconfig.cfg",
| ...
| )
| public class HelloWorldResource extends BasicRestServlet {
|
| /**
| * GET request handler.
| * Specify the GET parameter "?person=X" for a specialized message!
| */
| @RestGet("/")
| public String sayHello(Config config) {
| return config.get("HelloWorldResource/message").get();
| }
| }
You can even add resource bundles into the mix:
| #-------------------------------------
| # Contents of config_dir/myconfig.cfg
| #-------------------------------------
| [HelloWorldResource]
| message = $L{localizedMessage,$RQ{person}}
| #-------------------------------------------
| # Contents of HelloWorldResource.properties
| #-------------------------------------------
| localizedMessage = Hello {0}!
| /**
| * Sample REST resource that prints out a simple "Hello world!" message.
| */
| @Rest(
| messages="HelloWorldResources",
| config="config_dir/myconfig.cfg",
| ...
| )
| public class HelloWorldResource extends BasicRestServlet {
|
| /**
| * GET request handler.
| * Specify the GET parameter "?person=X" for a specialized message!
| */
| @RestGet("/")
| public String sayHello(Config config) {
| return config.get("HelloWorldResource/message").get();
| }
| }