# RestMessage REST消息

MornBoot提供全局REST模型,用于系统内部/第三方系统进行交互。支持REST模型与第三方模型相互转换,从而屏蔽数据模型造成的交互障碍。

Since:v1.0.0

# 推荐配置

#开启国际化(默认)
morn.translator.enabled=true
#国际化资源文件
spring.messages.basename=morn/message

# Build Standard Message

使用RestBuilders构建REST模型,响应JSON格式的消息。

# Default Success Message

构建一个success消息

@RestController
@RequestMapping
public class LoginController {

  @PostMapping("/login")
  public RestMessage login() {
    return RestBuilders.successMessage();
  }
}

Response Body

{
    "code": "success",
    "data": null,
    "level": "info",
    "message": "操作成功",
    "success": true
}

morn/message.properties中录入国际化信息

rest.success.message=操作成功
rest.failure.message=操作失败
rest.test.message=测试消息

# Custom Success Message

构建一个success消息,并自定义消息内容

RestMessage restMessage = RestBuilders.successMessage("test");

Response Body

{
    "code": "success",
    "data": null,
    "level": "info",
    "message": "测试消息",
    "success": true
}

# Complete Success Message

构建一个success消息,并自定义所有内容

Map<Object, Object> data = new HashMap<>();
data.put("Foo", "Foo value");
data.put("Bar", "Bar value");
RestMessage restMessage = RestBuilders.infoBuilder().code("test").level(Level.WARNING)
    .message("This is test message.").data(data).build();

Response Body

{
    "code": "test",
    "data": {
        "Bar": "Bar value",
        "Foo": "Foo value"
    },
    "level": "warning",
    "message": "This is test message.",
    "success": true
}

# Data Success Message

构建一个success消息,并携带数据

Object data = new Object();
RestMessage restMessage = RestBuilders.successMessage(data);

Response Body

{
    "code": "success",
    "data": {},
    "level": "info",
    "message": "操作成功",
    "success": true
}

# Default Failure Message

RestMessage restMessage = RestBuilders.failureMessage();

# 消息转换

# 模拟三方交互

/**
* 百度REST消息
*/
@Getter
@Setter
@ToString
public class BaiduMessage {

  /**
   * 状态码
   */
  private String error;
  
  /**
   * 消息内容
   */
  private String msg;
}

# 百度消息转为Morn消息

BaiduMessage baiduMessage = new BaiduMessage();
baiduMessage.setError("0");
baiduMessage.setMsg("操作成功");
RestMessage restMessage = RestBuilder.from(baiduMessage);

// success=true, code=0, level=null, message=操作成功, data=null

# Morn消息转为百度消息

BaiduMessage baiduMessage = RestBuilders.successBuilder().to(BaiduMessage.class);

// error=0, msg=操作成功

# 创建消息转换器

消息转换工作在转换器中完成,这从根本上杜绝了与第三方系统交互时,极易产生的不健康代码。
开发人员不需要关心第三方系统的数据模型,使用标准REST模型,完成业务开发即可。

/**
* 百度REST消息
*/
@Getter
@Setter
@ToString
public class BaiduMessage {

  /**
   * 状态码
   */
  private String error;
  
  /**
   * 消息内容
   */
  private String msg;
}

/**
* 百度消息转换器
*/
@Target(BaiduMessage.class)
public class BaiduConverter implements RestConverter<BaiduMessage> {

@Override
public BaiduMessage convert(RestMessage restMessage) {
  BaiduMessage baiduMessage = new BaiduMessage();
  baiduMessage.setError(restMessage.isSuccess() ? "0" : "-1");
  baiduMessage.setMsg(restMessage.getMessage());
  return baiduMessage;
}

@Override
public RestMessage revert(BaiduMessage baiduMessage) {
  RestMessage restMessage = new SimpleRestMessage();
  boolean success = isSuccess(baiduMessage);
  restMessage.setSuccess(success);
  restMessage.setLevel(success ? Level.INFO : Level.ERROR);
  restMessage.setCode(baiduMessage.getError());
  restMessage.setMessage(baiduMessage.getMsg());
  return restMessage;
}

private boolean isSuccess(BaiduMessage baiduMessage) {
  return Objects.equals(baiduMessage.getError(), "0");
}
}