Scala微服务架构 三

四 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 的实现

    def login: Action[RootObject] = Action(circe.json[RootObject]) { request =>
        import model.request.requestsJsonApiOpt._
        val tt = fromJsonapi(request.body)
        TestLog.print(s"tt = $tt")
        val reVal = PlayEntry().commonExcution(
            SequenceSteps(testStep(tt.reqs.head) :: Nil, None)
        )
        TestLog.print(s"reVal = $reVal")
        val result = asJsonApiResult(reVal.asInstanceOf[userdetailresult])
        Ok(result.asJson)
    }

猜你喜欢

转载自www.cnblogs.com/clockq/p/9256235.html