Hi All,

I am currently writing unit test cases where exception mappers are being
used in my service. Intermittently I get the following error when running
my tests :

==============
java.lang.ClassCastException:
org.wso2.carbon.andes.service.exceptions.InternalServerException cannot be
cast to org.wso2.carbon.andes.service.exceptions.MessageNotFoundException
at
org.wso2.carbon.andes.service.internal.exception.mappers.MessageNotFoundMapper.toResponse(MessageNotFoundMapper.java:30)
at
org.wso2.msf4j.internal.MSF4JMessageProcessor.handleThrowable(MSF4JMessageProcessor.java:138)
at
org.wso2.msf4j.internal.MSF4JMessageProcessor.receive(MSF4JMessageProcessor.java:81)
at
org.wso2.carbon.transport.http.netty.listener.WorkerPoolDispatchingSourceHandler$1.run(WorkerPoolDispatchingSourceHandler.java:125)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
==============

In the above exception, "MessageNotFoundException" maps to
"MessageNotFoundMapper" and "InternalServerException" maps to
"InternalServerErrorMapper".

The 2 exception classes have nothing in common and the 2 mapper classes
also have nothing in common.

I debugged further to find the issue with the attached
patch(ex-map-msf4j.diff) for logging(not sure whether I have the latest
code).

Following is the output when the error occurs :

[org.wso2.msf4j.internal.MicroservicesRegistry] : CLASS : public
javax.ws.rs.core.Response
org.wso2.carbon.andes.service.internal.exception.mappers.DestinationNotFoundMapper.toResponse(
*java.lang.Throwable*)
....
[org.wso2.msf4j.internal.MicroservicesRegistry] : CLASS : public
javax.ws.rs.core.Response
org.wso2.carbon.andes.service.internal.exception.mappers.InternalServerErrorMapper.toResponse(
*java.lang.Throwable*)
....
[org.wso2.msf4j.internal.MicroservicesRegistry] : CLASS : public
javax.ws.rs.core.Response
org.wso2.carbon.andes.service.internal.exception.mappers.MessageNotFoundMapper.toResponse(
*java.lang.Throwable*)

The issue here is that the paramtype is as "java.lang.Throwable". The
correct value should be as follows since there is a comparator for the
exceptionMapper map :

[org.wso2.msf4j.internal.MicroservicesRegistry] : CLASS : public
javax.ws.rs.core.Response
org.wso2.carbon.andes.service.internal.exception.mappers.DestinationNotFoundMapper.toResponse(
*org.wso2.carbon.andes.service.exceptions.DestinationNotFoundException*)
.....
[org.wso2.msf4j.internal.MicroservicesRegistry] : CLASS : public
javax.ws.rs.core.Response
org.wso2.carbon.andes.service.internal.exception.mappers.InternalServerErrorMapper.toResponse(
*org.wso2.carbon.andes.service.exceptions.InternalServerException*)
.....
[org.wso2.msf4j.internal.MicroservicesRegistry] : CLASS : public
javax.ws.rs.core.Response
org.wso2.carbon.andes.service.internal.exception.mappers.MessageNotFoundMapper.toResponse(
*org.wso2.carbon.andes.service.exceptions.MessageNotFoundException*)


According to what I was able to find out, this is an JDK error[1][2](Bug:
8029459 <http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8029459>) for
the method "em.getClass().getMethods()"[3].

Any advice on how to proceed or that needs to be checked from my side ?

[1] -
http://www.oracle.com/technetwork/java/javase/8-known-issues-2157115.html
[2] - http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8029459
[3] -
https://github.com/wso2/msf4j/blob/master/core/src/main/java/org/wso2/msf4j/internal/MicroservicesRegistry.java#L84

Regards,
Hemika

Hemika Kodikara
Software Engineer
WSO2 Inc.
lean . enterprise . middleware
http://wso2.com

Mobile : +94777688882
diff --git 
a/core/src/main/java/org/wso2/msf4j/internal/MicroservicesRegistry.java 
b/core/src/main/java/org/wso2/msf4j/internal/MicroservicesRegistry.java
index 075b4e7..44e35e2 100644
--- a/core/src/main/java/org/wso2/msf4j/internal/MicroservicesRegistry.java
+++ b/core/src/main/java/org/wso2/msf4j/internal/MicroservicesRegistry.java
@@ -86,7 +86,9 @@ public class MicroservicesRegistry {
                     findAny().
                     ifPresent(method -> {
                         try {
+                            log.info("CLASS : " + method.toString());
                             
exceptionMappers.put(Class.forName(method.getGenericParameterTypes()[0].getTypeName()),
 em);
+                            log.info("MAPPING ADDER : " + exceptionMappers);
                         } catch (ClassNotFoundException e) {
                             log.error("Could not load class", e);
                         }
@@ -95,6 +97,7 @@ public class MicroservicesRegistry {
     }
 
     Optional<ExceptionMapper> getExceptionMapper(Throwable throwable) {
+        log.info("EXCEPTION MAPPERS : " + exceptionMappers);
         return exceptionMappers.entrySet().
                 stream().
                 filter(entry -> 
entry.getKey().isAssignableFrom(throwable.getClass())).
@@ -110,6 +113,7 @@ public class MicroservicesRegistry {
                 ifPresent(method -> {
                     try {
                         
exceptionMappers.remove(Class.forName(method.getGenericParameterTypes()[0].getTypeName()));
+                        log.info("MAPPING REMOVING : " + exceptionMappers);
                     } catch (ClassNotFoundException e) {
                         log.error("Could not load class", e);
                     }
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to