Translate

miércoles, 27 de noviembre de 2013

Gradle: configurar las dependencias transitivas de tu build.gradle

Title: Configure your transitive dependencies from your build.gradle

Del mismo modo que hicimos en su momento con un proyecto maven para eliminar sus dependencias transitivas. Ahora haremos lo mismo con un proyecto Gradle pero además aprenderemos a manejarlas un poco más en profundidad.

Nos basaremos en un proyecto Web con Spring Framework de modo que nuestro proyecto utilice el repositorio de Maven y recupere dependencias de Spring Framework.

Para ello en nuestro build.gradle del proyecto ponemos lo siguiente:

build.gradle
--
apply plugin: 'java'
apply plugin: 'war'

sourceCompatibility = 1.5
version = '1.0.0'
jar {
    manifest {
    attributes 'Implementation-Title': 'mySpringWebProject', 'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile ('org.springframework:spring-webmvc:3.2.5.RELEASE')
}

--
Con esto conseguimos que se importen todas las librerías que el proyecto web necesita y incluyendo las dependencias transitivas de las que depende nuestra librería spring-webmvc.





Si no queremos que todas las dependencias transitivas de las librerías que utilizamos se descarguen haremos lo siguiente:

Modo 1:


--
.....
......
dependencies {
     compile ('org.springframework:spring-webmvc:3.2.5.RELEASE'){transitive=false}
    
}
.....
.....
--

Modo 2:

--
....
....
dependencies {
    compile module ('org.springframework:spring-webmvc:3.2.5.RELEASE')
}
....
....
--
Con estas opciones obtenemos sólo la importación de la librería seleccionada.


La flexibilidad de Gradle nos da la posibilidad de seleccionar que dependencias transitivas queremos que se descarguen o no.

--
...
...
dependencies {
    compile module ('org.springframework:spring-webmvc:3.2.5.RELEASE'){
      dependency 'org.springframework:spring-beans:3.2.5.RELEASE'
    }

....
....
--

Pero tenemos que tener en cuenta que las dependencias transitivas de la propia dependencias también se intentarán descargar. Por lo tanto todo lo que dependa de  spring-beans también se descargará.

El resultado es el siguiente:


Ya que spring-core es dependencia spring-beans al igual que commons-logging

Para que sólo se descargara spring-beans tenemos que poner lo siguiente.

Modo 1:

--
...
...
dependencies {
    compile module ('org.springframework:spring-webmvc:3.2.5.RELEASE'){
      dependency ('org.springframework:spring-beans:3.2.5.RELEASE'){
           transitive=false
      }
    }
}

....
....

--
Modo 2:

--

...
...

dependencies {
    compile module ('org.springframework:spring-webmvc:3.2.5.RELEASE'){
      dependency module('org.springframework:spring-beans:3.2.5.RELEASE')    }
}
....
....
--

De esta manera conseguimos el resultado deseado


Si queremos descargar varias, dependencias, por ejemplo spring-beans y spring-core, haremos los siguiente

--

...
...
dependencies {
    compile module ('org.springframework:spring-webmvc:3.2.5.RELEASE'){
      dependencies module('org.springframework:spring-beans:3.2.5.RELEASE'), 
                   module('org.springframework:spring-core:3.2.5.RELEASE')   
      
      }
}

....
....
--
De este modo obtenemos:



Espero que con todos estos ejemplos te hayan servido para aprender a configurar tus dependencias en tu proyecto Gradle.

Se agradecen comentarios, críticas y recomendaciones.

Referencias:
Grade Dependency Management Bascis
Gradle Dependency Managemet

jueves, 24 de octubre de 2013

Scripts para MongoDB con Javascript y JSON: ejemplo práctico

Title: Scripts for MongoDB with Javascript and JSON.

En esta entrada quiero ilustrar como se hace un script de actualización de datos para MongoDB utilizando el lenguaje de programación javascript.

Los datos en MongoDB están almacenados en JSON y vamos ver como poblar una base de datos con unos cuantos objectos JSON y también como realizar unas sencillas manipulaciones de los objectos creados.

Toda la información que aquí os pongo es todo lo que necesitáis para empezar a lanzar scripts a cualquier base de datos MongoDB situada en cualquier host o ip.

Se da por hecho que la instalación de MongoDB ya está hecha, sino puedes consultar aquí como instalarlo en Windows 7 de una manera muy sencilla.

Los pasos para crear y lanzar nuestros scripts son los siguientes:

1 - Arrancar motor de MongoDB
2 - Abrir una ventana de comandos y situarnos en el directorio bin de mongo.
3 - Creación del script de poblado de base de datos
4 - Lanzamiento del script.
5 - Comprobación  de datos
6 - Creación de script de actualización
7 - Lanzamiento del script.
8 - Comprobación  de datos

Nota: Siempre tenemos que tener un MongoDB instalado en nuestra máquina local donde realizaremos las operaciones de lanzamiento del script, pero esté script podrá ejecutar en cualquier instalación de MongoDB que tengas en remoto siempre que conozcas su host y puerto.


1 - Arrancar motor de MongoDB

Lo arrancamos yendo a la ruta de instalación de MongoDB y ejecutando: mongod --dbpath ..\data\db

[MONGODB-PATH]\bin\mongod --dbpath ..\data\db




2 - Abrir una ventana de comandos y situarnos en el directorio bin de mongo

En windows sería:

cmd
cd [MONGODB-PATH]\bin



3 - Creación del script de poblado de base de datos

Con nuestro editor favorito creamos un script en lenguaje javascript para ejecutarlo en la instancia de MongoDB que queramos.

Los aspectos importes que tenemos que tener en cuenta son los siguientes que se entenderán perfectamente al ver el código:

  • Tendremos que tener creada ya, una base de datos con su nombre. Si no la tenemos creada no pasa nada porque al utilizarla por primera vez e insertar en ella se creará.          
  •  En el propio script elegimos  el host o direccion ip del mongodb donde se ejecutará este script y la base de datos donde se aplicará. Es decir que es en el propio script donde indica el destino de todo.
  • Al ser MongoDb una base de datos NoSQL no es necesario crear una estructura de datos previa directamente iremos insertando nuestros datos con código javascript y estructura JSON.
  • El ID de los registros prefiero introducirlo yo manualmente porque si dejamos que el propio Mongodb nos lo autogenere no lo hace como un número entero normal y a la hora de buscarlo desde una aplicación puede resultar complicado. Así que recomiendo generar los ID de los registros en el servidor con un generador de ids único y añadirlo a tus registros, otra opción es generar el código con una función en javascript dentro del propio script.


El script de relleno de la base de datos es el siguiente:



--

/*
 * Script que se encarga de poblar la base de datos  
 * 
 */

print("STARTING SCRIPT");
//Host donde está nuestra base de datos, no tiene que ser nuestro equipo local, puede ser cualquier mongoDb.
conn = new Mongo("localhost");
//Nombre de la base de datos que vamos a utilizar
db = conn.getDB("antuandb");

/*Limpiamos la base de datos por si existia algo antes*/
db.dropDatabase();


/*coleciones de nuestro modelo de datos*/
db.createCollection("users");
db.createCollection("courses");

/* Usuarios */
print("***********creating users*********");


user1 = {
  
"_id" : "0",
"name" : "Antuan",
"surname" : "Martín",
"age": 35,
"deleted":false

}

user2 = {
  
"_id" : "1",
"name" : "Felime",
"surname" : "Rodriguez",
"age": 31,
"deleted":false

}


user3 = {
  
"_id" : "2",
"name" : "Jose",
"surname" : "Carrizo",
"age": 28,
"deleted":false

}


print("***********creating courses*********");

/* courses */


course1 = {
     
    "_id" : "0",
    "students" : [],
    "tutors" : [],
    "name":"Master en Animación y Modelado 3d con Maya en Madrid",
    "credits":3.5,
    "hours":35
  
};

course2 = {
   
    "_id" : "1",
    "students" : [],
    "tutors" : [],
    "name":"SEO: Posicionamiento Web en Buscadores",
    "credits":4.0,
    "hours":40
  
};

course3 = {
   
    "_id" : "2",
    "students" : [],
    "tutors" : [],
    "name":"Máster en Game design",
    "credits":2.8,
    "hours":28  
};


print("***********saving users*********");
db.users.save(user1);
db.users.save(user2);
db.users.save(user3);

print("***********saving courses*********");
db.courses.save(course1);
db.courses.save(course2);
db.courses.save(course3);


print("SCRIPT FINISHED");

--

4 - Lanzamiento del script.

Ya tenemos el script guardado en un archivo por ejemplo llamado initDB.js y estamos situados en el directorio [MONGODB-PATH]\bin como indicamos en el apartado 2.

Para larzar el script ejecutamos el siguiente comando.

mongo archivo1.js [archivon.js]

en nuestro caso

mongo initDB.js

Nota: Podemos poner tantos archivos .js como utilicemos, o sea que se pueden dividir los scripts en varios archivos.


Si tenemos algún error durante la ejecución podemos verlo en la salida de la ventana de comandos, tras la ejecución del script, donde nos dirá el error cometido y la línea en la que se ha producido, en este caso la línea 71 y nos se ha producido un SyntaxError.

--

MongoDB shell version: 2.4.1
connecting to: test
Mon Oct 21 18:12:09.559 JavaScript execution failed: SyntaxError: 
Unexpected string at C:\......\initDB.js:L71
failed to load: C:\..............\initDB.js

--


Una vez ejecutado el script correctamente obtengo la siguiente salida.

--
C:\mongodb-win32-2.4.1\bin>mongo initDB.js
MongoDB shell version: 2.4.1
connecting to: test
STARTING SCRIPT
***********creating users*********
***********creating courses*********
***********saving users*********
***********saving courses*********
SCRIPT FINISHED

--

No hay que hacer caso de lo del mensaje:

connecting to: test

porque es la base de datos de conexión por defecto.



5 - Comprobación  de datos

Yo recomiendo siempre que ejecutes un script comprobar los datos que se han introducido en la base de datos sean correctos tanto en número de registros como en los tipos de datos, porque podemos llevarnos sorpresas y quizás lo que era un Double es un String o lo que debia de ser un Array es un String y eso es un error grave.

Con el software MongoVUE que ya os he recomendado podemos ver esto sin problemas.

NOTA: No os fieis nunca del modo texto porque no deja de ser una interpretación del JSON, yo siempre me voy a la vista en arbol para comprobar los tipos de datos de cada campo (String, Double, Arry, etc..).



Si no te has descargado MongoVE, lo cual es un error muy grande, tienes la opción de ver los resultados por consola, para ello ejecutamos lo siguiente en una ventana de comandos:

mongo

y entramos en la shell de mongo, donde podremos operar con la base de datos realizar las siguiente operaciones, una para usar la base de datos que nos hace falta y la segunda para realizar la query de consulta de los datos.

> use antuandb
> db.users.find()

Y podremos ver el resultado en pantalla pero queda muy feo y no podemos ver bien los tipos de datos.






6 - Creación de script de actualización

Una vez que hemos creado un script de llenado de la base de datos ahora vamos a hacer un script de actualización de los datos que tenemos.

Vamos a hacer dos modificaciones sobre los datos para que podamos ver varios ejemplos de actualización.

  • Primero: vamos añadir un campo nuevo a todos los cursos que es deleted=false y sumaremos una hora al campo hours.
  • Segundo: vamos agregar a los usuarios menores de 30 a los cursos como alumnos y a los mayores de 30 como tutor.

Cosas importantes a tener en cuenta:

  • Al realizar una query los datos se almacenan una variable de tipo cursor que podemos recorrer y a su vez nos darán funciones interesantes como count() o forEach(funciton).
  • En la query donde buscamos los cursos debemos de utilizar la función snapshot porque si no la usamos al realizar modificaciones sobre los propios objetos que están en el cursos de resultados este se podría ver alterado. Usando snapshot garantizamos que los datos recuperados en ese cursos no se alterarán.
  •  La manera de recorrer los datos es usando la función forEach que incluirá una función para procesar cada unos de los datos del cursor.
  • lo la función addToSet introducimos un valor en un array del objeto de MongoDB de tal modo que si el objeto ya existe este no se inserta 2 veces. Esto lo hacemos para introducir el id del usuario en el array de alumnos o de tutores del curso.



--
/*
 * Script que se encarga de actualizar la base de datos  
 * 
 */

print("STARTING SCRIPT");
//Host donde está nuestra base de datos, no tiene que ser nuestro equipo local, puede ser cualquier mongoDb.
conn = new Mongo("localhost");
//Nombre de la base de datos que vamos a utilizar
db = conn.getDB("antuandb");

var i_int = 0;
var modificados_int = 0;
var ignorados_int = 0;
var erroneos_int = 0;

//Recuperamos todos los cursos
var courses_cur = db.courses.find().snapshot();
var totalSize_int = courses_cur.count();

print("******FIRST PART UPDATING COURSES************");

courses_cur.forEach(function(course){
 i_int++;
 print("*********************************");
    print("RECORD "+i_int +" of " + totalSize_int);   
 print("PROCESSING:"+ course.name + "("+course._id+")");
 
 //añado la nueva propiedad
 course.deleted = false;
 
 //Modifico propiedad existente
 course.hours = course.hours + 1;
   
 db.courses.save(course);
 
 print("UPDATED");
});

print("******END FIRST PART************");

print("******SECOND PART ADDING STUDENTS AND TUTORS************");

//Recorro todos los cursos
courses_cur = db.courses.find().snapshot();
courses_cur.forEach(function(course){
   print("*********************************");
   print("PROCESSING COURSE:"+ course.name + "("+course._id+")");
   var id_course = course._id;
   
   //Recupero los usario mayores de 30 años
   var users_cur = db.users.find({age:{$gt:30}}).snapshot();
         
   users_cur.forEach(function(user){
    
    print("      PROCESSING USER:"+ user.name + "("+user._id+")");
    var id_user = user._id;    
    db.courses.update({_id:id_course},{$addToSet:{"students":id_user}});
    
    print("      USER ADDED AS STUDENT");
 
   });
   
   //Recupero los usuarios menores de 30 años
   var users_cur = db.users.find({age:{$lte:30}}).snapshot();
   users_cur.forEach(function(user){
    
    
    print("      PROCESSING USER:"+ user.name + "("+user._id+")");
    var id_user = user._id;    
    db.courses.update({_id:id_course},{$addToSet:{"tutors":id_user}});
    
    print("      USER ADDED AS TUTOR");
    
   });      
 
});




--



7 - Lanzamiento del script.

Una vez guardado el script en el archivo updateDB.js lo ejecutamos igual que hicimos en el paso 4

mongo updateDB.js

La salida es la siguiente




--
C:\mongodb-win32-2.4.1\bin>mongo updateDB.js
MongoDB shell version: 2.4.1
connecting to: test
STARTING SCRIPT
******FIRST PART UPDATING COURSES************
*********************************
RECORD 1 of 3
PROCESSING:Master en Animación y Modelado 3d con Maya en Madrid(0)
UPDATED
*********************************
RECORD 2 of 3
PROCESSING:SEO: Posicionamiento Web en Buscadores(1)
UPDATED
*********************************
RECORD 3 of 3
PROCESSING:Máster en Game design(2)
UPDATED
******END FIRST PART************
******SECOND PART ADDING STUDENTS AND TUTORS************
*********************************
PROCESSING COURSE:Master en Animación y Modelado 3d con Maya en Madrid(0)
      PROCESSING USER:Antuan(0)
      USER ADDED AS STUDENT
      PROCESSING USER:Felipe(1)
      USER ADDED AS STUDENT
      PROCESSING USER:Jose(2)
      USER ADDED AS TUTOR
*********************************
PROCESSING COURSE:SEO: Posicionamiento Web en Buscadores(1)
      PROCESSING USER:Antuan(0)
      USER ADDED AS STUDENT
      PROCESSING USER:Felipe(1)
      USER ADDED AS STUDENT
      PROCESSING USER:Jose(2)
      USER ADDED AS TUTOR
*********************************
PROCESSING COURSE:Máster en Game design(2)
      PROCESSING USER:Antuan(0)
      USER ADDED AS STUDENT
      PROCESSING USER:Felipe(1)
      USER ADDED AS STUDENT
      PROCESSING USER:Jose(2)
      USER ADDED AS TUTOR
SCRIPT FINISHED

--


8 - Comprobación  de datos

Finalmente realizamos la comprobación de que que los datos se han usertado correctamente, recomiendo hacerlo porque MongoDB no da errores si la inserción no es correcta o te equivocas en una query, directamente seguirá ejecutando el código como nada hubiera pasado.

echando un ojo a los datos vemos que todo está correcto y ya está todo terminado.



--

{
  "_id" : "0",
  "credits" : 3.5,
  "deleted" : false,
  "hours" : 41.0,
  "name" : "Master en Animación y Modelado 3d con Maya en Madrid",
  "students" : ["0", "1"],
  "tutors" : ["2"]
}

{
  "_id" : "0",
  "name" : "Antuan",
  "surname" : "Martín",
  "age" : 35.0,
  "deleted" : false
}

--


Espero que os resulte muy útil y si es así se agradece un comentario. También se aceptan críticas y mejoras de mismo, así como dudas.

Referencias:

Write Scripts for the mongoDb Shell




miércoles, 11 de septiembre de 2013

Error usando Junit combinado con AspectJ: AspectJAdviceParameterNameDiscoverer$AmbiguousBindingException

En nuestro proyecto J2EE hemos utilizado AspectJ para capturas las excepciones que se producen en la parte servidora en JAVA.

Es muy cómodo porque no tienes que poner bloques try....catch en todos los servicios de la aplicación para aplicar la gestión que quieras a las excepciones, de este modo tienes toda la gestión de las excepciones en un solo punto.

El problema lo tenemos a la hora de hacer los test unitarios y de integración con JUNIT ya que no se lleva nada bien el tema de que los servicios sobre los que hacemos los test. Los casos de uso que tenemos son los siguientes:

1 - Creación y ejecución de los test en Eclipse. En este caso los test pasan correctamente



2 - Ejecución de los test en Jenkins a través de un scripts (maven o ant) de compilación y ejecución de los test.

En este caso es donde nos encontramos con el problema de que la solución de la utilización de Aspecj para la gestión de excepciones no funciona porque nos devuelve el siguiente error.


--

java.lang.IllegalStateException: Failed to load ApplicationContext
 at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
 at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
 at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
 at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
 at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
 at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.data.repository.core.support.RepositoryInterfaceAwareBeanPostProcessor#0': BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.aop.aspectj.AspectJAdviceParameterNameDiscoverer$AmbiguousBindingException: Still 2 unbound args at this(),target(),args() binding stage, with no way to determine between them
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
 at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:740)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:449)
 at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103)
 at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
 at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
 at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
 at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
