Grails: CLI interaction while application is running - grails

Is there anything bad about interacting with Grails via command line while an application is running? For example, I had an application running on my local machine via the grails run-app target and then I opened another command prompt and created a domain class, I noticed that it created the domain class and the equivalent test class but in the other terminal where I had the application running I got a fair bit amount of red text like this:
| Error 2015-03-01 10:40:10,392 [Thread-10] ERROR plugins.AbstractGrailsPluginManager
- Plugin [domainClass:2.3.8] could not reload changes to file [C:\Users\user\Dropbo
x\MoeStuff\Projects\qotd\grails-app\domain\qotd\Quote.groovy]: Ambiguous method overl
oading for method grails.spring.BeanBuilder#registerBeans.
Cannot resolve which method to invoke for [null] due to overlapping prototypes betwee
n:
[interface org.codehaus.groovy.grails.commons.spring.RuntimeSpringConfigurati
on]
[interface org.springframework.beans.factory.support.BeanDefinitionRegistry]
Message: Ambiguous method overloading for method grails.spring.BeanBuilder#registerBe
ans.
Cannot resolve which method to invoke for [null] due to overlapping prototypes betwee
n:
[interface org.codehaus.groovy.grails.commons.spring.RuntimeSpringConfigurati
on]
[interface org.springframework.beans.factory.support.BeanDefinitionRegistry]
Line | Method
->> 3034 | chooseMostSpecificParams in groovy.lang.MetaClassImpl
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 2986 | chooseMethodInternal in ''
| 2929 | chooseMethod . . . . . . . . in ''
| 1204 | getMethodWithCachingInternal in ''
| 3163 | createPogoCallSite . . . . . in ''
| 1306 | createPogoCallSite in groovy.lang.ExpandoMetaClass
| 147 | createPogoSite . . . . . . . in org.codehaus.groovy.runtime.callsite.CallS
iteArray
| 161 | createCallSite in ''
| 45 | defaultCall . . . . . . . . in ''
| 108 | call in org.codehaus.groovy.runtime.callsite.Abstr
actCallSite
| 116 | call . . . . . . . . . . . . in ''
| 156 | doCall in org.codehaus.groovy.grails.plugins.DomainC
lassGrailsPlugin$_closure3
| -2 | invoke0 . . . . . . . . . . in sun.reflect.NativeMethodAccessorImpl
| 57 | invoke in ''
| 43 | invoke . . . . . . . . . . . in sun.reflect.DelegatingMethodAccessorImpl
| 606 | invoke in java.lang.reflect.Method
| 1254 | jlrMethodInvoke . . . . . . in org.springsource.loaded.ri.ReflectiveInter
ceptor
| 90 | invoke in org.codehaus.groovy.reflection.CachedMetho
d
| 233 | doMethodInvoke . . . . . . . in groovy.lang.MetaMethod
| 1086 | invokeMethod in groovy.lang.MetaClassImpl
| 1110 | invokeMethod . . . . . . . . in groovy.lang.ExpandoMetaClass
| 910 | invokeMethod in groovy.lang.MetaClassImpl
| 411 | call . . . . . . . . . . . . in groovy.lang.Closure
| 767 | invokeOnChangeListener in org.codehaus.groovy.grails.plugins.Default
GrailsPlugin
| 716 | notifyOfEvent . . . . . . . in ''
| 731 | notifyOfEvent in ''
| 409 | informOfClassChange . . . . in org.codehaus.groovy.grails.plugins.Abstrac
tGrailsPluginManager
| 367 | informOfFileChange in ''
| 243 | informPluginManager . . . . in org.codehaus.groovy.grails.compiler.Grails
ProjectWatcher
| 46 | access$400 in ''
| 169 | onNew . . . . . . . . . . . in org.codehaus.groovy.grails.compiler.Grails
ProjectWatcher$1
| 210 | cacheFilesForDirectory in org.codehaus.groovy.grails.compiler.Direct
oryWatcher
| 204 | cacheFilesForDirectory . . . in ''
| 187 | checkForNewFiles in ''
| 163 | run . . . . . . . . . . . . in ''
^ 178 | run in org.codehaus.groovy.grails.compiler.Grails
ProjectWatcher
Can anyone please talk a bit about what this error(s) means? And is it ok to be doing what I was doing in the first place or should I ALWAYS stop an application from running before issuing any commands to grails that have to do with artefact creation/modification or do CLI interaction with Grails? Thanks.

