jueves, 1 de septiembre de 2016

Spark Framework (III) Corriendo en Tomcat

Si se utiliza Tomcat como servidor de aplicaciones y hacemos referencia a una peticion REST que se ejecuta en Jetty, vamos a tener un problema de cruce de dominios que se puede resolver de 2 maneras:
  1. Utilizando CORS (que no va a proceder ahora)
  2. Utilizando Tomcat como servidor tanto de REST como de WEB
Vamos pues a seguir el 2º punto que es migrar todo a Tomcat.

Migración del proyecto Spark a Tomcat

Primeramente se crearán los WebServices en REST tal como se indicó en una entrada anterior.

Para ello he creado el paquete org.ximodante.spark que se encuentra en src/main/java

En este paquete he creado la clase HelloWord que es la del ejemplo de la documentación de Spark
(Ojo le he añadido el package org.ximodante.spark)

 package org.ximodante.spark
 import static spark.Spark.*;
public class HelloWorld {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}

Se prueba que todo funcione correctamente, llamando a

http://localhost:4567/hello

Sustituir la libreria del BuildPath spark-core-2.5.jar por spark-core-2.1.jar ya que Tomcat parece ser que no funciona muy bien sobre la versión 2.5.

La librería spark-core-2.1.jar se puede conseguir del proyecto en git  del brasileño Leonan Luppi al que hay que agradecer su inestimable ayuda.

Ahora se crea un proyecto Dynamic Web

File->New_>Dynamic Web Project

y por si las moscas escogemos la version 3.0 en vez de 3.1 para no tener problemas con el web.xml



1. Ahora hay que colocar el paquete org.ximodante.spark en src (y no en src/main/java)

2. Dentro de la carpeta WebContent/WEB-INF/lib hay que incluir los ficheros:

  • sparc-core-2.1.jar
  • slf4j-api-1.7.7.jar
que se pueden conseguir del enlace citado anteriormente de Leonan Luppi.

3. En eclipse nos situamos encima de estos dos ficheros en la carpeta indicada y con el botón derecho se añaden al buid-path.

4. Cambiar la clase HelloWorld de manera que:

  • Debe implementar la interfaz SparkApplication.
  • Hay que sustituir el método main() por el init() que aporta la interfaz
quedando así

package org.ximodante.spark
import static spark.Spark.*;
public class HelloWorld implements SparkApplication{
     @override
     public void init() {
        get("/hello", (req, res) -> "Hello World");
    }
}
5. El web.xml debe ser el siguiente, tal com se indica en la documentación de Spark.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>SparkTomcat</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  
  <filter>
    <filter-name>SparkFilter</filter-name>
    <filter-class>spark.servlet.SparkFilter</filter-class>
    <init-param>
        <param-name>applicationClass</param-name>
        <param-value>com.ximodante.spark.HelloWorld</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>SparkFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
6. Verificar que <display-name> apunta a la ruta que deseais, en principio será igual al nombre del proyecto, en este caso "SparkTomcat".
7. Comprobar que vuestra clase con la ruta del paquete se encuentra en <param-value> en este caso "com.ximodante.spark.HelloWorld".
8. Crear en fichero simple "html" por ejemple prueba.html y comprovar con Run as -> Run on Server (Tomcat) que se ve bien y no hay ningún problema. (La ruta que se muestra es http://localhost:8080/SparkTomcat/prueba.html)
9. Ahora en el navegador colocar la NUEVA ruta (en vez de http://localhost:4567/hello) :
  • http://localhost:8080:/SparkTomcat/hello
10. Ya está.