Статьи

Построение войны с помощью спрей-сервлета

Мы будем использовать спрей-сервлет для создания файла нашего API. Таким образом, мы можем запустить его на сервере приложений Java. Я предполагаю, что у нас уже есть работающий REST API. Нам понадобится файл web.xml в каталоге src / main / webapp / WEB-INF /:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?xml version="1.0"?>
<web-app>
    <listener>
        <listener-class>spray.servlet.Initializer</listener-class>
    </listener>
 
    <servlet>
        <servlet-name>SprayConnectorServlet</servlet-name>
        <servlet-class>spray.servlet.Servlet30ConnectorServlet</servlet-class>
        <async-supported>true</async-supported>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>SprayConnectorServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Нам нужен плагин sbt для построения войн. Добавьте это в project / plugins.sbt:

1
addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "1.0.0")

Мы добавим зависимости к build.sbt, а также дополнительные задачи:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
name := "exampleAPI"
 
version := "1.0"
 
scalaVersion := "2.11.2"
 
libraryDependencies ++= {
  val akkaVersion = "2.3.6"
  val sprayVersion = "1.3.2"
  Seq(
    "io.spray"            %%  "spray-can"       % sprayVersion,
    "io.spray"            %%  "spray-servlet"   % sprayVersion, //We need spray-servlet
    "io.spray"            %%  "spray-routing"   % sprayVersion,
    "io.spray"            %%  "spray-json"      % "1.3.1",
    "io.spray"            %%  "spray-testkit"   % sprayVersion  % "test",
    "org.scalatest"       %%  "scalatest"       % "2.2.4"       % "test",
    "com.typesafe.akka"   %%  "akka-actor"      % akkaVersion,
    "com.typesafe.akka"   %%  "akka-testkit"    % akkaVersion   % "test",
    "com.typesafe.akka"   %%  "akka-slf4j"      % akkaVersion,
    "ch.qos.logback"      "logback-classic"  % "1.1.2"
  )
}
 
//This adds tomcat dependencies, you can also use jetty()
tomcat()

Нам нужно расширить Spray.servlet.WebBoot:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
import akka.actor.{Props, ActorSystem}
import spray.servlet.WebBoot
 
// this class is instantiated by the servlet initializer
// it needs to have a default constructor and implement
// the spray.servlet.WebBoot trait
class Boot extends WebBoot {
  //we need an ActorSystem to host our application in
  implicit val system = ActorSystem("SprayApiApp")
  
  //create apiActor
  val apiActor = system.actorOf(Props[ApiActor], "apiActor")
 
  // the service actor replies to incoming HttpRequests
  val serviceActor = apiActor
}

И добавьте ссылку на этот класс в application.conf:

1
2
3
spray.servlet {
boot-class = “Boot”
}

Теперь мы можем запустить sbt package чтобы построить войну. А в sbt используйте container:start для запуска сервера tomcat с нашим приложением. И container:stop чтобы остановить это.

Хороший способ перезагрузить сервер каждый раз, когда мы меняем код:

1
~container:start
Ссылка: Создание войны с помощью спрей-сервлета от нашего партнера по JCG Таммо Сминии в блоге JDriven .