我的Grails代码有一个搜索功能,在执行findAllBy查询后重定向到另一个控制器操作:
def results = Foo.findAllByBar(baz)
redirect(action: "result", params: [results: results])
Run Code Online (Sandbox Code Playgroud)
findAllByBar按预期返回带有模型的ArrayList,但在重定向之后,接收操作获得一个String数组.更糟糕的是,当只有一个结果时它甚至没有得到一个数组,它只是得到一个字符串.
鉴于我必须在接收视图中迭代结果,在字符串上执行它将仔细地单独打印每个字母.我们都同意这可能不是理想的行为.
我有一项将任务分配给操作员的服务。在方法内部,我在循环内及时分配许多任务。我想刷新任务、操作员和 DistributionLog。如果我只需要保存一个域名,我想我可以做类似的事情
Operator.withTransaction{ //...some code }
Run Code Online (Sandbox Code Playgroud)
但我至少有 3 个域需要保存,更糟糕的是,其中两个域相互依赖。操作员有一个任务列表。
我迫不及待地等待所有分配完成,然后操作员才能获得他的任务,所以我必须强制它刷新。更难的是,这一切都在 multitenantService.doWithTenant() (多租户插件)中
我是Grails的新手,我要求我不知道如何实现.我需要创建一个与Grails应用程序一起运行的进程,并进行远程调用,处理接收到的数据并将其写入DB,以便Grails应用程序可以使用它.
到目前为止,我认为我需要利用域控制器,但我不知道如何创建一个在后台持续运行并更新数据库的单独进程.
可能吗?我可以获得参考或代码示例吗?谢谢.
可以为nullable不适用于lat和lng.请帮忙.
class Location {
int id
String country
String province
String city
double lat
double lng
static mapping = {
table: 'Locaations'
country length:100
province length: 100
city length: 100
}
static constraints = {
province(blank:true, nullable:true)
city(blank:true, nullable:true)
lat(blank: true, nullable:true)
lng (blank:true, nullable:true)
}
Run Code Online (Sandbox Code Playgroud)
}
我正在使用Eclipse开发grails版本2.2.1的应用程序,问题是,当我运行应用程序时,我收到下一条消息:
unable to resolve class org.apache.commons.lang3.StringUtils
Run Code Online (Sandbox Code Playgroud)
我将common-lang-jar添加到我的项目中并作为依赖项,但我得到了相同的问题.我能做什么?
我正在尝试更改Grails中控制器名称的默认约定.我的控制器类已命名LongNameInCamelCaseController
.Grails约定优于配置设置此控制器的URL映射longNameInCamelCase
.我希望这个控制器名称在url友好'long-name-in-camel-case'
.
有人已经这样做了吗?
谢谢.
我有一个生产使用的应用程序,当用户进入提案索引页面时,它需要很长时间,有时会超时.我已经将问题缩小为选择所有Proposal对象的SQL语句.问题是Proposal对象有许多图像(byte [])存储在内存中,而这些图像没有在索引页面中使用.这些图像很大,从而导致了问题.
我可以在Grails中优化此查询以删除该页面上不需要的属性或仅添加我在GSP中的属性的不同方法有哪些?
这是控制器代码(scaffolded):
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
respond Proposal.list(params), model:[proposalInstanceCount: Proposal.count()]
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我使用Grails 2.4.4作为我的应用程序.我为我的控制器写了一个集成测试.
class UserControllerIntegrationSpec extends IntegrationSpec {
UserController controller = new UserController()
void "test something"() {
when:
controller.request.method = 'POST'
controller.create()
then:
controller.response.status == HttpStatus.OK.value()
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用IntelliJ运行测试时,我得到一个例外:
java.lang.IllegalStateException: Could not find ApplicationContext, configure Grails correctly first
at grails.util.Holders.getApplicationContext(Holders.java:97)
at grails.test.spock.IntegrationSpec.$spock_initializeSharedFields(IntegrationSpec.groovy:41)
Run Code Online (Sandbox Code Playgroud)
当我使用带test-app
命令的控制台运行集成测试时没有问题.PS单元测试工作没有问题.
当我执行 JUnit 测试用例时,出现以下错误。我正在使用 Grails 域测试用例的 Expectations 插件。
BuildConfig.groovy 文件代码:
plugins {
compile ":domain-expectations:0.6.1"
}
Run Code Online (Sandbox Code Playgroud)
我收到的错误:
java.lang.ExceptionInInitializerError
at org.codehaus.groovy.runtime.InvokerHelper.<clinit>(InvokerHelper.java:61)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallStaticSite(CallSiteArray.java:72)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:159)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at com.lonecyprus.grails.test.Specification.<clinit>(Specification.groovy)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at junit.framework.TestSuite.createTest(TestSuite.java:63)
at junit.framework.TestSuite.addTestMethod(TestSuite.java:310)
at junit.framework.TestSuite.addTestsFromTestCase(TestSuite.java:153)
at junit.framework.TestSuite.<init>(TestSuite.java:132)
at org.junit.internal.runners.JUnit38ClassRunner.<init>(JUnit38ClassRunner.java:72)
at org.junit.internal.builders.JUnit3Builder.runnerForClass(JUnit3Builder.java:11)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: groovy.lang.GroovyRuntimeException: Conflicting module …
Run Code Online (Sandbox Code Playgroud) 我想创建一个简单的xml节点,然后查看来自http://docs.groovy-lang.org/latest/html/api/groovy/util/Node.html的文档并编写这些代码.
def newbook = new Node(null, 'book', [id:'3'])
newbook.appendNode(new Node(newbook,'title',[id:'BookId3']))
newbook.appendNode(new Node(newbook,'author',[id:'3'],'Harper Lee'))
println groovy.xml.XmlUtil.serialize(newbook)
Run Code Online (Sandbox Code Playgroud)
但输出是
<?xml version="1.0" encoding="UTF-8"?><book id="3">
<title id="BookId3"/>
<title/>
<author id="3">Harper Lee</author>
<author/>
</book>
Run Code Online (Sandbox Code Playgroud)
在我看来,有两个标题标签和作者标签被创建.为什么?
我也试过了
def newbook = new Node(null, 'book', [id:'3'])
newbook.appendNode(new QName('title'),'BookId3')
newbook.appendNode(new QName('author'),[id:'3'],'Harper Lee')
println groovy.xml.XmlUtil.serialize(newbook)
Run Code Online (Sandbox Code Playgroud)
输出是
<?xml version="1.0" encoding="UTF-8"?><book id="3">
<title xmlns="">BookId3</title>
<author xmlns="" id="3">Harper Lee</author>
</book>
Run Code Online (Sandbox Code Playgroud)
现在它看起来不错,但有没有办法删除命名空间?
理想情况下,我希望有这样的东西
<book id="3">
<title>BookId3</title>
<author id="3">Harper Lee</author>
</book>
Run Code Online (Sandbox Code Playgroud)
然后在replaceNode()方法中使用它
grails ×9
grails-orm ×2
controller ×1
flush ×1
groovy ×1
spock ×1
transactions ×1
unit-testing ×1
xml ×1