Partage
  • Partager sur Facebook
  • Partager sur Twitter

java EE java.lang.IllegalStateException

Exception non récuperé par le block catch

    12 février 2016 à 18:31:34

    Salut ! Je suis le cours sur java EE et je suis au niveau du chapitre sur l'envoi des fichiers. J'ai suivi toutes les instructions du chapitre pour mettre en oeuvre l'exemple mais au niveau des tests, pour un fichier trop grand l'exception IllegalStateException n'est pas récupéré par le block catch ce qui entraine une page d'erreur. J'ai besoin d'aide je ne sais pas comment résoudre cela voici la trace :

    java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field fichier exceeds its maximum permitted size of 10485760 bytes.
        at org.apache.catalina.connector.Request.parseParts(Request.java:2808)
        at org.apache.catalina.connector.Request.parseParameters(Request.java:3114)
        at org.apache.catalina.connector.Request.getParameter(Request.java:1100)
        at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:380)
        at sdz.pro.forms.UploadForm.getValeurChamp(UploadForm.java:158)
        at sdz.pro.forms.UploadForm.enregistrerFichier(UploadForm.java:41)
        at sdz.pro.servlets.Upload.doPost(Upload.java:33)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)
    Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field fichier exceeds its maximum permitted size of 10485760 bytes.
        at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl$1.raiseError(FileUploadBase.java:633)
        at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.checkLimit(LimitedInputStream.java:76)
        at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:135)
        at java.io.FilterInputStream.read(Unknown Source)
        at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98)
        at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:68)
        at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:293)
        at org.apache.catalina.connector.Request.parseParts(Request.java:2738)
        ... 32 more

    • Partager sur Facebook
    • Partager sur Twitter
      12 février 2016 à 19:05:38

      Bonjour.

      Avec le bloc try/catch nous pourrons t'aider !

      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        12 février 2016 à 19:34:46

        Pinguet62 a écrit:

        Bonjour.

        Avec le bloc try/catch nous pourrons t'aider !

        Voici la méthode dans laquelle se trouve le bloc try/catch

        public Fichier enregistrerFichier(HttpServletRequest requete, String chemin) {
        		
        		Fichier fichier = new Fichier();
        		String description = getValeurChamp(requete, CHAMP_DESCRIPTION);
        		
        		String nomFichier = null;
        		InputStream contenuFichier = null;
        		
        		try
        		{
        			Part part = requete.getPart(CHAMP_FICHIER);
        			nomFichier = getNomFichier(part);
        			if (nomFichier != null && !nomFichier.isEmpty())
        			{
        				nomFichier = nomFichier.substring( nomFichier.lastIndexOf( '/' )
        						+ 1 )
        						.substring( nomFichier.lastIndexOf( '\\' ) + 1 );
        				
        				contenuFichier = part.getInputStream();
        			}
        		}
        		catch ( IllegalStateException e ) 
        		{
        			/*
        			* Exception retournée si la taille des données dépasse les limites
        			* définies dans la section <multipart-config> de la déclaration de
        			* notre servlet d'upload dans le fichier web.xml
        			*/
        			e.printStackTrace();
        			setErreur( CHAMP_FICHIER, "Les données envoyées sont trop volumineuses." );
        		} 
        		catch ( IOException e ) 
        		{
        			/*
        			* Exception retournée si une erreur au niveau des répertoires de
        			* stockage survient (répertoire inexistant, droits d'accès
        			* insuffisants, etc.)
        			*/
        			e.printStackTrace();
        			setErreur( CHAMP_FICHIER, "Erreur de configuration du serveur." );
        		} 
        		catch ( ServletException e ) 
        		{
        			/*
        			* Exception retournée si la requête n'est pas de type
        			* multipart/form-data. Cela ne peut arriver que si l'utilisateur
        			* essaie de contacter la servlet d'upload par un formulaire
        			* différent de celui qu'on lui propose... pirate ! :|
        			*/
        			e.printStackTrace();
        			setErreur( CHAMP_FICHIER,"Ce type de requête n'est pas supporté, merci d'utiliser le formulaire prévu pour envoyer votre fichier." );
        		}
        		
        		if (erreurs.isEmpty())
        		{
        			try{
        				validationDescription(description);
        			}catch(Exception e)
        			{
        				setErreur(CHAMP_DESCRIPTION, e.getMessage());
        			}
        			fichier.setDescription(description);
        			
        			try{
        				validationFichier(nomFichier, contenuFichier);
        			}catch (Exception e)
        			{
        				setErreur(CHAMP_FICHIER, e.getMessage());
        			}
        			fichier.setNom(nomFichier);
        			
        		}
        		
        		if (erreurs.isEmpty())
        		{
        			try{
        				writeFile(contenuFichier, nomFichier, chemin);		
        			}catch (Exception e)
        			{
        				setErreur(CHAMP_FICHIER, "Erreur lors de l'écriture du fichier sur le disque.");
        			}
        		}
        		
        		if (erreurs.isEmpty())
        		{
        			resultat = "Succès de l'envoi du fichier.";
        		}
        		else
        		{
        			resultat = "Echec de l'envoi du fichier.";
        		}
        		
        		return fichier;
        		
        	}




        • Partager sur Facebook
        • Partager sur Twitter
          12 février 2016 à 20:05:02

          La ligne qui plante est celle où exécutes getValeurChamp
          Or il n'y a pas de try/catch autour.

          Attention à la gestion des Exception : n'utilises le try/catch uniquement sur les Exceptions dont tu dois gérer les erreurs.
          Si tu n'as pas de gestion d'erreur prévue alors laisse l'Exception se propager.

          Par exemple ServletException : "Ce type de requête n'est pas supporté, merci d'utiliser le formulaire prévu pour envoyer votre fichier"
          Ne le gère pas toi même : si cela se produit alors c'est parce qu'il y a un bug (dans ce cas corrige la), ou parce que l'utilisateur bidouille (et aura son erreur retournée par le serveur).

          Concernant la manipulation de chemin de fichier, inutile de se masturber le cerveau pour créer des bugs avec des ...+"/"+... ou des substring("/") ou indexOf("/").
          Il existe des classes pour faire ça proprement et surement : File ou Path ou Files, ... 

          • Partager sur Facebook
          • Partager sur Twitter
          Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
            13 février 2016 à 2:44:06

            Merci pour tes conseils. J'ai donc déplacé la ligne qui plantait plus loin dans mon code, plus précisément dans le 1er bloc if (erreurs.isEmpty()).

            A présent l'erreur vient de la ligne 11 ==>  Part part = requete.getPart(CHAMP_FICHIER);

            • Partager sur Facebook
            • Partager sur Twitter
              18 juin 2016 à 23:19:13

              Bonjour samycoul18, j'ai également la même erreur... j'ai aussi déplacé l'appel à getValeurChamp et étant donné que je teste aussi en poussant un fichier de plus de 130MB je m'attendais aussi à catcher l'exception InvalidStateException.

              C'est bien ce qu'il se passe mais il semble que cette exception ait un effet de bord quelque part.

              Le forward depuis la servlet n'arrive nul part et le browser web m'indique que la connexion a été réinitialisée :(

              • Partager sur Facebook
              • Partager sur Twitter
                27 août 2016 à 18:17:26

                JulienSié a écrit:

                Bonjour samycoul18, j'ai également la même erreur... j'ai aussi déplacé l'appel à getValeurChamp et étant donné que je teste aussi en poussant un fichier de plus de 130MB je m'attendais aussi à catcher l'exception InvalidStateException.

                C'est bien ce qu'il se passe mais il semble que cette exception ait un effet de bord quelque part.

                Le forward depuis la servlet n'arrive nul part et le browser web m'indique que la connexion a été réinitialisée :(


                J'ai exactement le même problème julien
                • Partager sur Facebook
                • Partager sur Twitter

                java EE java.lang.IllegalStateException

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown