2016-04-07 22 views
0

finden Ich habe jetzt eine Zeit lang mapstruct worden verwenden, haben aber dieses Problem gefunden, während einer meiner Web Service bereitstellen versuchen:Weblogic 12c - Mapstruct - 1.0.0.Final - ClassNotFoundException: Kann nicht Implementierung

Target state: deploy failed on Server my_server 
java.lang.ClassNotFoundException: Cannot find implementation for bar.foo.mapper.MyMapper 

at weblogic.deploy.api.tools.deployer.Jsr88Operation.report(Jsr88Operation.java:547) 
at weblogic.deploy.api.tools.deployer.Deployer.perform(Deployer.java:140) 
at weblogic.deploy.api.tools.deployer.Deployer.runBody(Deployer.java:88) 
at weblogic.utils.compiler.Tool.run(Tool.java:158) 
at weblogic.utils.compiler.Tool.run(Tool.java:115) 
at weblogic.Deployer.run(Deployer.java:74) 
... 15 more 

Wenn ich den implementierten WAR überprüfe, sind im selben bar.foo.mapper-Ordner MyMapper.class und MyMapperImpl.class wie in anderen Diensten, die korrekt funktionieren.

In der POM, ich habe die Einrichtung wie in der offiziellen doc angegeben gefolgt.

Ich habe bereits gelesen @ Gunnar Antwort here, aber in meinem Fall ist die Implementierung neben der Schnittstelle in der WAR.

Irgendwelche Ideen?

Danke!

UPDATE: Ich mit Version gerade versucht 1.1.0.Beta1 mit den gleichen Ergebnissen

UPDATE-2: Dies ist das Protokoll der Ausnahme geworfen:

Caused By: java.lang.ClassNotFoundException: Cannot find implementation for bar.foo.mapper.MyMapper 
     at org.mapstruct.factory.Mappers.getMapper(Mappers.java:94) 

beim Debuggen , wird die Ausnahme hier geworfen:

T mapper = (T) classLoader.loadClass(clazz.getName() + IMPLEMENTATION_SUFFIX).newInstance(); 

... weil classLoader.loadClass nicht fin tut d bar.foo.mapper.MyMapperImpl, obwohl die Klasse neben der Schnittstelle ist.

Antwort

1

Können Sie versuchen, eine Kopie der Mappers Klasse zu erstellen, und clazz.getClassLoader() als Lader für die Impl-Klasse verwenden? Dies sollte den Trick machen. Können Sie mich wissen lassen, ob das funktioniert? Wenn ja, werden wir es in der nächsten Version ändern. Vielen Dank!

+0

Das hat es geschafft! Ich habe die 'Thread.currentThread(). GetContextClassLoader()' (die privilegierte Aktion) mit 'clazz.getClassLoader()' geändert –