分享一下声明式API的写法

通常一个 Controller 是以 class 的形式创建的,需要在里面注入 Service,写方法体,调用 Service 的方法,来完成数据交互。

而声明式 API 是将 class 变成一个 interface,节省了一些代码量,从而提高开发效率,同时因为这只是一个抽象方法,重新编写的成本极低,所以当不需要的时候 可以直接无脑删,不用担心后面又需要了咋办。

演示效果如下

假设现在有一个 Service,bean 名称为 aService,现在需要通过 Controller 来调用 aService 里面的 selectList 方法

@MarsApi(refBean="aService")
public interface TestApi {

	返回类型 selectList(TestDTO testDTO);
}
复制代码

当我们请求这个接口的时候,他会自动调用 aService 里面的 selectList 方法,并将返回值转成 json 返回。

如果我想在这个 API 里面 调用 bService 里的方法咋办?

@MarsApi(refBean="aService")
public interface TestApi {

	// 这个注解可以覆盖类上面的 refBean
	@MarsReference(beanName = "bService")
	返回类型 selectList(TestDTO testDTO);
}
复制代码

我不想把 API 里的方法名称 写的跟 Service 一样咋办?

@MarsApi(refBean="aService")
public interface TestApi {

	@MarsReference(refName = "要调用的 service 的方法名")
	返回类型 selectList(TestDTO testDTO);
}
复制代码

我可以不调用方法,只返回 Service 里面的一个属性值吗?

@MarsApi(refBean="aService")
public interface TestApi {

	@MarsReference(refName = "要调用的属性名", refType = RefType.PROPERTY)
	返回类型 selectList(TestDTO testDTO);
}
复制代码

想对参数做校验咋办,这都没方法体了,难道写在 Service ?

在接参对象的属性上添加 @MarsDataCheck 注解接口

// 不可为空,且长度在 2-3 位
@MarsDataCheck(notNull = true,maxLength = 3L,minLength = 2L, msg = "id 不可为空且长度必须在 2-3 位之间")
private Integer id;

// 正则校验
@MarsDataCheck(reg = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,12}$",msg = "密码不可以为空且必须是 6-12 位数字字母组合")
private String password;
复制代码

不同的接口对参数的校验需求不一样,这种校验方式在遇到两个接口用同一个接参对象时会不会就 GG 了

不会,加一个 apis 属性即可搞定

public class ExpVO {

    /* 
     * expGetRequest 和 expPostRequest 两个接口都不允许 name 为空
     * 只需要在 apis 属性里配置这两个接口即可,但是由于他们都是 exp 开头的
     * 所以用通配符即可
     */
    @MarsDataCheck(notNull = true, msg = "名称不可以为空", apis={"exp*"})
    private String name;

    /* 
     * saveRequest 和 expPostRequest 两个接口都不允许 address 为空
     * 只需要在 apis 属性里配置这两个接口即可
     */
    @MarsDataCheck(notNull = true, msg = "地址不可以为空", apis={"expPostRequest","saveRequest"})
    private String address;

}
复制代码

想要给 API 加 try-catch,让它在异常的时候,还可以正常返回 json 咋办?

这个不用使用者关心了,因为这个框架是纯粹面向前后端分离的,所以无论出现什么情况,前端都可以收到 json, 假如出异常了,那么前端会收到这样一个 json

{error_code:500, error_info:"异常提示"}
复制代码

我还是有点顾虑,不敢尝试这种写法

没关系,我们兼容常规的 Controller 写法

@MarsApi
public class DemoController {

	@MarsWrite("userInfoServiceImpl")
	private UserInfoService userInfoService;

	public String demo(UserInfoDTO userInfoDTO, HttpMarsRequest request){
		return "";
	}
}
复制代码

有点意思,我想再多了解一点

官网地址:mars-framework.com