Spring não consegue encontrar o arquivo de configuração xml do bean quando ele existe

Eu estou tentando fazer meu primeiro bean na spring, mas tenho um problema com o carregamento de um contexto. Eu tenho um arquivo XML de configuração do bean em src / main / resources.

Eu recebo o seguinte IOException:

Exceção no encadeamento “main” org.springframework.beans.factory.BeanDefinitionStoreException: IOException analisando o documento XML do recurso de caminho da class [src / main / resources / beans.xml]; exceção aninhada é

java.io.FileNotFoundException: o recurso de caminho de class [src / main / resources / beans.xml] não pode ser aberto porque não existe

mas eu não entendo, já que faço o seguinte teste de código:

File f = new File("src/main/resources/beans.xml"); System.out.println("Exist test: " + f.exists()); 

o que me dá verdade! resources está no caminho de class. O que está errado?

Obrigado, mas essa não foi a solução. Eu descobri porque não estava funcionando para mim.

Desde que eu fiz uma declaração:

 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

Eu pensei que eu iria me referir ao diretório raiz do projeto quando o arquivo beans.xml estava lá. Em seguida, coloquei o arquivo de configuração em src / main / resources e mudei a boot para:

 ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml"); 

ainda era uma exceção de IO.

Então o arquivo foi deixado em src / main / resources / mas eu mudei a declaração para:

 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

e resolveu o problema – talvez seja útil para alguém.

obrigado e felicidades!

Editar:

Desde que eu tenho muitas pessoas aprovadas para a solução e tive a primeira experiência com Spring como estudante há alguns anos, sinto desejo de explicar em breve por que funciona.

Quando o projeto está sendo compilado e empacotado, todos os arquivos e subdiretórios de ‘src / main / java’ no projeto vão para o diretório raiz do jar pacote (o artefato que queremos criar). A mesma regra se aplica a ‘src / main / resources’.

Esta é uma convenção respeitada por muitas ferramentas como maven ou sbt em processo de construção de projeto (nota: como configuração padrão!). Quando o código (da postagem) estava em modo de execução, não foi possível encontrar nada como “src / main / resources / beans.xml” devido ao fato de que beans.xml estava na raiz do jar (copiado para / beans .xml no flask / ouvido / guerra criado).

Ao usar ClassPathXmlApplicationContext, a declaração de local adequada para definições xml de beans, nesse caso, era “/beans.xml”, já que este é o caminho no qual ele pertence no jar e depois no classpath.

Ele pode ser verificado ao descompactar um jar com um arquivador (ou seja, rar) e ver seu conteúdo com a estrutura de diretórios.

Eu recomendaria a leitura de artigos sobre classpath como suplementar.

Tente isto:

new ClassPathXmlApplicationContext(" file: src/main/resources/beans.xml");

file: prefixos apontam para os resources do sistema de arquivos, não para classpath.

o caminho do arquivo pode ser relativo ou sistema (/ home / user / Work / src …)

Eu também tive um problema semelhante, mas por causa de uma causa um pouco diferente para compartilhar aqui no caso de poder ajudar alguém.

Localização do meu arquivo

arquivo beans.xml

Como eu estava usando

ClassPathXmlApplicationContext("beans.xml");

Existem duas soluções

  1. Tire o beans.xml do pacote e coloque no pacote padrão.
  2. Especifique o nome do pacote ao usá-lo

ClassPathXmlApplicationContext("com/mypackage/beans.xml");

src/main/resources é um diretório de origem, você não deve estar referenciando-o diretamente. Quando você constrói / empacota o projeto, o conteúdo é copiado no lugar correto para o seu classpath. Você deve então carregá-lo assim

 new ClassPathXmlApplicationContext("beans.xml") 

Ou assim

 new GenericXmlApplicationContext("classpath:beans.xml"); 

use-o ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");

Eu suspeito que você está construindo um .war / .jar e, conseqüentemente, não é mais um arquivo, mas um recurso dentro desse pacote. Tente ClassLoader.getResourceAsStream (String path) em seu lugar.

Você examinou o diretório src. O arquivo xml realmente existe lá. Mas olhe para o diretório class ou bin / build onde todas as suas classs de saída estão definidas. Eu suspeito que você precisará apenas do caminho resources / beans.xml para usar.

Observe que o primeiro applicationContext é carregado como parte do web.xml ; que é mencionado com o abaixo.

  contextConfigLocation META-INF/spring/applicationContext.xml   myOwn-controller org.springframework.web.servlet.DispatcherServlet  contextConfigLocation META-INF/spring/applicationContext.xml  1  

Onde o código abaixo também tentará criar mais um applicationContext.

 private static final ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

Veja a diferença entre beans.xml e applicationContext.xml

E se appliationContext.xml em tiver declarado com então este appliationContext.xml está carregando o beans.xml sob o mesmo local META-INF/spring de appliationContext.xml .

Enquanto que; no código; se é declarado como abaixo

 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

Isso está procurando o beans.xml em WEB-INF/classs OR no eclipse src/main/resources .

[Se você tiver adicionado beans.xml em src/main/resources , ele poderá ser colocado em WEB-INF/classs ao criar o WAR.]

Então, DOIS arquivos são pesquisados.

Eu resolvi esse problema adicionando pesquisa de caminho de class ao importar em applicationContext.xml como abaixo

  

e removeu a linha ClassPathXmlApplicationContext("beans.xml") no código java, para que haja apenas um ApplicationContext carregado.

Na spring, todos os arquivos de origem estão dentro de src / main / java. Da mesma forma, os resources geralmente são mantidos dentro de src / main / resources. Portanto, mantenha seu arquivo de configuração de mola dentro da pasta de resources.

Certifique-se de ter a input do ClassPath para seus arquivos dentro de src / main / resources também.

No .classpath, verifique as duas linhas seguintes. Se eles estão faltando, adicione-os.

   

Então, se você tem tudo no lugar, o código abaixo deve funcionar.

ApplicationContext ctx = new ClassPathXmlApplicationContext (“Spring-Module.xml”);

Eu fiz o oposto da maioria. Eu estou usando o Force IDE Luna Java EE e coloquei meu arquivo Beans.xml dentro do pacote; no entanto, precedi a sequência Beans.xml – para o argumento ClassPathXMLApplicationContext – com o caminho relativo. Então, no meu aplicativo principal – aquele que acessa o arquivo Beans.xml – eu tenho:

  ApplicationContext context = new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml"); 

Também notei que, assim que eu movi o arquivo Beans.xml para o pacote a partir da pasta src, havia uma imagem do Bean no lado inferior esquerdo do ícone do arquivo XML que não estava lá quando esse arquivo xml estava fora do pacote. Esse é um bom indicador ao me informar que agora o arquivo xml de beans é acessível por ClassPathXMLAppllicationsContext.

Isto é o que funcionou para mim:

  new ClassPathXmlApplicationContext("classpath:beans.xml"); 

Se esse problema ainda estiver desconcertando você e você estiver desenvolvendo usando o Eclipse, dê uma olhada neste bug do Eclipse: Arquivos de resources de “src / main / resources” não estão corretamente incluídos no caminho de class

Solução parece ser olhar para propriedades do projeto, caminho de compilation Java, pastas de origem. Exclua o diretório /src/main/resources e adicione-o novamente. Isso faz com que o Eclipse seja lembrado de que precisa copiar esses arquivos para o caminho de class.

Esse bug me afetou ao usar o release “Neon” do Eclipse. (E foi muito frustrante até que percebi a correção simples que acabei de descrever)

    Intereting Posts