# ApplicationMessage 应用消息

MornBoot提供快速构建应用提示消息的工具类。应用消息主要用于传递系统运行的结果,并更倾向于序列化传递。在非序列化场景下,通常会转为其它形式以通知本地应用或前端。通常转为:

Since:v1.0.0

在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();
  }
}