四 Controller层

之前我们已经把基层架构搭建好了,那么要如何使用呢?
首先看看我的Controller层代码

@Singleton
class BMAuthController @Inject()(implicit cc: ControllerComponents, actorSystem: ActorSystem)extends AbstractController(cc) with Circe with CirceJsonapiSupport {val entry = PlayEntry()def parseJson(jsonString: String) : Json = io.circe.parser.parse(jsonString).right.getdef decodeJson[T](json: Json)(implicit d: io.circe.Decoder[T]) : T = json.as[T].right.getdef login = Action(circe.json[RootObject]) { implicit request =>requestimport model.request.requestsJsonApiOpt.requestsJsonapiRootObjectReader._val tt = fromJsonapi(request.body)val reVal = entry.commonExcution(SequenceSteps(testStep(tt.reqs.head) :: Nil, None))val ctest = company("12", "alfred")val ctestj = asJsonApi(ctest)println(ctestj)val result = asJsonApiResult(reVal.asInstanceOf[userdetailresult])Ok(result.asJson)}
}

4.1 Controller 的声明

4.1.1 @Inject() 注解

@Inject()(implicit cc: ControllerComponents, actorSystem: ActorSystem)

首先这个@Inject会查询Play的System环境,并将查到的==单例实例==注入到参数中.

4.1.2 AbstractController 特质

官网解释

  • AbstractController: an abstract class extending BaseController with a ControllerComponents constructor parameter that can be injected using constructor injection.

也就是说,这就是BaseController的抽象子类,但是要带有一个ControllerComponents作为构造函数.

4.1.3 Circe 特质

circe是一个Scala的Json解析库.并且目前已经支持Play.
Play的使用方式很简单,首先引入项目:

libraryDependencies += "com.dripower" %% "play-circe" % "2609.1"

然后继承play.api.libs.circe.Circe特质

使用起来也很简单,上面代码的
circe.json[RootObject]
部分就是在使用Circe解析JsonApi的Root部分.

4.1.4 CirceJsonapiSupport 特质

对JsonApi协议的支持,里面主要就是两个隐式,代码如下:

trait CirceJsonapiSupport extends CirceJsonapiEncoders with CirceJsonapiDecoders {implicit val circeJsonapiMarshaller = Marshaller.delegate[RootObject, String](`application/vnd.api+json`,`application/json`,ContentTypes.`application/json`)(_.asJson.noSpaces)implicit val circeJsonapiUnmarshaller = Unmarshaller.delegate[String, RootObject](`application/vnd.api+json`,`application/json`)(decode[RootObject](_).right.get)
}object CirceJsonapiSupport extends CirceJsonapiSupport

4.2 login 代码解析

对不起,各位,暂时没写!!! ,有兴趣的可以私信我,后期我会补上.

※. 本期语法糖

※.1 Scala的构造函数

学自https://www.w3cschool.cn/scala/scala-constructors.html

今天要说的当然不是大家熟知的构造函数,而是以前我们可能忽略的细节.

class User1(var id: String, var name: String)class User2(val id: String, val name: String)class User3(private var id: String,private  var name: String)class User4(id: String, name: String)

上面代码定义了四个User类,每个类都有两个参数idname,当然,他们构造函数的区别也很明显.那么这几种不同的定义方式,有什么区别呢?

  • User1,定义了可变构造参数,同时编译器会自动生成setter和getter方法,但因为是默认修饰符,所以外部可以直接访问user1.id,或者赋值user1.id("001")
  • User2,因为定义的构造参数是不可变的,所以只会生成getter方法,不会有setter方法,也是默认修饰符,所以外部只可以访问user2.id,无法赋值
  • User3,和User1很像,但是修饰符改为private,所以即便是var的构造参数,也不会生成getter方法和setter方法
  • User4,我们最常用的写法,其实就是private[this] val,也就是说对于自己和伴生类而言是可见的

应杨总要求,我们打印上面四个User类的编译信息

def tree1 = reify { class User1(var id: String, var name: String) }.tree
def tree2 = reify { class User2(val id: String, val name: String) }.tree
def tree3 = reify { class User3(private var id: String,private  var name: String) }.tree
def tree4 = reify { class User4(id: String, name: String) }.tree

然后分别打印上面的四个树,输出结果如下:

tree1:

{class User1 extends AnyRef {<paramaccessor> var id: Predef.String = _;<paramaccessor> var name: Predef.String = _;def <init>(id: Predef.String, name: Predef.String) = {super.<init>();()}};()
}

tree2:

{class User2 extends AnyRef {<paramaccessor> val id: Predef.String = _;<paramaccessor> val name: Predef.String = _;def <init>(id: Predef.String, name: Predef.String) = {super.<init>();()}};()
}

tree3:

