Alerts that fire on the results of operations.
mcorey Jul 1, 2004 4:19 PMThe original post became unavailable after a reply with code:
Hi,
I'm pleased to join you here.
I have a problem with the annotation Java 1.4 together with a Class[] parameter. My annotation is related to a refactoring initiative
to avoid repeating all the lookup/narrow stuff when using EJB. The annotation tag is:
@@annot.ejblookup (invocarConstrutorParmsArray={br.com.ilheus.hotels.HotelManagerHome,java.lang.String,float,
net.sourceforge.junitejb.EJBTestCase,br.com.ilheus.hotels.ReservationLocalHome,int})
Thus the annotation class is:
package annot;
public interface ejblookup {
Class[] invocarConstrutorParmsArray();
}
The problem is:
20:01:23,686 INFO [HomeLookupTest] Starting: testLookup
20:01:23,702 INFO [STDOUT] java.lang.RuntimeException: java.lang.RuntimeExcepti
on: java.lang.ClassNotFoundException: No ClassLoaders found for: float
20:01:23,702 INFO [STDOUT] at org.jboss.aop.annotation.AnnotationElement.ge
tVisibleAnnotation(AnnotationElement.java:92)
20:01:23,702 INFO [STDOUT] at org.jboss.aop.annotation.AnnotationElement.ge
tAnyAnnotation(AnnotationElement.java:107)
20:01:23,702 INFO [STDOUT] at br.com.ilheus.hotels.aspects.EjbHomeLookupInt
erceptor.invoke(EjbHomeLookupInterceptor.java:41)
The AnnotationElement class don't deal correctly with primitive classes. The Class[] has the constructor parameters that should be
invoked instead of the constructor annotated. The parameters should also be delegated and I don't want to refactor the primitive types to their
wrapper classes. Moreover, the EJB dependencies would be provided in a IoC fashion.
Maybe, it is a conceptual issue related to the reflection and the javassist API. Any clarification?
Bill Burke had replied that this is a bug on the framework.
As a workaround: I used a comma-separated list as String:
package annot;
public interface ejblookup {
String invocarConstrutorParmsArray();
}
@@annot.ejblookup (invocarConstrutorParmsArray="br.com.ilheus.hotels.HotelManagerHome,java.lang.String,float,
net.sourceforge.junitejb.EJBTestCase,br.com.ilheus.hotels.ReservationLocalHome,int")
String [] parms = annotejb.invocarConstrutorParms().split(",");
Class [] parmsClassArray = new Class[parms.length];
for (int cont = 0; cont < parms.length; cont++) {
if (parms[cont].equals("char")) parmsClassArray[cont] = Character.TYPE;
else if (parms[cont].equals("byte")) parmsClassArray[cont]= Byte.TYPE;
else if (parms[cont].equals("short")) parmsClassArray[cont] = Short.TYPE;
else if (parms[cont].equals("int")) parmsClassArray[cont] = Integer.TYPE;
else if (parms[cont].equals("long")) parmsClassArray[cont] = Long.TYPE;
else if (parms[cont].equals("float")) parmsClassArray[cont] = Float.TYPE;
else if (parms[cont].equals("double")) parmsClassArray[cont] = Double.TYPE;
else parmsClassArray[cont] = Class.forName(parms[cont]);
}