Grails 3.3.0 on Tomcat 7.0.57 - grails

We are trying to use response.outputStream in Grails 3.3.0 under Tomcat 7.0.57. However, when any bytes are written to the stream, we get this error:
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/WriteListener
This seems to come from the 3.1 Servlet spec? But Tomcat 7 doesn't support 3.1, only 3.0. However, we've targeted the Grails app to the Tomcat version we are deploying to by doing this in dependencies:
provided "org.springframework.boot:spring-boot-starter-tomcat"
And this, later in the build.gradle file:
war {
ext['tomcat.version'] = '7.0.57'
}
Anything else to try?

Turns out the problem was caused by Groovy introspection upon loading the class OnCommittedResponseWrapper, which has this:
public void setWriteListener(WriteListener writeListener) {
this.delegate.setWriteListener(writeListener);
}
Adding a #GrailsCompileStatic to the method(s) which use the response outputStream in ways like this:
response.outputStream << someBytes
will avoid the introspection which then makes it work on Tomcat 7.

Related

Grails 4.0.2. Could not resolve view with name 'index' in servlet with name 'grailsDispatcherServlet'

I created a new grails app using below code
grails create-app myapp --profile=rest-api
I modified ApplicationController and added namespace to it, It is as below:
class ApplicationController implements PluginManagerAware {
/** The Namespace for the version of the API, see http://docs.grails.org/latest/guide/REST.html#versioningResources */
static namespace = "v1"
GrailsApplication grailsApplication
GrailsPluginManager pluginManager
def index() {
[grailsApplication: grailsApplication, pluginManager: pluginManager]
}
}
There is a index.gson file present under views/application/ Directory.
I run this setup using grails run-app and point my browser to http://localhost:8080
It throws following exeption:
<=======2020-04-08 16:01:31.616 ERROR --- [nio-8080-exec-1] .a.c.c.C.[.[.[.[grailsDispatcherServlet] : Servlet.service() for servlet [grailsDispatcherServlet] in context with path [] threw exception [Could not resolve view with name 'index' in servlet with name 'grailsDispatcherServlet'] with root cause
However if I modify controller code an use render, everything works fine.
render(view:'index',model: [grailsApplication: grailsApplication, pluginManager: pluginManager])
Output of grails -v
Grails Version: 4.0.2
JVM Version: 1.8.0_171
OS: macOS High Sierra
See Selecting Views For Namespaced Controllers
The correct path for the namespaced view should be:
grails-app/views/v1/application/index.gson

Grails 3 schemaExport contains warning with FileNotFoundException that looks for sitemesh.xml

When schemaExport is executed using Gradle for a Grails 3.3 application, below warning is in the log though ddl.sql is created. According to Grails 3 documentation sitemesh.xml is removed so naturally the file wouldn't be available. Am I missing something?
Tools and version: Grails 3.3.0, Gradle 3.3, Hibnerate 5, Sybase ASE 15.7
2017-09-13 12:50:45.264 WARN --- [ main] o.s.mock.web.MockServletContext : Couldn't determine real path of resource class path resource [src/main/webapp/WEB-INF/sitemesh.xml]
java.io.FileNotFoundException: class path resource [src/main/webapp/WEB-INF/sitemesh.xml] cannot be resolved to URL because it does not exist
at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:187)
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:49)
at org.springframework.mock.web.MockServletContext.getRealPath(MockServletContext.java:458)
at org.grails.web.sitemesh.Grails5535Factory.<init>(Grails5535Factory.java:78)
at org.grails.web.servlet.view.SitemeshLayoutViewResolver.loadSitemeshConfig(SitemeshLayoutViewResolver.java:105)
at org.grails.web.servlet.view.SitemeshLayoutViewResolver.init(SitemeshLayoutViewResolver.java:67)
at org.grails.web.servlet.view.SitemeshLayoutViewResolver.onApplicationEvent(SitemeshLayoutViewResolver.java:146)
at org.grails.web.servlet.view.SitemeshLayoutViewResolver.onApplicationEvent(SitemeshLayoutViewResolver.java:42)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:883)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
at grails.boot.GrailsApp.run(GrailsApp.groovy:83)
at grails.ui.command.GrailsApplicationContextCommandRunner.run(GrailsApplicationContextCommandRunner.groovy:55)
at grails.ui.command.GrailsApplicationContextCommandRunner.main(GrailsApplicationContextCommandRunner.groovy:102)
This is just a WARN message. The underlying spring class is looking for it and just saying it's not there. The default the log level does not show this output.
You can safely ignore the message or adjust your logger to not show it.
https://github.com/spring-projects/spring-framework/blob/master/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java#L460