{class User3 extends AnyRef {<paramaccessor> private var id: Predef.String = _;<paramaccessor> private var name: Predef.String = _;def <init>(id: Predef.String, name: Predef.String) = {super.<init>();()}};()
}

tree4:

{class User3 extends AnyRef {<paramaccessor> private[this] val id: Predef.String = _;<paramaccessor> private[this] val name: Predef.String = _;def <init>(id: Predef.String, name: Predef.String) = {super.<init>();()}};()
}

转载于:https://www.cnblogs.com/clockq/p/9256235.html

Scala微服务架构 三相关推荐

  1. Re:从 0 开始的微服务架构--(三)微服务架构 API 的开发与治理--转

    原文来自:聊聊架构公众号 前面的文章中有说到微服务的通信方式,Martin Folwer 先生在他对微服务的定义中也提到"每个服务运行在其独立的进程中,服务与服务间采用 轻量级的通信机制 互 ...

  2. 分布式与微服务——Iaas,Paas和Saas、单体应用和缺点、微服务概念、传统 分布式 SOA 架构与微服务架构的区别、微服务实战、什么是RPC、CAP定理和BASE理论、唯一ID生成、实现分布式

    文章目录 1-什么是Iaas,Paas和Saas 一 IaaS基础设施服务 二 paas平台即服务 三saas软件即服务 四 总结 2-单体应用和缺点 一 单体应用 二 单体应用的缺陷 3-微服务概念 ...

  3. 7000 字 + 21 图,微服务架构概述

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  4. 微服务架构的优势与不足(三)

    2019独角兽企业重金招聘Python工程师标准>>> 微服务架构的好处 微服务架构模式有很多好处.首先,通过分解巨大单体式应用为多个服务方法解决了复杂性问题.在功能不变的情况下,应 ...

  5. JHipster生成微服务架构的应用栈(三)- 业务微服务示例

    本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...

  6. 深入研究微服务架构——第三部分

    目录 介绍 背景 什么是NancyFx? 什么是领域专用语言? 托管Nancy NancyFx与ASP.Net Core Web API NancyFx Hello World 使用代码 为自主机配置 ...

  7. Spring Cloud与微服务学习总结(5)——认证鉴权与API权限控制在微服务架构中的设计与实现(三)

    本文转载自( http://blueskykong.com/2017/10/24/security3/) 1. 前文回顾 在开始讲解这一篇文章之前,先对之前两篇文章进行回忆下.在第一篇 认证鉴权与AP ...

  8. 微服务架构 基础(三)

    微服务架构 基础(三) 持续更新- 继续前面的基础二工程进行扩展 服务降级.服务熔断和服务限流 基本概念理解 服务雪崩 多个服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又 ...

  9. Github三天点击破亿,四天助力金九银十,精通SpringCloud微服务架构,成就大厂梦

    又逢"金九银十",年轻的毕业生们满怀希望与忐忑,去寻找.竞争一个工作机会.已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇.更大的平台. 然而,面试人群众多,技术 ...

最新文章

  1. Zookeeper与Paxos
  2. 12.14-Linux系统优化
  3. iOS软件开发架构理解
  4. 解读系统资质审批的相关政策
  5. 在javascript使用EL表达式注意事项
  6. leetcode5 Longest Palindromic Substring 最长且为回数的子字符串
  7. 浅谈霍尔电流传感器的原理及应用
  8. 强制删除被占用文件 windows
  9. 记一次hive 报错NoViableAltException(-1@[215:51: ( KW_AS )?])
  10. 四阶魔方用三阶魔方公式时,两个特殊情况处理方式(顶面十字、最后一步)
  11. 手把手教你用UNet做医学图像分割系统
  12. 用Gitosis搭建Git服务器(经典资料)
  13. 利用 Maxima 求解常微分方程
  14. Testng的简介和使用
  15. 通俗地讲一下Web是什么意思。
  16. 微信小程序的推广思路与方法,详细思路解析
  17. 使用 itext 和 flying-saucer 实现 html 转 PDF
  18. 阅读替换净化规则_免费阅读APP-阅读下载 v3.2安卓版(免费小说阅读器纯净无广告)-KK下载站...
  19. 3DMAX到底该如何布线?
  20. 二叉树探究之非叶子结点和叶子结点对半分且最多差一个

热门文章

  1. 运行在浏览器中的深度学习框架,开源了
  2. 非常规解释:分类ML模型的十大模型性能指标
  3. 2020 年最具潜力 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台(值得收藏)
  4. SAP S/4 HANA新变化-主数据:物料主数据
  5. 强化学习如何真正实现任务自动化?不妨试试「两步走」策略!
  6. 机器学习并不“万能”
  7. 中国是全球AI停车最大市场
  8. 张小龙:我是对AI的未来表示担忧的人之一
  9. 如何提升深度学习性能?数据、算法、模型一个都不能少
  10. 金审系统与SAP接口