web-dev-qa-db-fra.com

Pourquoi getRealPath () renvoie-t-il la valeur null lorsqu'il est déployé avec un fichier .war?

getRealPath() renvoie le chemin d'accès réel sur le système local, mais renvoie null lorsqu'il est déployé avec un fichier .war.

<%@ page import="Java.io.*" %>
<%@ page contentType="text/html;charset=ISO-8859-1" %> 
<%
int iLf = 10;
char cLf = (char)iLf;
String a= application.getResource("/");
//String myfile = application.getRealPath("/")+ "generate.xml";
//String myfile = request.getContextPath()+"generate.xml";
//String myfile = request.getRealPath("/")+"generate.xml";

out.println(myfile);    
File outputFile = new File(myfile);
outputFile.createNewFile();
FileWriter outfile = new FileWriter(outputFile);
outfile.write(" <?xml version='1.0' encoding='UTF-8'?> "+cLf);
outfile.write(" <playlist version='1' xmlns = 'http://xspf.org/ns/0/' > " +cLf);
outfile.write(" <title>My Band Rocks Your Socks</title> "+cLf); 
outfile.write("<trackList>"+cLf); 
%>
 <%! String[] sports; %>
 <%
    sports = request.getParameterValues("sports");

    out.println("<html><body><h1>hello</h1></body></html>");

    if (sports != null)
    { 
         for (int i = 0; i < sports.length; i++)
         { 
              // outfile.writeln (sports[i]); 
              String total=sports[i];
              String[] sa=total.split("[,]");
              // String[] sub=new String();
              outfile.write("<track>"+cLf);
              for (int j=0;j<sa.length;j++)
              {
                // outfile.writeln(sa[j]);
                // outfile.writeln("sa["+j+"]="+sa[j]);
                if( j == 0)
                {
                     outfile.write("<location>" + sa[0] +"</location>"+cLf); 
                }
                else if (j == 1)
                     {
                        outfile.write("<image>" + sa[1] +"</image>"+cLf); 
                     }
                     else if( j==2)
                          {
                            outfile.write("<title>" + sa[2] +"</title>"+cLf);
                          }

               }// end of inner for loop()       
               outfile.write("</track>"+cLf);
         //outfile.writeln();
      }// end of outer for()
    } 
    //else outfile.writeln ("<b>none<b>");

  outfile.write(" </trackList> "+cLf);
  outfile.write(" </playlist> "+cLf);
  outfile.close();

  %>
<object type="application/x-shockwave-flash" width="400" height="170"
          data="xspf_player.swf?playlist_url=generate.xml">
          <param name="movie" value="xspf_player.swf?playlist_url=generate.xml" />

</object>

Quelqu'un peut-il me proposer une alternative à cela? Il serait très utile que vous montriez aussi un exemple de code.

28
musicking123

Pour commencer, ServletRequest.getRealPath (chemin de la chaîne) est obsolète. Le remplacement approprié est:

ServletContext context = session.getServletContext();
String realContextPath = context.getRealPath(request.getContextPath());

Cependant, la documentation de l'API pour ServletContext.getRealPath (chemin de la chaîne) state:

"Cette méthode retourne null si le conteneur de servlets ne peut pas traduire le chemin virtuel en un chemin réel pour une raison quelconque (par exemple, lorsque le contenu est rendu disponible à partir d'une archive .war)."

Donc, l'API remplit son contrat! Toutefois, tout n'est pas perdu, car vous pouvez charger une ressource du fichier WAR à l'aide de la méthode suivante, telle que définie dans ServletContext :

ServletContext context = session.getServletContext();
InputStream is = context.getResourceAsStream("generate.xml");
36
David Grant

Un peu tard, mais je suis tombé sur cette question lorsque je rencontrais ce problème dans WebLogic. Ma solution a été d'ajouter ceci à mon weblogic.xml:

<?xml version='1.0' encoding='UTF-8'?>
<weblogic-web-app>
    <container-descriptor>
        <show-archived-real-path-enabled>true</show-archived-real-path-enabled>
    </container-descriptor>
</weblogic-web-app>

J'ai trouvé cette solution préférable lorsque vous ne voulez pas (ou ne pouvez pas) modifier la configuration sur le serveur WebLogic.

16
Liam Dempsey

utilisez-vous Weblogic?

Si c'est le cas, il s'agit d'un problème Weblogic que vous pouvez résoudre dans la console d'administration Weblogic -> Domaine-> Applications Web - cochez la case "Chemin réel archivé activé".

Voir: http://ananthkannan.blogspot.com/2009/12/servletcontextgetrealpath-returns-null.html

6
user2094587

Cela résout le problème aussi:

weblogic.xml 

<?xml version = '1.0' encoding = 'windows-1252'?>
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd" xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">

<container-descriptor>
  <index-directory-enabled>true</index-directory-enabled>
  <show-archived-real-path-enabled>true</show-archived-real-path-enabled>
</container-descriptor>

<virtual-directory-mapping>
  <local-path>bla.war</local-path>
  <url-pattern>*</url-pattern>
</virtual-directory-mapping>

<context-root>bla</context-root>

3
user5101998

J'ai eu les mêmes problèmes aussi. L'appel de getRealPath () renvoie la valeur null lorsqu'il est déployé sur un serveur autonome. Après avoir cherché pendant un moment, j'ai trouvé la solution, ce n'est pas dans le code. C'est dans la configuration de votre serveur web. 

Pour moi, il s’agit de Weblogic 10.3, vous allez dans Accueil - - Configuration - Application Web, définissez Archived Real Path Enabled sur true. Redémarrez le serveur et tout fonctionne correctement .

Espérons que cette aide, Cordialement.

2
VnMa

si vous voulez écrire dans 

utilisation

this.getClass().getResource("/").getPath();

pour obtenir le chemin

2
Vishnudev K

Je ne crois pas qu'il soit possible de faire ce que vous essayez de faire. 

Vous devriez utiliser getResource pour lire le fichier XML à partir de votre fichier war (cela fonctionne aussi sans war)

servletContext.getResourceAsStream("/generate.xml")

La barre oblique dépend de l'emplacement de stockage du fichier generate.xml.

2
krosenvold

Prenez note que context.getRealPath() peut renvoyer null en cas de problème d’autorisation d’utilisateur, vérifiez le serveur Web en cours d’exécution sous quel utilisateur.

1
skr

La solution suivante fonctionne bien pour moi.

// I am using Struts2 
ServletContext sc = (ServletContext) ac.get(StrutsStatics.SERVLET_CONTEXT);
fileInputStream = sc.getResourceAsStream("test.xls");

Après avoir déployé le fichier war, je peux extraire le fichier du chemin de contexte.

0