What classspath is used for executing Grails' application.groovy

What classspath is used for compiling/executing Grails' application.groovy?
In my application.groovy, I instantiate a custom class (contained in a dependency's jar) and assign it to one of the config properties, like so:
environments {
production {
configProperty = new com.example.CustomClass()
I recently upgraded my application from Grails 3.1.5 to 3.2.2, and now this no longer works.
I receive an error like the following when I try to run grails run-app:
Error occurred running Grails CLI: startup failed:
script14788250424471597489853.groovy: 43: unable to resolve class com.example.CustomClass
# line 43, column 33.
configProperty = new com.example.CustomClass()
(Notice that the code is in the production block, but I'm running in development (run-app). That makes me think it's the compilation of this script that is failing.)
So I'm guessing I just need to add my dependency (that contains the CustomClass) to the appropriate classpath, but I'm not sure which one.
I'm using gradle, and have the following in my build.gradle file, to pull in the dependency containing CustomClass:
buildscript {
dependencies {
classpath "com.example:custom-module:1.1"
// ...
dependencies {
compile group: 'com.example', name: 'custom-module', version:'1.1'
}
The grails-app/conf/application.groovy file shouldn't reference application classes because it is read before compilation. If you wish to reference application classes in configuration please use grails-app/conf/runtime.groovy

Websphere 8.5 - JSF webapp context init error: cleanupInitMaps

I have got a JSF 2.1 web application developed with mojarra 2.1.17 distibution which run with any problems on JBoss 6.1 container: now i have to change application server and I have to use websphere AS 8.5 which were born with MyFaces JSF 2 distibution. I'm trying to deploy and start my webapp ignoring MyFaces and using Mojarra, configuring my EAR as IBM official guide shows, configuring shared lib with mojarra dist included, link it to a new classloader created exclusively for my server1 instance of WAS 8.5. It doesn't work at all and when I deploy my webapp i get this stacktrace when WAS try to start the application:
com.ibm.ws.exception.RuntimeWarning: com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Failed to load webapp: Failed to load webapp: null
at com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:432)
at com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:718)
at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1175)
at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1370)
at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:639)
at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:968)
at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:774)
at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2182)
at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:445)
at com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123)
at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:388)
at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.access$500(CompositionUnitMgrImpl.java:116)
at com.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer.run(CompositionUnitMgrImpl.java:994)
at com.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:502)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1862)
Caused by: com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Failed to load webapp: Failed to load webapp: null
at com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:759)
at com.ibm.ws.webcontainer.WSWebContainer.addWebApplication(WSWebContainer.java:634)
at com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:426)
... 14 more
Caused by: com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Failed to load webapp: null
at com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:176)
at com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:749)
... 16 more
Caused by: java.lang.NullPointerException
at com.sun.faces.config.InitFacesContext.cleanupInitMaps(InitFacesContext.java:283)
at com.sun.faces.config.InitFacesContext.<init>(InitFacesContext.java:107)
at com.sun.faces.config.FacesInitializer.onStartup(FacesInitializer.java:115)
at com.ibm.ws.webcontainer.webapp.WebAppImpl.initializeServletContainerInitializers(WebAppImpl.java:613)
at com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:409)
at com.ibm.ws.webcontainer.webapp.WebGroupImpl.addWebApplication(WebGroupImpl.java:88)
at com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:169)
... 17 more
I debugged cleanupInitMaps() method of mojarra dist too and i saw that it tries to get two Map of kind of variable from FacesContext called threadInitContext and initContextServletContext but gets null:
Field threadMap = FacesContext.class.getDeclaredField("threadInitContext");
and
Field initContextMap = FacesContext.class.getDeclaredField("initContextServletContext");
How is this caused and how can I solve it?
Ok, i solved it !!
first of all i set classloader of my server instance to PARENT_LAST + restart. Then i followed these steps:
1) put Mojarra lib into simple shared library;
2) deploy ear with jsf web module inside and before start application from console, i linked shared lib to it and to all modules inside ear;
3) i set application classloader to PARENT_LAST;
4) start app and it works !!
That's all !!
I faced the very same issue. In my case problem was solved by removing javax.faces dependency from .war artifact. It seems to be a conflict between javax.faces implementation by WS and dependency in my .war file. If you using maven then you can set scope for youre javax.faces dependency somthing like this:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.2.13</version>
<scope>provided</scope>
</dependency>
See also: Nullpointer exception at com.sun.faces.config.InitFacesContext.cleanupInitMaps

Grails 2 app wont deploy on JBOSS: BeanCreationException

After having upgraded one of my apps from Grails 1.3.7 to 2.1.0 and installed a couple of additional plugins the app will no longer deploy on JBOSS AS 5.1, which is used for production.
The error I am getting from the JBOSS server log is the following:
13:39:10,263 ERROR [[/]] Exception sending context initialized event to listener instance of class org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is java.lang.IncompatibleClassChangeError: Found class org.hibernate.cfg.Mappings, but interface was expected
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory.doCreateBean(ReloadAwareAutowireCapableBeanFactory.java:126)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:707)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:449)
at org.codehaus.groovy.grails.commons.spring.DefaultRuntimeSpringConfiguration.getApplicationContext(DefaultRuntimeSpringConfiguration.java:153)
at org.codehaus.groovy.grails.commons.spring.GrailsRuntimeConfigurator.configure(GrailsRuntimeConfigurator.java:170)
at org.codehaus.groovy.grails.commons.spring.GrailsRuntimeConfigurator.configure(GrailsRuntimeConfigurator.java:127)
at org.codehaus.groovy.grails.web.context.GrailsConfigUtils.configureWebApplicationContext(GrailsConfigUtils.java:121)
at org.codehaus.groovy.grails.web.context.GrailsContextLoader.initWebApplicationContext(GrailsContextLoader.java:104)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4393)
In order to resolve another issue I had earlier on( LifecycleException/ReflectionException: Cannot find method addChild...) I have introduced a jboss-classloading.xml into my WEB-INF directory. At the current moment this has the following contents:
<classloading xmlns="urn:jboss:classloading:1.0" name="ROOT.war" domain="DefaultDomain" top-level-classloader="true" export-all="NON_EMPTY" import-all="true" parent-first="false"> </classloading>
I suspect that the current issue is also class-loading related, especially since I see that the class in question is being loaded from JBOSS lib folder, and not from the jars in the war's lib folder:
[Loaded org.hibernate.cfg.Mappings from jar:file:/usr/local/jboss-5.1.0.GA/common/lib/hibernate-core.jar!/]
Apparently the class org.hibernate.cfg.Mappings exists both in hibernate-core.jar as well as inside the app's lib folder(hibernate-core-3.6.10.Final.jar). I have therefore tried to tweak the jboss-classloading.xml file in different ways in order to force JBOSS to load this specific class from within the war file, but no matter what I do I keep getting the same error (or different ones much earlier in the deploy cycle).
The full contents of my war's WEB-INF/lib dir:
activation-1.1.jar google-collections.jar h2-1.3.164.jar sitemesh-2.4.jar
antlr-2.7.7.jar grails-bootstrap-2.1.0.jar hamcrest-all-1.1.jar smartsprites-0.2.1.jar
aopalliance-1.0.jar grails-core-2.1.0.jar hibernate-commons-annotations-3.2.0.Final.jar spring-aop-3.1.0.RELEASE.jar
asm-3.1.jar grails-crud-2.1.0.jar hibernate-core-3.6.10.Final.jar spring-asm-3.1.0.RELEASE.jar
aspectjrt-1.6.10.jar grails-datastore-core-1.0.9.RELEASE.jar hibernate-ehcache-3.6.10.Final.jar spring-aspects-3.1.0.RELEASE.jar
aspectjweaver-1.6.10.jar grails-datastore-gorm-1.0.9.RELEASE.jar hibernate-jpa-2.0-api-1.0.1.Final.jar spring-beans-3.1.0.RELEASE.jar
avalon-framework-4.1.3.jar grails-datastore-simple-1.0.9.RELEASE.jar hibernate-validator-4.1.0.Final.jar spring-binding-2.0.8.RELEASE.jar
axis-1.4.jar grails-hibernate-2.1.0.jar javase-1.7.jar spring-context-3.1.0.RELEASE.jar
axis-jaxrpc-1.4.jar grails-logging-2.1.0.jar javassist-3.12.0.GA.jar spring-context-support-3.1.0.RELEASE.jar
axis-saaj-1.4.jar grails-plugin-codecs-2.1.0.jar javassist-3.7.ga.jar spring-core-3.1.0.RELEASE.jar
axis-wsdl4j-1.5.1.jar grails-plugin-controllers-2.1.0.jar jcaptcha-all-1.0-RC6.jar spring-expression-3.1.0.RELEASE.jar
cas-client-core-3.2.1.jar grails-plugin-converters-2.1.0.jar jstl-1.1.2.jar spring-jdbc-3.1.0.RELEASE.jar
cglib-2.2.jar grails-plugin-datasource-2.1.0.jar jta-1.1.jar spring-jms-3.1.0.RELEASE.jar
commons-beanutils-1.8.3.jar grails-plugin-domain-class-2.1.0.jar jul-to-slf4j-1.6.2.jar spring-js-2.0.8.RELEASE.jar
commons-codec-1.5.jar grails-plugin-filters-2.1.0.jar logkit-1.0.1.jar spring-orm-3.1.0.RELEASE.jar
commons-collections-3.2.1.jar grails-plugin-gsp-2.1.0.jar mail-1.4.3.jar spring-test-3.1.0.RELEASE.jar
commons-dbcp-1.4.jar grails-plugin-i18n-2.1.0.jar mysql-connector-java-5.1.6.jar spring-tx-3.1.0.RELEASE.jar
commons-discovery-0.2.jar grails-plugin-log4j-2.1.0.jar ognl-2.7.3.jar spring-web-3.1.0.RELEASE.jar
commons-el-1.0.jar grails-plugin-mimetypes-2.1.0.jar oro-2.0.8.jar spring-webflow-2.0.8.RELEASE.jar
commons-fileupload-1.2.2.jar grails-plugin-scaffolding-2.1.0.jar pjl-comp-filter-1.7.jar spring-webmvc-3.1.0.RELEASE.jar
commons-io-2.1.jar grails-plugin-services-2.1.0.jar quartz-1.6.1.jar tomcat-catalina-ant-7.0.27.jar
commons-lang-2.6.jar grails-plugin-servlets-2.1.0.jar quartz-2.1.5.jar tomcat-embed-core-7.0.27.jar
commons-logging-1.1.jar grails-plugin-tomcat-2.1.0.jar selenium-java-client-driver-1.0.2.jar tomcat-embed-jasper-7.0.27.jar
commons-pool-1.5.6.jar grails-plugin-url-mappings-2.1.0.jar servlet-api-2.5.jar tomcat-embed-logging-juli-7.0.27.jar
commons-validator-1.3.1.jar grails-plugin-validation-2.1.0.jar shiro-cas-1.2.0.jar tomcat-embed-logging-log4j-7.0.27.jar
concurrentlinkedhashmap-lru-1.2_jdk5.jar grails-resources-2.1.0.jar shiro-core-1.2.0.jar utils-0.0.2.jar
core-1.7.jar grails-spring-2.1.0.jar shiro-ehcache-1.2.0.jar validation-api-1.0.0.GA.jar
dom4j-1.6.1.jar grails-web-2.1.0.jar shiro-quartz-1.2.0.jar xpp3_min-1.1.4c.jar
ecj-3.6.2.jar grails-webflow-2.1.0.jar shiro-spring-1.2.0.jar yuicompressor-2.4.2.jar
ehcache-core-2.4.6.jar groovy-all-1.8.6.jar shiro-web-1.2.0.jar
Does anyone have an idea about how to get around this issue?
There is a plugins for this :)
http://grails.org/plugin/jbossas
The docs are located here:
http://grails-plugins.github.com/grails-jbossas/
This is why this is happenning:
https://community.jboss.org/thread/156441
You will need to configure JBoss to exclude the hibernate jars. The JBoss Hibernate jars that are in common/lib in the JBoss install are loading first, instead of the Grails Hibernate jars. This is a classloader order / preference issue.
A very dirty solution is to remove the jars under common/lib or as recommended get the classloader working to exclude those jars.
I'm using JBoss 6.1 for a project. We started on 1.3.7, then moved to 2.0.3 and are now on 2.1.
I never got that exact issue, nor have I experienced any conflicts with Hibernate, but we did experience conflicts with Quartz.
Here's what I use to isolate things...
I have this in /WEB-INF/jboss-scanning.xml:
<?xml version='1.0' encoding='UTF-8' ?>
<scanning xmlns='urn:jboss:scanning:1.0'>
<path name='WEB-INF/lib/grails-datastore-gorm-*.jar'>
<include name='org.grails.datastore' />
</path>
</scanning>
I have this in /WEB-INF/jboss-classloading.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<classloading
xmlns="urn:jboss:classloading:1.0"
domain="hotdesk.war"
export-all="NON_EMPTY"
import-all="true"
/>
And finally, I have this in BuildConfig.groovy:
dependencies {
//Added to deal with problems running Quartz on JBoss
//NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V]
compile ('cglib:cglib-nodep:2.2')
}
//Added to deal with problems running Quartz on JBoss
//NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V]
grails.war.resources = { stagingDir, args ->
println "Removing export jars from WEB-INF/lib/"
delete(file: "${stagingDir}/WEB-INF/lib/cglib-2.2.jar")
}
Hope that gets you closer to resolving your issue.

Resources