que - spring mvc español
Spring no puede encontrar el archivo de configuración bean xml cuando existe (12)
En Spring, todos los archivos fuente están dentro de src / main / java. Del mismo modo, los recursos generalmente se mantienen dentro de src / main / resources. Así que mantenga su archivo de configuración de primavera dentro de la carpeta de recursos.
Asegúrese de tener la entrada de ClassPath para sus archivos dentro de src / main / resources también.
En .classpath, compruebe las siguientes 2 líneas. Si faltan, agréguelos.
<classpathentry path="src/main/java" kind="src"/>
<classpathentry path="src/main/resources" kind="src" />
Entonces, si tiene todo en su lugar, el siguiente código debería funcionar.
ApplicationContext ctx = new ClassPathXmlApplicationContext ("Spring-Module.xml");
Estoy tratando de hacer mi primer frijol en primavera, pero tengo un problema al cargar un contexto. Tengo un archivo XML de configuración del bean en src / main / resources.
Recibo la siguiente IOException:
Excepción en el hilo "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException que analiza el documento XML del recurso de ruta de clase [src / main / resources / beans.xml]; la excepción anidada es
java.io.FileNotFoundException: class path resource [src / main / resources / beans.xml] no se puede abrir porque no existe
pero no lo entiendo, ya que hago la siguiente prueba de código:
File f = new File("src/main/resources/beans.xml");
System.out.println("Exist test: " + f.exists());
que me da la verdad! resources
está en el classpath. ¿Qué pasa?
Esto es lo que funcionó para mí:
new ClassPathXmlApplicationContext("classpath:beans.xml");
Gracias, pero esa no fue la solución. Descubrí por qué no funcionaba para mí.
Desde que hice una declaración:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Pensé que me referiría al directorio raíz del proyecto cuando el archivo beans.xml estuviera allí. Luego puse el archivo de configuración en src / main / resources y cambié la inicialización a:
ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml");
todavía era una excepción IO.
Luego, el archivo se dejó en src / main / resources / pero cambié la declaración a:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
y resolvió el problema, tal vez será útil para alguien.
gracias y ¡salud!
Editar:
Desde que recibí muchas personas pulgares hacia arriba para la solución y había tenido la primera experiencia con Spring como estudiante hace algunos años, siento el deseo de explicar en breve por qué funciona.
Cuando el proyecto se está compilando y empaquetando, todos los archivos y subdivisiones de ''src / main / java'' en el proyecto van al directorio raíz del paquete empaquetado (el artefacto que queremos crear). La misma regla se aplica a ''src / main / resources''.
Esta es una convención respetada por muchas herramientas como maven o sbt en el proceso de construcción de proyectos (nota: ¡como configuración predeterminada!). Cuando el código (de la publicación) estaba en modo de ejecución, no podía encontrar nada como "src / main / resources / beans.xml" debido al hecho de que beans.xml estaba en la raíz de jar (copiado a / beans .xml en jar / ear / war creado).
Al usar ClassPathXmlApplicationContext, la declaración de ubicación adecuada para las definiciones de beans xml, en este caso, era "/beans.xml", ya que esta es la ruta a la que pertenece en jar y más adelante en classpath.
Se puede verificar desempacando un contenedor con un archivador (es decir, rar) y viendo su contenido con la estructura de directorios.
Yo recomendaría leer artículos sobre classpath como suplementarios.
Hice lo contrario de la mayoría. Estoy usando Force IDE Luna Java EE y coloqué mi archivo Beans.xml dentro del paquete; sin embargo, precedí a la cadena Beans.xml - para el argumento ClassPathXMLApplicationContext - con la ruta relativa. Entonces, en mi aplicación principal, la que accede al archivo Beans.xml, tengo:
ApplicationContext context =
new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml");
También noté que tan pronto como moví el archivo Beans.xml al paquete desde la carpeta src, había una imagen Bean en el lado inferior izquierdo del icono del archivo XML que no estaba allí cuando este archivo xml estaba fuera del paquete. Ese es un buen indicador al decirme que ahora ClassPathXMLAppllicationsContext puede acceder al archivo xml de los beans.
Prueba esto:
new ClassPathXmlApplicationContext(" file: src/main/resources/beans.xml");
file: preffix point a los recursos del sistema de archivos, no classpath.
la ruta del archivo puede ser relativa o del sistema (/ home / user / Work / src ...)
Si este problema todavía le resulta confuso y está desarrollando usando Eclipse, eche un vistazo a este error de Eclipse: los archivos de recursos de "src / main / resources" no están incluidos correctamente en classpath
La solución parece ser ver las propiedades del proyecto, la ruta de compilación de Java, las carpetas de origen. Elimine el /src/main/resources
dir y agréguelo nuevamente. Esto hace que se le recuerde a Eclipse que necesita copiar estos archivos al classpath.
Este error me afectó al usar la versión "Neon" de Eclipse. (Y fue muy frustrante hasta que me di cuenta de la solución simple que acabo de describir)
Sospecho que estás construyendo un .war / .jar y, en consecuencia, ya no es un archivo, sino un recurso dentro de ese paquete. Pruebe ClassLoader.getResourceAsStream (String path) en su lugar.
También tuve un problema similar, pero debido a una causa un poco diferente, por lo que compartir aquí en caso de que pueda ayudar a nadie.
Mi ubicación de archivo
Como estaba usando
ClassPathXmlApplicationContext("beans.xml");
Hay dos soluciones
- Saca beans.xml del paquete y ponlo en el paquete predeterminado.
- Especifique el nombre del paquete mientras lo usa.
ClassPathXmlApplicationContext("com/mypackage/beans.xml");
Tenga en cuenta que el primer applicationContext se carga como parte de web.xml
; que se menciona con el siguiente.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>META-INF/spring/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>myOwn-controller</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>META-INF/spring/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Donde el código siguiente también intentará crear un ApplicationContext más.
private static final ApplicationContext context =
new ClassPathXmlApplicationContext("beans.xml");
Vea la difference entre beans.xml
y applicationContext.xml
Y si appliationContext.xml
en <META-INF/spring/>
ha declarado con <import resource="beans.xml"/>
entonces este appliationContext.xml
está cargando beans.xml
en la misma ubicación META-INF/spring
of appliationContext.xml
.
Donde como; en el código; si se declara como a continuación
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Esto se ve en beans.xml en WEB-INF/classes
O en eclipse src/main/resources
.
[Si ha agregado beans.xml
en src/main/resources
entonces puede colocarse en WEB-INF/classes
mientras crea WAR.]
Así que se buscan DOS archivos por completo.
He resuelto este problema agregando la búsqueda de classpath mientras importo en applicationContext.xml
como abajo
<import resource="classpath*:beans.xml" />
y eliminó la línea ClassPathXmlApplicationContext("beans.xml")
en código java, por lo que solo habrá un ApplicationContext cargado.
Usted ha mirado el directorio src. El archivo xml de hecho existe allí. Pero mira el directorio class o bin / build donde están configuradas todas tus clases de salida. Sospecho que solo necesitarás la ruta resource / beans.xml para usar.
utilícelo ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");
src/main/resources
es un directorio fuente, no deberías estar haciendo referencia directamente a él. Cuando construya / empaque el proyecto, los contenidos se copiarán en el lugar correcto para su classpath. Deberías cargarlo así
new ClassPathXmlApplicationContext("beans.xml")
O así
new GenericXmlApplicationContext("classpath:beans.xml");