# ApplicationMessage 应用消息
MornBoot提供快速构建应用提示消息的工具类。应用消息主要用于传递系统运行的结果,并更倾向于序列化传递。在非序列化场景下,通常会转为其它形式以通知本地应用或前端。通常转为:
Since:v1.0.0
- ApplicationException (opens new window):生成支持国际化的自定义异常
- RestMessage (opens new window):生成支持国际化的REST消息
在JavaWeb项目中,MornBoot会全局捕获应用异常,并生成REST消息,响应给请求方。因此,你不需要对应用异常做任何处理。
# 推荐配置
#开启国际化(默认)
morn.translator.enabled=true
#国际化资源文件
spring.messages.basename=morn/exception
# Reference
# Build Message
使用ApplicationMessages
生成应用消息
@Slf4j
public class ApplicationMessagesTest {
public void message() {
ApplicationMessage message = ApplicationMessages.translateMessage("login.password-is-null");
log.info(message.toString());
// ApplicationMessage(code=login.password-is-null, message=登录密码不能为空, solution=请输入登录密码)
}
}
在exception.properties
中录入国际化信息
error.login.password-is-null.message=登录密码不能为空
error.login.password-is-null.solution=请输入登录密码
# Build Exception
构建应用异常
@Slf4j
public class ApplicationMessagesTest {
public void buildException() {
try {
ApplicationException applicationException = ApplicationMessages
.translateException("login.password-is-null");
throw applicationException;
} catch (ApplicationException e) {
log.error("状态码:{}", e.getCode());
// 状态码:login.password-is-null
log.error("解决方案:{}", e.getSolution());
// 解决方案:请输入登录密码
log.error(e.getMessage(), e);
// site.morn.exception.ApplicationExceptin: 登录密码不能为空
}
}
}
通过ApplicationMessage
生成应用异常
ApplicationException exception = ApplicationMessages
.translate("login.password-is-null")
.exception();
构建自定义异常
ApplicationException applicationException = ApplicationMessages
.buildException("login.password-is-null", "登录密码不能为空", "请输入登录密码");
# Expand
# Message Changer
MornBoot默认使用Translator
生成应用消息内容,你可以写个类似的Bean覆盖它。
注意:必须使用Target注解,否则BeanEnhance (opens new window)不会扫描该Bean。
@Component
@Target(ApplicationMessage.class)
public class TestApplicationMessageChanger implements TranslateChanger<ApplicationMessage> {
@Override
public ApplicationMessage change(Transfer transfer) {
// 构建应用消息
return ApplicationMessages
.buildMessage(transfer.getCode(), "This is message.", "This is solution.");
}
}
# Source Code
源码参考
/**
* 默认应用消息转换器
*
* @author timely-rain
* @since 1.0.0, 2018/12/10
*/
@RequiredArgsConstructor
@Target(ApplicationMessage.class)
public class DefaultApplicationMessageChanger implements TranslateChanger<ApplicationMessage> {
/**
* 警告前缀
*/
private static final String PREFIX = "error";
/**
* 消息后缀
*/
private static final String MESSAGE_SUFFIX = "message";
/**
* 解决方案后缀
*/
private static final String SOLUTION_SUFFIX = "solution";
/**
* 翻译器
*/
private final Translator translator;
@Override
public ApplicationMessage change(Transfer transfer) {
String code = transfer.getCode();
// 格式化国际编码
String messageCode = Translators.formatCode(PREFIX, code, MESSAGE_SUFFIX);
String solutionCode = Translators.formatCode(PREFIX, code, SOLUTION_SUFFIX);
// 翻译
String message = translator.translate(messageCode, transfer.getArgs());
String solution = translator.translate(solutionCode, transfer.getArgs());
// 构建应用消息
return ApplicationMessage.builder().code(code).message(message).solution(solution).build();
}
}