API Mediation Layer Message Service Component
API Mediation Layer Message Service Component
The API ML Message Service component unifies and stores REST API error messages and log messages in a single file. The Message Service component enables users to mitigate the problem of message definition redundancy which helps to optimize the development process.
Message Definition
API ML uses a customizable infrastructure to format both REST API error messages and log messages. yaml
files make it possible to centralize both API error messages and log messages. Messages have the following definitions:
-
Message
key
- a unique ID in the form of a dot-delimited string that describes the reason for the message. Thekey
enables the UI or the console to show a meaningful and localized message.Tips:
-
We recommend using the format
org.zowe.sample.apiservice.{TYPE}.greeting.empty
to define the message key.{TYPE}
can be the api or log keyword. -
Use the message
key
and not the messagenumber
. The messagenumber
makes the code less readable, and increases the possibility of errors when renumbering values inside thenumber
.
-
-
Message
number
- a typical mainframe message ID (excluding the severity code) -
Message
type
- There are two Massage types:- REST API error messages:
ERROR
- Log messages:
ERROR
,WARNING
,INFO
,DEBUG
, orTRACE
- REST API error messages:
-
Message
text
- a description of the issue
The following example shows the message definition.
Example:
messages:
- key: org.zowe.sample.apiservice.{TYPE}.greeting.empty
number: ZWEASA001
type: ERROR
text: "The provided '%s' name is empty."
Creating a message
Use the following classes when you create a message:
org.zowe.apiml.message.core.MessageService
- lets you create a message from a file.org.zowe.apiml.message.yaml.YamlMessageService
- implementsorg.zowe.apiml.message.core.MessageService
so thatorg.zowe.apiml.message.yaml.YamlMessageService
can read message information from ayaml
file, and create a message with message parameters.
Use the following process to create a message.
Follow these steps:
-
Load messages from the
yaml
file.Example:
MessageService messageService = new YamlMessageService();
messageService.loadMessages("/api-messages.yml");
messageService.loadMessages("/log-messages.yml"); -
Use the
Message createMessage(String key, Object... parameters);
method to create a message.Example:
Message message = messageService.createMessage("org.zowe.sample.apiservice.{TYPE}.greeting.empty", "test");
Mapping a message
You can map the Message
either to a REST API response or to a log message.
When you map a REST API response, use the following methods:
mapToView
- returns a UI model as a list of API Message, and can be used for Rest API error messagesmapToApiMessage
- returns a UI model as a single API Message
The following example is a result of using the mapToView
method.
Example:
{
"messages": [
{
"messageKey": "org.zowe.sample.apiservice.{TYPE}.greeting.empty",
"messageType": "ERROR",
"messageNumber": "ZWEASA001",
"messageContent": "The provided 'test' name is empty."
}
]
}
The following example is the result of using the mapToApiMessage
method.
Example:
{
"messageKey": "org.zowe.sample.apiservice.{TYPE}.greeting.empty",
"messageType": "ERROR",
"messageNumber": "ZWEASA001",
"messageContent": "The provided 'test' name is empty."
}
API ML Logger
The org.zowe.apiml.message.log.ApimLogger
component controls messages through the Message Service component.
The following example uses the log
message definition in a yaml
file.
Example:
messages:
- key: org.zowe.sample.apiservice.log.greeting.empty
number: ZWEASA001
type: DEBUG
text: "The provided '%s' name is empty."
When you map a log message, use mapToLogMessage
to return a log message as text.
The following example is the output of the mapToLogMessage
.
Example:
ZWEASA001D The provided ‘test’ name is empty. {43abb594-3415-4ed5-a0b5-23e306a91124}
Use the ApimlLogger
to log messages which are defined in the yaml file.
Example:
package org.zowe.apiml.client.configuration;
import org.zowe.apiml.message.core.MessageService;
import org.zowe.apiml.message.core.MessageType;
import org.zowe.apiml.message.log.ApimlLogger;
public class SampleClass {
private final ApimlLogger logger;
public SampleClass(MessageService messageService) {
logger = ApimlLogger.of(SampleClass.class, messageService);
}
public void process() {
logger.log(“org.zowe.sample.apiservice.log.greeting.empty”, “test”);
}
}
The following example shows the output of a successful ApimlLogger
usage.
Example:
DEBUG (c.c.m.c.c.SampleClass) ZWEASA001D The provided 'test' name is empty. {43abb594-3415-4ed5-a0b5-23e306a91124}