It's a best practice to stop your application when doing artifact creation. Modification you can usually get away with keeping the application running, so long as you aren't doing major modifications to the class hierarchy.
The reason for this is in development mode Grails watches for changes artifacts and attempts to reload those changes. In the case of creation it may hit just at the wrong time and confuse your application (what you are seeing in your question).
Reloading of changed/new resources (Domain classes in particular) isn't perfect, but it works most of the time. Save yourself the headache and stop your application during creation.

So grails is going to try compile and load changes to files. So what you are seeing here is grails tried to compile a file you modified or were in the process of modifying and it failed.
Now how well can grails load and compile changes is a somewhat hit or miss. It will load them, but sometimes it just doesn't work and the server needs to be rebooted. Also the amount of processor needed to watch files can be overloaded especially when you checkout new code while your server is running.
So does this harm anything? Well no it just may or may not work. Your server may not reflect changes or it may give you wrong responses than what the code says because it couldn't loaded that code. Changing domain objects could affect your database or persistence layer, but some changes may not be compatible with your DB so you'll have to stop it.

Related

Error in reloading taglib classes in grails 2.5.2

I am using grails 2.5.2 and working on a taglib. When I execute grails run-app everything runs fine, but whenever I make a change in my taglib and save the file I get the following error
Error |
2016-02-26 16:29:30,628 [Thread-9] ERROR plugins.AbstractGrailsPluginManager - Plugin [groovyPages:2.5.2] could not reload changes to file [D:\...\BootstrapTagLib.groovy]: Ambiguous method overloading for method grails.spring.BeanBuilder#registerBeans.
Cannot resolve which method to invoke for [null] due to overlapping prototypes between:
[interface org.codehaus.groovy.grails.commons.spring.RuntimeSpringConfiguration]
[interface org.springframework.beans.factory.support.BeanDefinitionRegistry]
Message: Ambiguous method overloading for method grails.spring.BeanBuilder#registerBeans.
Cannot resolve which method to invoke for [null] due to overlapping prototypes between:
[interface org.codehaus.groovy.grails.commons.spring.RuntimeSpringConfiguration]
[interface org.springframework.beans.factory.support.BeanDefinitionRegistry]
Line | Method
->> 3241 | chooseMostSpecificParams in groovy.lang.MetaClassImpl
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 3194 | chooseMethodInternal in ''
| 3137 | chooseMethod . . . . . . . . in ''
| 1328 | getMethodWithCachingInternal in ''
| 3405 | createPogoCallSite . . . . . in ''
| 1314 | createPogoCallSite in groovy.lang.ExpandoMetaClass
| 150 | createPogoSite . . . . . . . in org.codehaus.groovy.runtime.callsite.CallSiteArray
| 164 | createCallSite in ''
| 48 | defaultCall . . . . . . . . in ''
| 113 | call in org.codehaus.groovy.runtime.callsite.AbstractCallSite
| 125 | call . . . . . . . . . . . . in ''
| 342 | doCall in org.codehaus.groovy.grails.plugins.web.GroovyPagesGrailsPlugin$_closure5
| -2 | invoke0 . . . . . . . . . . in sun.reflect.NativeMethodAccessorImpl
| 57 | invoke in ''
| 43 | invoke . . . . . . . . . . . in sun.reflect.DelegatingMethodAccessorImpl
| 606 | invoke in java.lang.reflect.Method
| 1426 | jlrMethodInvoke . . . . . . in org.springsource.loaded.ri.ReflectiveInterceptor
| 93 | invoke in org.codehaus.groovy.reflection.CachedMethod
| 325 | doMethodInvoke . . . . . . . in groovy.lang.MetaMethod
| 1210 | invokeMethod in groovy.lang.MetaClassImpl
| 1123 | invokeMethod . . . . . . . . in groovy.lang.ExpandoMetaClass
| 1019 | invokeMethod in groovy.lang.MetaClassImpl
| 426 | call . . . . . . . . . . . . in groovy.lang.Closure
| 767 | invokeOnChangeListener in org.codehaus.groovy.grails.plugins.DefaultGrailsPlugin
| 716 | notifyOfEvent . . . . . . . in ''
| 731 | notifyOfEvent in ''
| 408 | informOfClassChange . . . . in org.codehaus.groovy.grails.plugins.AbstractGrailsPluginManager
| 366 | informOfFileChange in ''
| 226 | informPluginManager . . . . in org.codehaus.groovy.grails.project.compiler.GrailsProjectWatcher
| 48 | access$400 in ''
| 152 | onNew . . . . . . . . . . . in org.codehaus.groovy.grails.project.compiler.GrailsProjectWatcher$1
| 76 | fireOnNew in org.codehaus.groovy.grails.compiler.AbstractDirectoryWatcher
| 104 | run . . . . . . . . . . . . in org.codehaus.groovy.grails.compiler.WatchServiceDirectoryWatcher
| 154 | run in org.codehaus.groovy.grails.compiler.DirectoryWatcher
^ 161 | run . . . . . . . . . . . . in org.codehaus.groovy.grails.project.compiler.GrailsProjectWatcher
I investigated a bit and found the following JIRA which says that this error was fixed since grails 2.3.3. I´ll be working extensively with taglibs, and having to restart the app every time I make a change is very time consuming.
Is there an override I could do in in resources.groovy? Is this error present in grails 2.5.3 or 2.5.1?
Good day and thanks.