Caused by: org.springframework.aop.aspectj.AspectJAdviceParameterNameDiscoverer$AmbiguousBindingException: Still 2 unbound args at this(),target(),args() binding stage, with no way to determine between them
 at org.springframework.aop.aspectj.AspectJAdviceParameterNameDiscoverer.maybeBindThisOrTargetOrArgsFromPointcutExpression(AspectJAdviceParameterNameDiscoverer.java:519)
 at org.springframework.aop.aspectj.AspectJAdviceParameterNameDiscoverer.getParameterNames(AspectJAdviceParameterNameDiscoverer.java:264)
 at org.springframework.core.PrioritizedParameterNameDiscoverer.getParameterNames(PrioritizedParameterNameDiscoverer.java:54)
 at org.springframework.aop.aspectj.AbstractAspectJAdvice.bindArgumentsByName(AbstractAspectJAdvice.java:420)
 at org.springframework.aop.aspectj.AbstractAspectJAdvice.calculateArgumentBindings(AbstractAspectJAdvice.java:375)
 at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getAdvice(ReflectiveAspectJAdvisorFactory.java:218)
 at org.springframework.aop.aspectj.annotation.InstantiationModelAwarePointcutAdvisorImpl.instantiateAdvice(InstantiationModelAwarePointcutAdvisorImpl.java:140)
 at org.springframework.aop.aspectj.annotation.InstantiationModelAwarePointcutAdvisorImpl.<init>(InstantiationModelAwarePointcutAdvisorImpl.java:89)
 at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getAdvisor(ReflectiveAspectJAdvisorFactory.java:134)
 at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory$1.doWith(ReflectiveAspectJAdvisorFactory.java:74)
 at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:473)
 at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:451)
 at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getAdvisors(ReflectiveAspectJAdvisorFactory.java:70)
 at org.springframework.aop.aspectj.annotation.BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors(BeanFactoryAspectJAdvisorsBuilder.java:109)
 at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors(AnnotationAwareAspectJAutoProxyCreator.java:86)
 at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:107)
 at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:278)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:880)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:852)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:446)


--

La solución a este problema consiste en añadir un parámetro en la compilación de las clases en el script que se encarga de compilar las clases. El parámetro añadir es el siguiente: -g:vars

Os pongo el ejemplo de como lo añado en mi script donde todas mis clases están en las carpetas src y javatest

--
<path id="lib.path.ref">
      <fileset dir="../WebContent/WEB-INF/lib" includes="*.jar"/>
   <fileset dir="./libs" includes="*.jar"/>
</path>
<javac srcdir="../src:../javatest"
          destdir="${DirectorioBase}/WEB-INF/classes"
          classpathref="lib.path.ref"
          debug="off"
          source="1.7"
          optimize="true"
          target="1.7"
          fork="true"
   encoding="UTF8"
          includeantruntime="true">
    
                 <compilerarg value="-g:vars"/>  <!--Argumento especial para la compilación de AspectJ -->
</javac>
--

Con esto el error desaparece completamente.

Referencias:

Referencia 1 - SpringSource

Referencia 2 - epubbud