Siempre se me olvida, ¿a tí también?
WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext());
Siempre se me olvida, ¿a tí también?
WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext());
He partido de esta documentación que está muy bien
https://jaxb.dev.java.net/jaxb-maven2-plugin/
El primer problema que he tenido ha sido descargar el jar del plugin a pesar de definir el repositorio
<repository>
<id>java.net</id>
<name>java.net Maven Repository</name>
<url>https://maven-repository.dev.java.net/nonav/repository</url>
<layout>legacy</layout>
</repository>
He encontrado el jar en
https://maven-repository.dev.java.net/repository/com.sun.tools.xjc.maven2/maven-plugins/
Lo he descargado y después lo he instalado en mi respoitorio
mvn install:install-file -DgroupId=com.sun.tools.xjc.maven2 -DartifactId=maven-jaxb-plugin -Dversion=1.1 -Dpackaging=maven-plugin -Dfile=maven-jaxb-plugin-1.1.jar
Una vez hecho esto he configurado un poco el plugin, ya que para trabajar con dtds hace falta algún pequeño cambio sobre la documentación inicial
<plugin>
<groupId>com.sun.tools.xjc.maven2</groupId>
<artifactId>maven-jaxb-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<generatePackage>es.test.ejemplo.xml</generatePackage>
<includeSchemas>
<includeSchema>**/ejemplo.dtd</includeSchema>
</includeSchemas>
<excludeSchemas>
<excludeSchema>**/*.xml</excludeSchema>
</excludeSchemas>
<includeBindings>
<includeBinding>*.xjb</includeBinding>
</includeBindings>
<strict>true</strict>
<verbose>true</verbose>
<args>-dtd</args>
</configuration>
</plugin>
Los cambios necesarios sobre la documentación original están marcados en negrita.
Sólo se puede hacer la generación de un DTD y hay que pasar un argumento –dtd al generador para que funcione correctamente.
Sólo recordar que el dtd ha de estar en el directorio src\main\resources
Una vez hecho se han generado las clases correctamente en el directorio target\generated-sources\xjc
Para hacer que todo compile y se ejecute correctamente hay que añadir las siguientes dependencias :
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.0.5</version>
</dependency>
Y así hacer marshal y unmarshal se vuelve trivial
public String marshal(XMLRequest request) throws JAXBException, UnsupportedEncodingException {
JAXBContext context = JAXBContext.newInstance(XMLRequest.class
.getPackage().getName());
Marshaller m = context.createMarshaller();
ByteArrayOutputStream bo = new ByteArrayOutputStream();
m.marshal(request, bo) ;
return bo.toString(“UTF-8″);
}
public Fact24Request unmarshal(String xml) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(XMLRequest.class
.getPackage().getName());
Unmarshaller um = context.createUnmarshaller();
Fact24Request request = (XMLRequest) um.unmarshal(new StringReader(xml));
return request;
}
Como me convenció bastante Grails he dedido seguir trabajando un poco en la aplicación.
He añadido un campo autocomplete y un calendario para las fechas.
He usado el plugin richui y en total he dedicado 3 horas.
A mejorar:
Localización de los mensajes y formatos. Sería interesante que se completara el plugin con los mensajes de otros idiomas.
En general creo que los tags que ofrece este plugin se pueden mejorar, pero tiempo al tiempo.
Referencias:
Documentación RichUI plugin : http://docs.codehaus.org/display/GRAILS/RichUI+Plugin
Otros plugins : http://docs.codehaus.org/display/GRAILS/Plugins
Grails usa un sistema denominado “convention” que yo traduciría por “acuerdo”, en vez de usar el clásico sistema de configuración con XML y esta es una de sus claras ventajas a la hora de conseguir un rápido desarrollo. Además usa Groovy, un lenguaje de scripting basado en Java, lo cual reduce la cantidad de código necesaria.
Pero no sólo eso, hay otros elementos que ayudan a un desarrollo rápido. El sistema de plugins permite entre otras cosas, instalar un plugin usando simplemente el comando “grails install-plugin XXX” y empezar a utilizarlo sin tener que configurar nada. Hay plugins para muchas cosas, por ejemplo RIA, entendido como usar librerías javascript para mejorar la presentación o hacer llamadas AJAX, también puedes incorporar jasper reports o hacer la presentación con FLEX.
También es muy interesante el uso de plantillas, aunque lo permite, no es necesario generar todo el código necesario para un mantenimiento, o CRUD como dicen algunos, puedes tenerlo definido como plantillas tanto para archivos groovy (controlador) como para archivos gsp (vista).
Para aprender he decido hacer una pequeña aplicación de gestión de las compras de casa. Básicamente es una aplicación para mantener 7 tablas, una de ellas con una relación maestro detalle.
Para desarrollar la aplicación completa he necesitado 4 horas incluyendo en este tiempo la instalación de Grails. Lo que da una medida de la mejora de productividad que conlleva.
Cosas a mejorar:
Facilitar el desarrollo en IDE: Me refiero a syntax highlight, autocompletado, refactor y esas cosas. Hay un plugin para eclipse pero aún le falta mucho. IntelliJ IDEA puede que tenga un entorno de desarrollo mejor para Groovy pero no lo he probado.
Mejorar el control de errores: Como pasa en muchos frameworks los mensajes de error no son claros ni completos o incluso despistan más que ayudan.
Riesgos:
Se trata de un framework muy joven, la versión 1.0 es de febrero de 2008, lo cual implica que es muy dinámico, que hay cosas que pueden cambiar en el futuro o que tu aplicación o tu plugin deje de funcionar dramáticamente si actualizas la versión por un bug del framework. Quiero añadir que este tipo de cosas ha pasado al actualizar a Grails 1.0.2.
Referencias:
Grails : http://grails.org/
Documentación Grails : http://dist.codehaus.org/grails/
Tutorial IBM : http://www.ibm.com/developerworks/java/library/j-grails01158/index.html
Groovy : http://groovy.codehaus.org/