Field Options Provider

You can populate a drop-down list manually in the @Meta.AD annotation of the configuration interface. But you can also populate the option labels and values automatically with the ConfigurationFieldOptionsProvider class. This is useful when you want to populate a drop-down list dynamically. For example, you can fetch a list of objects from a web service or iterate through a database to populate the drop-down list dynamically.

Deploy the Tutorial Code

  1. Start Liferay DXP. If you don’t already have a docker container, use

    docker run -it -p 8080:8080 liferay/portal:7.4.1-ga2
  2. Download and unzip Field Options Provider

    curl -O
  3. From the module root, build and deploy.

    ./gradlew deploy$(docker ps -lq)

    This command is the same as copying the deployed jars to /opt/liferay/osgi/modules on the Docker container.

  4. Confirm the deployment in the Liferay Docker container console.

    STARTED com.acme.z4h3.impl_1.0.0 [1150]
  5. Open your browser to https://localhost:8080 and navigate to Control PanelConfigurationSystem Settings. Under Platform click Third Party. Click Z4H3 Configuration on the left.

    The settings UI shows two drop-down lists.

The first drop-down list is populated manually with the @Meta.AD annotation. The second drop-down list is populated with the field options provider.

Setting the Configuration Interface

Create a configuration interface and set the configuration field name to be populated.

	description = "this-list-is-manually-populated", name = "colors",
	optionLabels = {"blue", "red", "yellow"},
	optionValues = {"blue", "red", "yellow"}, required = false
public String colors();

	description = "this-list-is-provider-populated",
	name = "provider-populated-colors", required = false
public String providerPopulatedColors();

In the sample project, providerPopulatedColors is the configuration field name to be populated.

Implement the Field Options Provider

Create a new class that implements the ConfigurationFieldOptionsProvider class.

	property = {
	service = ConfigurationFieldOptionsProvider.class

Use the @Component annotation to register the service. Include the from the previous step. Set the to the fully qualified class name of the configuration interface.

public List<Option> getOptions() {
	return Arrays.asList(
		_getOption("green"), _getOption("orange"), _getOption("purple"));

private Option _getOption(String color) {
	return new Option() {

		public String getLabel(Locale locale) {
			ResourceBundle resourceBundle = ResourceBundleUtil.getBundle(
				"content.Language", locale, getClass());

			return LanguageUtil.get(resourceBundle, color);

		public String getValue() {
			return color;


Add a getOptions method to return a list of Options. The sample project includes an array that sets the optionValue as a string of a color and sets the optionLabel as the string stored in the file of that color.

The tutorial code uses a simple example of a string array but more complex use cases are also possible.

See a real Liferay example with This code gets a list of AssetRendererFactory objects and iterates through the list, populating a new list of Options, using the asset’s type name as the label and the class name as the value.