Cuando getRealPath() devuelve null

03/09/2009

BEA Systems
Cuando desplegamos un módulo web (.war) en los servidores de aplicaciones WebLogic o JBoss puede aparecernos un problema en nuestra aplicación y es que la llamada al método getRealPath(resource) de la clase ServletContext, nos devuelva un null.

Según la especificación de SUN:

The real path returned will be in a form appropriate to the computer and operating system on which the servlet container is running, including the proper path separators. This method returns null if the servlet container cannot translate the virtual path to a real path for any reason (such as when the content is being made available from a .war archive).

Vamos, que puede devolver null cuando el servidor no puede resolver el path real, como por ejemplo cuando el contenido está disponible desde un archivo .war. Y ese es precisamente el argumento que esgrimen en BEA para defender que su funcionamiento “cumple” con la especificación.

Lo curioso del tema es que, realmente, el contenido del archivo .war es “desempaquetado” en un directorio temporal y no se sirve directamente desde el interior del .war (con lo cual, parece lógico que getRealPath() debería devolver el path de dicho recurso en el directorio temporal, pero no es así).

Una posible solución podría ser utilizar una función como la siguiente para resolver el path real:


static public String getRealPath(ServletContext servletContext, String resourcePath) {
String result="";
result = servletContext.getRealPath(resourcePath);
if (result == null) {
// resources en un .war (JBoss, WebLogic)
java.net.URL url;
try {
url = servletContext.getResource(resourcePath);
result= url.getPath();
} catch (MalformedURLException e) {
logger.warn("No se ha podido recuperar el path real de: " + resourcePath);
}
}
return result;
}

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: