如何在RAML中完全覆盖Trait的错误响应结构
问题
我们已定义包含所有错误码的错误响应Trait(traits.errorhandling),但针对部分资源,需为400、403等错误码设置独立错误响应。在资源方法下定义400错误的数据类型和示例后,发现该响应会与Trait的错误响应合并(追加属性),而非完全覆盖。新响应与Trait响应仅2-3个属性相同,其余均不同。
当前RAML代码示例
/test: get: is: [traits.errorhandling] responses: 400: body: application/json: example: | { "Error": "error", "Status": "fail", "Message": "msg", "Errorcode": 400 }
Trait定义(traits.errorhandling)中的400响应Payload
{ "Name": "test", "Version": "1.0", "Message": "error", "Errorcode": 400 }
当前生成的合并响应(不符合预期)
{ "Error": "error", "Status": "fail", "Message": "msg", "Errorcode": 400, "Name": "test", "Version": "1.0" }
期望的响应
{ "Error": "error", "Status": "fail", "Message": "msg", "Errorcode": 400 }
解决方案
要实现完全覆盖Trait中的对应错误响应,需在资源方法的响应码定义后使用RAML的**!override标记**,明确告知RAML用当前定义的内容替换Trait中的响应,而非合并。
修改后的RAML代码如下:
/test: get: is: [traits.errorhandling] responses: 400!: # 用!override标记完全覆盖Trait中的400响应 body: application/json: example: | { "Error": "error", "Status": "fail", "Message": "msg", "Errorcode": 400 }
也可以采用另一种写法,将!override作为响应的关键字:
/test: get: is: [traits.errorhandling] responses: 400: !override body: application/json: example: | { "Error": "error", "Status": "fail", "Message": "msg", "Errorcode": 400 }
两种写法效果一致,都会让RAML忽略Trait中400响应的定义,直接使用你在资源方法中配置的响应内容。
内容的提问来源于stack exchange,提问作者Uday
相关产品推荐
相关产品推荐