Setting Java System.Property (to Enable TLS1.1) for older grails site (Grails 2.3)

We have a rather ancient Grails site (2.3) that has been serving our needs for quite a while. The server needs to call out to another service for customer details, and that service will soon require TLS 1.1 or higher only. Our site is running on java 1.7, which should support TLS 1.1 and 1.2, but requires it to be enabled explicitly. I'm having trouble enabling it in the grails site.
Primarily what I've tried is to start grails by running
grails -Dhttps.protocols=TLSv1.1 run-app
based on the instructions here, and the hint here. But when I do, the socket is still closed when I try to login to the other site:
Message: Connection reset
Line | Method
->> 196 | read in java.net.SocketInputStream
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 122 | read in ''
| 82 | flushBuffer . . . . . . in java.io.BufferedOutputStream
| 140 | flush in ''
| 191 | flush . . . . . . . . . in org.apache.commons.httpclient.ChunkedOutputStream
| 99 | flush in com.ctc.wstx.io.UTF8Writer
| 214 | flush . . . . . . . . . in com.ctc.wstx.sw.BufferingXmlWriter
| 311 | flush in com.ctc.wstx.sw.BaseStreamWriter
| 50 | flush . . . . . . . . . in org.apache.axiom.util.stax.wrapper.XMLStreamWriterWrapper
| 230 | flush in org.apache.axiom.om.impl.MTOMXMLStreamWriter
| 91 | serialize . . . . . . . in org.apache.axis2.databinding.ADBDataSource
| 638 | internalSerialize in org.apache.axiom.om.impl.llom.OMSourcedElementImpl
| 563 | serializeChildren . . . in org.apache.axiom.om.impl.util.OMSerializerUtil
| 846 | internalSerialize in org.apache.axiom.om.impl.llom.OMElementImpl
| 267 | serializeInternally . . in org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl
| 229 | internalSerialize in ''
| 188 | serializeAndConsume . . in org.apache.axiom.om.impl.llom.OMSerializableImpl
| 74 | writeTo in org.apache.axis2.transport.http.SOAPMessageFormatter
| 84 | writeRequest . . . . . in org.apache.axis2.transport.http.AxisRequestEntity
| 499 | writeRequestBody in org.apache.commons.httpclient.methods.EntityEnclosingMethod
| 2114 | writeRequest . . . . . in org.apache.commons.httpclient.HttpMethodBase
| 1096 | execute in ''
| 398 | executeWithRetry . . . in org.apache.commons.httpclient.HttpMethodDirector
| 171 | executeMethod in ''
| 397 | executeMethod . . . . . in org.apache.commons.httpclient.HttpClient
| 621 | executeMethod in org.apache.axis2.transport.http.AbstractHTTPSender
| 193 | sendViaPost . . . . . . in org.apache.axis2.transport.http.HTTPSender
| 75 | send in ''
| 404 | writeMessageWithCommons in org.apache.axis2.transport.http.CommonsHTTPTransportSender
| 231 | invoke in ''
| 443 | send . . . . . . . . . in org.apache.axis2.engine.AxisEngine
| 406 | send in org.apache.axis2.description.OutInAxisOperationClient
| 229 | executeImpl . . . . . . in ''
| 165 | execute in org.apache.axis2.client.OperationClient
| 3916 | login . . . . . . . . . in com.zuora.api.ZuoraServiceStub
| 51 | ___init___ in com.zuora.zortal.util.ZApi$$EPbnSoym
| 48 | <init> . . . . . . . . in com.zuora.zortal.repository.ZuoraRepository
| 40 | login in saaseiportal.unauthorized.LoginController
| 195 | doFilter . . . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1145 | runWorker . . . . . . . in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run . . . . . . . . . . in java.lang.Thread
I have confirmed that my system and system's java support TLS 1.1. I created an example java client to connect directly to the site. It gets a similar connection reset message when I run it regularly, but it gets a valid response when I try
java -Dhttps.protocols=TLSv1.1 SampleHttpTest
I suspect somewhere in grails is actually clearing out my setting. Immediately before the login call that generates the exception, I added a logging call to
System.out.println(System.getProperty("https.protocols"));
And it just logs a null. Setting that property immediately before I try to login has no effect, possibly because it's far too late in the application's life (some factory already created or something).
I'm actually something of a grails novice, so upgrading the app to grails 2.5 and java 8 is actually a rather daunting prospect. I'm hoping someone can point out something simple like:
"Here's where grails lets you set system properties before running any other java code"
or
"Here's where grails sets a bunch of default settings and you should check the values there already"
or
"It's probably the authentication plugin (or something) that needs to clear/fiddle with those settings"
Thanks in advance for any help!!
It may be the fork mode. To pass a JVM argument to a forked Java you have to change the BuildConfig.groovy a bit:
grails.project.fork = [
...
run : [maxMemory: 1280, minMemory: 128, debug: false, maxPerm: 256, forkReserve: true, jvmArgs: ['-Dhttps.protocols=TLSv1.1']],
...
]
But it could be something else as well.

