2016-11-09 5 views
0

Je le code suivant qui essaie de lire une image Dicom:WebappClassLoader Impossible de charger une ressource

public BufferedImage readDicomFile(File dicomFile) { 

    ImageReader reader = (ImageReader) ImageIO.getImageReadersByFormatName("DICOM").next(); 
    BufferedImage tempImage = null; 
    try { 
     if (!dicomFile.exists()) {   
      return null; 
     } 
     ImageIO.scanForPlugins(); 
     tempImage = ImageIO.read(dicomFile);    
     DicomObject obj = new DicomInputStream(dicomFile).readDicomObject(); 
     String overlayData = obj.getString(1610625024); 
     if ((overlayData != null) && (overlayData.length() > 0)) { 
      tempImage = combineImages(tempImage, 
        OverlayUtils.extractOverlay(obj, 1610625024, reader, 
          "FFFFFF")); 
     } 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return tempImage; 
} 

Cependant, voici ce que je reçois:

SEVERE: java.lang.IllegalStateException: WEB9031: WebappClassLoader unable to load resource [org.dcm4che.data.DcmParserFactory], because it has not yet been started, or was already stopped 
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1401) 
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359) 
at org.dcm4cheri.imageio.plugins.DcmImageReaderSpi.canDecodeInput(DcmImageReaderSpi.java:113) 
at javax.imageio.ImageIO$CanDecodeInputFilter.filter(ImageIO.java:567) 
at javax.imageio.spi.FilterIterator.advance(ServiceRegistry.java:810) 
at javax.imageio.spi.FilterIterator.<init>(ServiceRegistry.java:804) 
at javax.imageio.spi.ServiceRegistry.getServiceProviders(ServiceRegistry.java:508) 
at javax.imageio.ImageIO.getImageReaders(ImageIO.java:646) 
at javax.imageio.ImageIO.read(ImageIO.java:1438) 
at javax.imageio.ImageIO.read(ImageIO.java:1308) 
at edu.kfshrc.dm.services.DicomViewerService.readDicomFile(DicomViewerService.java:565) 
at edu.kfshrc.dm.services.DicomViewerService.extractImageFromDicom(DicomViewerService.java:414) 
at edu.kfshrc.dm.servlet.DicomViewerServlet.doGet(DicomViewerServlet.java:131) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
at java.lang.Thread.run(Thread.java:722) 

SEVERE:  at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1401) 
SEVERE:  at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359) 
SEVERE:  at org.dcm4cheri.imageio.plugins.DcmImageReaderSpi.canDecodeInput(DcmImageReaderSpi.java:113) 
SEVERE:  at javax.imageio.ImageIO$CanDecodeInputFilter.filter(ImageIO.java:567) 
SEVERE:  at javax.imageio.spi.FilterIterator.advance(ServiceRegistry.java:810) 
SEVERE:  at javax.imageio.spi.FilterIterator.<init>(ServiceRegistry.java:804) 
SEVERE:  at javax.imageio.spi.ServiceRegistry.getServiceProviders(ServiceRegistry.java:508) 
SEVERE:  at javax.imageio.ImageIO.getImageReaders(ImageIO.java:646) 
SEVERE:  at javax.imageio.ImageIO.read(ImageIO.java:1438) 
SEVERE:  at javax.imageio.ImageIO.read(ImageIO.java:1308) 
SEVERE:  at edu.kfshrc.dm.services.DicomViewerService.readDicomFile(DicomViewerService.java:565) 
SEVERE:  at edu.kfshrc.dm.services.DicomViewerService.extractImageFromDicom(DicomViewerService.java:414) 
SEVERE:  at edu.kfshrc.dm.servlet.DicomViewerServlet.doGet(DicomViewerServlet.java:131) 
SEVERE:  at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) 
SEVERE:  at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
SEVERE:  at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 
SEVERE:  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
SEVERE:  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
SEVERE:  at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
SEVERE:  at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
SEVERE:  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 
SEVERE:  at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 
SEVERE:  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
SEVERE:  at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 
SEVERE:  at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
SEVERE:  at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 
SEVERE:  at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 
SEVERE:  at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 
SEVERE:  at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 
SEVERE:  at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
SEVERE:  at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
SEVERE:  at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
SEVERE:  at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
SEVERE:  at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
SEVERE:  at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
SEVERE:  at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
SEVERE:  at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
SEVERE:  at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
SEVERE:  at java.lang.Thread.run(Thread.java:722) 

