四 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)
}