Grails asset pipeline fails when run from another grails plugin

I'm trying to create part of a web application as a plugin. It's nothing fancy, just a controller or two and a bunch of UI code that uses Angular and Bootstrap. I added the asset pipeline plugin to my plugin and copied over a bunch of common CSS files from another project that's a formal Grails web application (not a plugin like this one). I can verify that the same common files process just fine in that project. When I try to access the CSS files, I get the following error:
2014-09-07 14:52:37,013 [http-bio-8080-exec-4] ERROR errors.GrailsExceptionResolver - URISyntaxException occurred when processing request:
[GET] /content-creator/assets/css/bootstrap.css
Illegal character in path at index 3: css\/../fonts/glyphicons-halflings-regular.eot. Stacktrace follows:
Message: Illegal character in path at index 3: css\/../fonts/glyphicons-halflings-regular.eot
Line | Method
->> 2848 | fail in java.net.URI$Parser
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 3021 | checkChars in ''
| 3105 | parseHierarchical . in ''
| 3063 | parse in ''
| 588 | <init> . . . . . . in java.net.URI
| 43 | doCall in asset.pipeline.processors.CssProcessor$_process_closure1
| 36 | process . . . . . . in asset.pipeline.processors.CssProcessor
| 27 | processedStream in asset.pipeline.AbstractAssetFile
| 112 | fileContents . . . in asset.pipeline.DirectiveProcessor
| 93 | loadContentsForTree in ''
| 45 | compile . . . . . . in ''
| 20 | serveAsset in asset.pipeline.AssetProcessorService
| 28 | index . . . . . . . in asset.pipeline.AssetsController
| 61 | doFilter in asset.pipeline.AssetPipelineFilter
| 1142 | runWorker . . . . . in java.util.concurrent.ThreadPoolExecutor
| 617 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run . . . . . . . . in java.lang.Thread
Does anyone have any idea what is going on here?
I was using asset-pipeline 1.9.4. Upgrading to 1.9.9 fixed the issue.