Je passe un fichier objet qui pointe vers un certain chemin: "c: \ temp2 \ testing.dcm". Quand il arrive à la ligne qui essaie de lire le fichier Dicom, il donne l'erreur ci-dessus.

Pourriez-vous m'aider s'il vous plaît?

+1

je « ImageIO.scanForPlugins() » et cela a fonctionné. Cependant, cela ne fonctionnait pas correctement tout le temps. C'était sporadique. En outre, la lecture de l'image en utilisant "ImageIO.read (dicomFile)" était également sporadique. Parfois, la lecture réussit et parfois elle donne une "NullPointerException" ou "Impossible d'obtenir le format". Parfois, il ne donne pas d'erreur, mais il lit faussement, ce qui donne une image qui ne peut pas être écrite. –

Répondre

0

Salam Wael,

La cause racine du problème est le conteneur de servlets (tomcat, ..) ne peut pas gérer l'enregistrement/de-enregistrement des bibliothèques natives automatiquement

Cela signifie que lorsque dcm4che charges plug-in DICOM ImageIO qui utilise la librairie native à l'intérieur du plugin, si vous voulez l'utiliser depuis une autre webApp (Servlet), vous devez scanner le plugin à nouveau pour chaque exécution du code du lecteur/encodeur DICOM dcm4che.

Je recommande à désenregistrer le natif ImageIO Plugins par vous-même après chaque excution afin d'éviter les fuites de mémoire potentiels dans l'avenir

 try{ 
ImageIO.scanForPlugins() 
    //Dicom code 
     } 
    catch { 
    //exceptions 
    } 
    finally { 
       try { 
        // De-register any locally registered IIO plugins. Relies on 
        // each web app having its own context class loader. 
        final IIORegistry registry = IIORegistry.getDefaultInstance(); 
        final LocalFilter localFilter = new LocalFilter(Thread.currentThread().getContextClassLoader()); 

        // scanForPlugins uses context class loader 
        Iterator<Class<?>> categories = registry.getCategories(); 

        while (categories.hasNext()) { 
         Class<?> category = categories.next(); 
         Iterator<?> providers = registry.getServiceProviders(category, localFilter, false); 

         // Copy the providers, as de-registering while iterating 
         // over providers will lead to 
         // ConcurrentModificationExceptions. 
         List<Object> providersCopy = new ArrayList<Object>(); 
         while (providers.hasNext()) { 
          providersCopy.add(providers.next()); 
         } 

         for (Object provider : providersCopy) { 
          registry.deregisterServiceProvider(provider); 
          log.debug(String.format("Unregistered locally installed provider class: %s",provider.getClass())); 
         } 
        } 
       } catch (Exception ex) { 
        _logger.error("Exception occured while de-registering locally registered IIO plugins", ex); 
       } 
+0

Désolé pour la réponse tardive. Merci beaucoup. Cela a réellement fonctionné. Juste une petite chose que je suis confronté après cela. Quand je fais quelques changements sur le code et compile, il donne une erreur quand il s'agit de convertir en image JPEG. C'est l'erreur: SEVERE: java.lang.IllegalStateException: Impossible d'obtenir le format Cette erreur disparaît lorsque je redémarre le serveur my application, qui est glassfish, puis il fonctionne très bien. Avez-vous une idée de ce qui se passe, et comment puis-je éliminer le besoin de redémarrer le serveur? –

+0

Salam Wael ce nuage se produire pour plusieurs raisons, il est difficile de savoir sans voir le code, gardez également à l'esprit que le plugin ImageIO pour les lecteurs et les écrivains utilise nativeLib comme implémentation pour l'algorithme de compression -je ai besoin de fichiers imageIo jar + dll natif dans le répertoire de la bibliothèque mondiale poissons de verre non dans l'application web \ WEB-INF lib -cleanup utilisé plugins après chaque demande -scan pour plug-in avant d'obtenir les lecteurs et serveurs chaque fois cela peut vous aider en général, sans enquête de code –

+0

Désolé pour la réponse tardive Ahmed. Cela a fonctionné lorsque j'ai déplacé tous les fichiers JAR qui se trouvaient sous le dossier WEB-INF \ lib dans le dossier C: \ opt \ glassfish3 \ glassfish \ lib. J'ai essayé de faire des changements beaucoup de fois et ça fonctionne bien sans avoir à redémarrer le serveur. –