it-swarm.dev

Proč getRealPath () vrátí null při nasazení s .war souborem?

getRealPath() vrací aktuální cestu v lokálním systému, ale vrátí hodnotu null při nasazení se souborem .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>

Může mi někdo poskytnout alternativu? Bylo by velmi užitečné, kdybyste také ukázali nějaký ukázkový kód.

28
musicking123

Pro start, ServletRequest.getRealPath (String cesta) je zastaralý. Vhodnou náhradou je:

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

Dokumenty API pro rozhraní ServletContext.getRealPath (String path) state:

"Tato metoda vrací null, pokud kontejner servletu nemůže z jakéhokoli důvodu překládat virtuální cestu na skutečnou cestu (například když je obsah zpřístupněn z archivu .war)."

API tak plní svou smlouvu! Vše však není ztraceno, protože zdroj z WAR můžete načíst pomocí následující metody definované v ServletContext :

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

Trochu pozdě, ale na tuto otázku jsem narazil, když jsem měl tento problém ve WebLogic. Moje řešení bylo přidat toto do mého 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>

Toto řešení jsem zjistil lépe, když nechcete (nebo nemůžete) upravovat konfiguraci na serveru WebLogic.

16
Liam Dempsey

používáte Weblogic?

Pokud ano - pak je to Weblogic problém, který můžete opravit v Weblogic admin konzole -> Doména-> Webové aplikace - klikněte na zaškrtávací políčko "Archivováno skutečná cesta povoleno".

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

6
user2094587

Tím se problém vyřeší také:

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

Měl jsem také stejné problémy. Volání getRealPath () vrátí null při nasazení na samostatný server. Poté, co jsem chvíli hledal, jsem našel řešení, není to v kódu. Je to v konfiguraci vašeho webového serveru. 

Pro mě je to Weblogic 10.3, jdete do Home - - Configuration - Web Application, nastavíte Archived Real Path Enabled to true. Restartujte server a vše funguje dobře.

Doufám, že tato pomoc, S pozdravem.

2
VnMa

chcete-li napsat 

použití

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

dostat cestu

2
Vishnudev K

Nevěřím, že je možné dělat to, co se snažíte udělat. 

Měli byste použít getResource k přečtení souboru XML z vašeho válečného souboru (to funguje i bez války)

servletContext.getResourceAsStream("/generate.xml")

Vedoucí lomítko závisí na tom, kde je generován soubor .xml.

2
krosenvold

Všimněte si context.getRealPath() může vrátit hodnotu null, pokud je problém s uživatelským oprávněním, zkontrolujte, zda je spuštěn webový server, pod kterým uživatel.

1
skr

Následující oprava funguje dobře pro mě.

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

Po nasazení válečného souboru jsem schopen soubor získat z kontextové cesty.

0