Grails 2.1.0, Spring Security Core - SpringSecurityUtils No Such Property

I have a grails 2.1.0 application with Spring Security Core and Multi-tenant single db plugin working fine. One of the requirements for this application is to limit concurrent logins to just one. For this, I'm trying to use SpringSecurityUtils in Bootstrap to register a filter.
SpringSecurityUtils.clientRegisterFilter('concurrencyFilter', SecurityFilterPosition.CONCURRENT_SESSION_FILTER)
SpringSecurityUtils is static and as the documentation says, need not be injected, but on executing, it errors out
ERROR context.GrailsContextLoader - Error executing bootstraps: No such property: SpringSecurityUtils for class: BootStrap
Message: No such property: SpringSecurityUtils for class: BootStrap
Line | Method
->> 17 | doCall in BootStrap$_closure1
| 301 | evaluateEnvironmentSpecificBlock in grails.util.Environment
| 294 | executeForEnvironment . . . . . in ''
| 270 | executeForCurrentEnvironment in ''
| 303 | innerRun . . . . . . . . . . . . in java.util.concurrent.FutureTask$Sync
| 138 | run in java.util.concurrent.FutureTask
| 886 | runTask . . . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run in ''
^ 662 | run . . . . . . . . . . . . . . in java.lang.Thread
Spring security is otherwise working fine.
Any help is much appreciated.
You're missing the import - add
import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
and it looks like you'll need this too:
import org.codehaus.groovy.grails.plugins.springsecurity.SecurityFilterPosition
#Burt Beckwith Answer is correct
As of 25-Nov-2016 the imports to be added are
import grails.plugin.springsecurity.SpringSecurityUtils
import grails.plugin.springsecurity.SecurityFilterPosition

Trying to use GPars with IntelliJ and grails

I have been having a lot of trouble using an external JAR, GPars, in an IntelliJ Grails project. I think it is a problem with specifying the dependency. I am using GPars-1.0.0. I saved it in the lib directory and included it as a dependency using the IntelliJ GUI-- Project Structure -> Module -> Add. I synchronized. I also tried adding directly to BuildConfig.groovy:
dependencies {
compile 'org.codehaus.gpars:gpars:1.0.0'
}
I get Code Assist when typing and it compiles. But when I run the following:
import static groovyx.gpars.*
...
GParsPool.withPool {
[1, 2, 3, 4, 5].eachParallel { println it }
}
I get ClassNotFoundException Message jsr166y.ForkJoinPool for the statement "GParsePool.withPool"
Line | Method
->> 156 | findClass in org.codehaus.groovy.tools.RootLoader
| 306 | loadClass in java.lang.ClassLoader
| 128 | loadClass . . . . . . . . in org.codehaus.groovy.tools.RootLoader
| 247 | loadClass in java.lang.ClassLoader
| 2427 | privateGetDeclaredMethods in java.lang.Class
| 1791 | getDeclaredMethods in ''
| 46 | getLocked . . . . . . . . in org.codehaus.groovy.util.LazyReference
| 33 | get in ''
| 80 | load . . . . . . . . . . in allison.zipcode.ZipcodeService$$ENsSBrUW
| 30 | load in allison.zipcode.CountryController
| 195 | doFilter . . . . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 886 | runTask . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run in ''
^ 680 | run . . . . . . . . . . . in java.lang.Thread
Any ideas? Did I specify the dependency correctly in BuildConfig? My code example may be wrong but it seems to follow this example.
Figured it out: I hadn't included jsr166y.jar
compile "org.codehaus.jsr166-mirror:jsr166y:1.7.0"

Resources