Acessar arquivo dentro do WEB-INF
13/10/2010 00:00
0
Tenho um arquivo que antes acessava via variável de ambiente, ou seja, eu criava uma variável de ambiente que indicava o caminho para o meu arquivo, para que, então, minha aplicação pudesse ler determinadas variáveis alocadas lá. Gostaria de mudar essa estratégia, inserindo o arquivo dentro do diretório WEB-INF, com isso, quando gerasse .war e rodasse no tomcat, não seria preciso nenhuma configuração externa, para tal, eu preciso saber o caminho onde minha aplicação está rodando, para saber, com isso, o caminho do diretório WEB-INF. Dei uma procurada e achei isso:

import org.codehaus.groovy.grails.web.context.ServletContextHolder;

class ContextPathController {

def servletContext = ServletContextHolder.servletContext
def mobilePath = servletContext.getRealPath("WEB-INF")

}

Todavia, tal código gera o seguinte erro:

Running Grails application..
2010-10-13 17:52:15,538 [main] ERROR context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Unable to locate constructor with Class parameter for class org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:135)
at grails.web.container.EmbeddableServer$start.call(Unknown Source)
at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy:158)
at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy)
at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:282)
at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy)
at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:149)
at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy)
at _GrailsRun_groovy.runInline(_GrailsRun_groovy:115)
at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy)
at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy:59)
at RunApp$_run_closure1.doCall(RunApp:33)
at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324)
at gant.Gant$_dispatch_closure6.doCall(Gant.groovy:334)
at gant.Gant$_dispatch_closure6.doCall(Gant.groovy)
at gant.Gant.withBuildListeners(Gant.groovy:344)
at gant.Gant.this$2$withBuildListeners(Gant.groovy)
at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
at gant.Gant.dispatch(Gant.groovy:334)
at gant.Gant.this$2$dispatch(Gant.groovy)
at gant.Gant.invokeMethod(Gant.groovy)
at gant.Gant.processTargets(Gant.groovy:495)
at gant.Gant.processTargets(Gant.groovy:480)
Caused by: java.lang.RuntimeException: Unable to locate constructor with Class parameter for class org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
... 23 more
Caused by: java.lang.reflect.InvocationTargetException
... 23 more
Caused by: org.codehaus.groovy.grails.exceptions.NewInstanceCreationException: Could not create a new instance of class [mobileControllers.ContextPathController]!
... 23 more
Caused by: java.lang.NullPointerException: Cannot invoke method getRealPath() on null object
at mobileControllers.ContextPathController.<init>(ContextPathController.groovy&#58;7)
... 23 more
2010-10-13 17&#58;52&#58;15,538 [main] ERROR [localhost].[/Mobile] - Exception sending context initialized event to listener instance of class org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener
org.springframework.beans.factory.BeanCreationException&#58; Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]&#58; Invocation of init method failed; nested exception is java.lang.RuntimeException&#58; Unable to locate constructor with Class parameter for class org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy&#58;135)
at grails.web.container.EmbeddableServer$start.call(Unknown Source)
at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy&#58;158)
at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy)
at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy&#58;282)
at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy)
at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy&#58;149)
at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy)
at _GrailsRun_groovy.runInline(_GrailsRun_groovy&#58;115)
at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy)
at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy&#58;59)
at RunApp$_run_closure1.doCall(RunApp&#58;33)
at gant.Gant$_dispatch_closure4.doCall(Gant.groovy&#58;324)
at gant.Gant$_dispatch_closure6.doCall(Gant.groovy&#58;334)
at gant.Gant$_dispatch_closure6.doCall(Gant.groovy)
at gant.Gant.withBuildListeners(Gant.groovy&#58;344)
at gant.Gant.this$2$withBuildListeners(Gant.groovy)
at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
at gant.Gant.dispatch(Gant.groovy&#58;334)
at gant.Gant.this$2$dispatch(Gant.groovy)
at gant.Gant.invokeMethod(Gant.groovy)
at gant.Gant.processTargets(Gant.groovy&#58;495)
at gant.Gant.processTargets(Gant.groovy&#58;480)
Caused by&#58; java.lang.RuntimeException&#58; Unable to locate constructor with Class parameter for class org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
... 23 more
Caused by&#58; java.lang.reflect.InvocationTargetException
... 23 more
Caused by&#58; org.codehaus.groovy.grails.exceptions.NewInstanceCreationException&#58; Could not create a new instance of class [mobileControllers.ContextPathController]!
... 23 more
Caused by&#58; java.lang.NullPointerException&#58; Cannot invoke method getRealPath() on null object
at mobileControllers.ContextPathController.<init>(ContextPathController.groovy&#58;7)
... 23 more
2010-10-13 17&#58;52&#58;15,538 [main] ERROR core.StandardContext - Error listenerStart
2010-10-13 17&#58;52&#58;15,553 [main] ERROR core.StandardContext - Context [/Mobile] startup failed due to previous errors


Já tentei &quot;WEB-INF&quot;, 'WEB-INF', &quot;/WEB-INF&quot; e por aí vai...

Alguém poderia me esclarecer.
Tags: Grails


0
Luciano, se eu não me engano a partir do momento que a aplicação está sendo executa a pasta web-inf torna-se o root da aplicação, tanto que se você o arquivo web-inf/index.gsp você pode acessar esse arquivo através <!-- w --><a class="postlink" href="http://www.minhaaplicacao.com.br/index.gsp">www.minhaaplicacao.com.br/index.gsp</a><!-- w -->, então tente usar o &quot;/&quot; direto. ou faça assim:


def grailsApplication


e acesso o arquivo através do comando:
grailsApplication.parentContext.getResource(&quot;WEB-INF/images/myImage.jpg&quot;).file
13/10/2010 00:00


0
Completando meu problema:

Eu quero ter acesso ao arquivo para ler as variáveis, estou usando a função:

def xmlFile = new XmlSlurper().parse(&quot;WEB-INF/file.xml&quot;)


Porém, quando vou compilar o programa, o mesmo dá erro pois o caminho não é encontrado, para isso faço:

def xmlFile = new XmlSlurper().parse(&quot;web-apps/WEB-INF/file.xml&quot;)


Pois essa é a estrutura padrão do Spring. Porém, essa não é a estrutura do Tomcat, como dito, ele tem a pasta WEB-INFcomo raíz.

Qual a melhor saída? Refaço a organização do programa colocando WEB-INF como raíz? Ou existe um work-around?
14/10/2010 00:00


0
luciano, procurando encontrei outro serviço injetado pelo spring que é capaz de recuperar o arquivo, mas nao cheguei a testar este:

def servletContext

def resource = servletContext.getResource(&quot;/WEB-INF/file.xml&quot;)

ai no seu caso acho que ficaria assim:

def xmlFile = new XmlSlurper().parse(servletContext.getResource(&quot;/WEB-INF/file.xml&quot;))

ou:

def xmlFile = new XmlSlurper().parseText(servletContext.getResource(&quot;/WEB-INF/file.xml&quot;).text)
14/10/2010 00:00


0
Obrigado, pela ajuda, mas continuei obtendo o mesmo erro, todavia, acabei encontrando uma solução:

Mover o arquivo para fora do web-inf e alocá-lo em outro lugar (i.e.: grails-app/conf), com isso quando crio o .war meu arquivo ficará em WEB-INF/classes, e acesso ele usando:

this.class.getResource(&quot;/package[caso esteja usando algum]/file.xml&quot;)
14/10/2010 00:00



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto