四 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.get
def decodeJson[T](json: Json)(implicit d: io.circe.Decoder[T]) : T = json.as[T].right.get def login = Action(circe.json[RootObject]) { implicit request =>
request
import 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>();
()
}
};
()
}

Scala微服务架构 三的更多相关文章

  1. Scala微服务架构 一

    因为公司的一个项目需求变动会非常频繁,同时改动在可控范围内,加上产品同学喜欢一些超前思维,我们的CTO决定提前开启八门,使用微服务架构. 划重点 微服务架构主要特点: ==独立组件(自主开发升级)== ...

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

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

  3. Scala微服务架构 二

    三. Scala的Macro(宏) Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programm ...

  4. springcloud微服务架构搭建

    SpringCloud微服务框架搭建 一.微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么是集群 多台服务器部署相同应用构成一个集群 作用:通 ...

  5. spring cloud+dotnet core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

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

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

  7. spring cloud+.net core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  8. 中小型研发团队架构实践三:微服务架构(MSA)

    一.MSA 简介 1.1.MSA 是什么 微服务架构 MSA 是 Microservice Architect 的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相 ...

  9. 微服务架构攀登之路(三)之gRPC入门

    一.gRPC入门 1. gRPC 简介 gRPC 由 google 开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC 客户端和服务端可以在多种环境中运行和交互,例如用 java 写一个 ...

随机推荐

  1. python 优先队列

    python 优先队列 from queue import PriorityQueue q = PriorityQueue() q.put((2, 'code')) q.put((1, 'eat')) ...

  2. Ado.net之对数据库的增删改查

    一.了解Command对象 1.Command对象:封装了所有对外部数据源的操作,包括增删改查和执行存储过程,并在执行完成后返回合适的结果,同Connection一样,对于不同的数据源,Ado.net ...

  3. grains和pillar的联合使用

    在编写sls文件的时候,对于不同的客户端,在配置管理的时候,其安装的环境,配置文件和启动的服务都相同: 如果完全是不同的环境,建议写单独的sls文件,不要混合在一起; 如果是相同的环境,只不过对于不同 ...

  4. 基于PaddlePaddle的语义匹配模型DAM,让聊天机器人实现完美回复 |

    来源商业新知网,原标题:让聊天机器人完美回复 | 基于PaddlePaddle的语义匹配模型DAM 语义匹配 语义匹配是NLP的一项重要应用.无论是问答系统.对话系统还是智能客服,都可以认为是问题和回 ...

  5. xml文件中&符号需要转义为&amp;

    xml文件中&符号需要转义为&

  6. c++ 面试题(C/C++/STL)

    1,智能指针:auto_ptr(c++11 已经弃用),unique_ptr(用于取代 auto_ptr),  shared_ptr,  weak_ptr http://www.cnblogs.com ...

  7. Django的rest_framework的视图之基于通用类编写视图源码解析

    我们上一篇博客讲解了如何使用mixins类实现rest_framework的视图,但是其中有很多的冗余的代码,我们这边在来优化一下 1.queryset的视图函数 首先看下对queryset操作的视图 ...

  8. [leetcode]96. Unique Binary Search Trees给定节点形成不同BST的个数

    Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n? Input: ...

  9. 关于弹性布局的 flex-grow的用法和flex-shrink的用法

    1.首先 flex-grow设置在子项目上 2.flex-grow默认值为0,如果为值1的时候就会撑满 3.flex-grow还可以给其中的一个子元素单独设置,设置为2,其它的则为1或者2都可以,具体 ...

  10. 优化linux,安装node环境

    就是这样我的心爱的云主机就被攻击了,反正我是很久没宠幸过她,肯定不是我去攻击人家,但是吧昨天就突然来了封邮件,小白一个查不出什么,用了 netsat -na显示所有连接到服务器的活跃的网络连接数,发现 ...