我正在使用以下代码在Groovy中生成随机数。我可以在Groovy Web控制台(https://groovyconsole.appspot.com/)中运行它,并且可以运行,但是当我尝试在Mule中运行它时会失败。这是我使用的代码:
log.info ">>run"
Random random = new Random()
def ranInt = random.nextInt()
def ran = Math.abs(?ranInt)?%20?0;
log.info ">>sleep counter:"+flowVars.counter+" ran: "+ran
sleep(ran)
Run Code Online (Sandbox Code Playgroud)
这是引发的异常:
由以下原因引起:org.codehaus.groovy.control.MultipleCompilationErrorsException:启动失败:Script26.groovy:9:期望EOF,找到“?” @第9行,第25列。def ran = Math.abs(?400)?%20?0; ^
1个错误
我有一个未知结构的嵌套映射,目标是遍历映射中的每个值,检查某个条件(例如null)的值,然后将其替换为其他值。如果地图结构已知,我可以看到如何做,但是这里的问题是它是未知的。
例如,这可以是传递的地图结构(或可以具有任意数量的嵌套地图):
?def map = [
a:5,
b:"r",
c:[ a1:0, b1:null ],
d:[ a2: [ a3:"", b3:99 ], b2:null ],
...
]
Run Code Online (Sandbox Code Playgroud)
通常对于一个简单的地图,可以使用this来更新值:
map.each { it.value == null ? it.value = "" : "" }
Run Code Online (Sandbox Code Playgroud)
但是,对于嵌套地图结构,此方法将不起作用。
有没有一种有效的方法来遍历未知地图的所有嵌套值以调查和更新这些值?
我想用;分隔符拆分以下查询字符串并转换为地图。这样我就可以使用密钥访问值 iPhone、6s Plus 和 2016。
def query = type=iPhone;modelName=6s Plus;year=2016
def result = query .split(';')
println result
Run Code Online (Sandbox Code Playgroud)
我想访问这样的值 - result.getAt('type'), result.getAt('modelName')
我尝试了以下方法 - 但它没有按预期工作
Map<String,String> response = result.collectEntries{
[
it.type,
it.modelName,
it.year
]
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 Groovy 中实现这一点?
我有一个元素列表,我想构建一个地图,该列表中的每个元素都有一个方法调用。例如:
list = ['a', 'b', 'c']
map = list.collectEntries{[it: println(it)]}
map[b]
>>b
Run Code Online (Sandbox Code Playgroud)
由于两个问题,这不起作用:
println 分配给映射中的键时立即执行map[b] 遇到错误: groovy.lang.MissingPropertyException:
No such property: b for class: test是否可以设置这样的地图,而无需立即执行命令?怎么做到呢?
注意:我知道,我想要实现的目标听起来有点奇怪,但是我得到了一种方法,该方法将这样的映射作为参数然后运行命令,因此我没有其他选项,例如 for 循环之类的东西
我在解析以下 XML 中的属性值时遇到问题:
s='''<?xml version="1.0" encoding="UTF-8"?>
<web-ext
xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-ext_1_0.xsd"
version="1.0">
<reload-interval value="3"/>
<context-root uri="foo/bar" />
<enable-directory-browsing value="false"/>
<enable-file-serving value="true"/>
<enable-reloading value="true"/>
<enable-serving-servlets-by-class-name value="false" />
</web-ext>
'''
def contextroot
def xml = new XmlParser(false,false).parseText(s)
xml.each {
if (it.name() == "context-root")
contextroot = it.attributes().uri
}
Run Code Online (Sandbox Code Playgroud)
它给了我正确的价值。但是有没有更直接的方法呢?就像是
xml.name("context-root").uri
Run Code Online (Sandbox Code Playgroud)
不起作用。
也许这很简单,但是我在网上找不到任何示例:
我想使用JUnit 5运行作为Groovy类实现的单元测试。我当前的设置似乎启动了JUnit 5,但是无法检测到测试用例。IntelliJ可以识别测试,但无法运行。如果添加Java单元测试,则可以正确启动。
这是我现在所拥有的:
项目结构
src
main
groovy
# production code
test
groovy
UnitTest.groovy
build.gradle
...
Run Code Online (Sandbox Code Playgroud)
build.gradle
plugins {
id 'groovy'
}
dependencies {
compile localGroovy()
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.1'
}
test {
useJUnitPlatform()
}
Run Code Online (Sandbox Code Playgroud)
单元测试
import org.junit.jupiter.api.Test
class UnitTest {
@Test
def shouldDoStuff() {
throw new RuntimeException()
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Gradle 4.10。
有任何想法吗?
我的代码中有如下声明:
otherParents.sort { -it.parent.lastUpdateDate.time }.each {
// ...
}
Run Code Online (Sandbox Code Playgroud)
有时lastUpdateDate会为空,并导致异常。
我怎样才能避免它,我对groovy完全陌生,我尝试了问号之类的东西
otherParents.sort { -it.parent?.lastUpdateDate?.time }.each {
// ...
}
Run Code Online (Sandbox Code Playgroud)
但这也行不通
我正在尝试将多个字符串作为参数传递给函数
功能:
void addColumn(java.lang.String... headers)
Run Code Online (Sandbox Code Playgroud)
描述
向该网格添加一行列标题。这应该在列的每个维度上调用一次,并且每个维度的标题长度应该匹配。
来自 Groovy 的示例调用添加了 2016 财年和 2017 财年的一月、二月和三月:
builder.addColumn('2016', '2016', '2016', '2017', '2017', '2017')
builder.addColumn('Jan', 'Feb', 'Mar', Jan', 'Feb', 'Mar')
Run Code Online (Sandbox Code Playgroud)
因此,如果我像上面的示例一样传递参数,它就可以正常工作。我无法找出在 groovy 中动态传递它的方法?
我有一个描述对象列表的JSON文档,它看起来像这样:
[
{
"txId": "ffff",
"sender" : "0xwwwwwww",
"recepient" : "0xeferfef"
},
{
"txId": "ffff",
"sender" : "0xwwwwwww",
"recepient" : "0xeferfef"
}
...
...
]
Run Code Online (Sandbox Code Playgroud)
如何只使用Jackson API 获取List<String>包含txId每个对象的值(不将此JSON转换为pojo-objects列表,然后通过foreach继续此列表并创建新的字符串列表)?
我正在实现声明式 Jenkinsfile,我想运行 Windows 命令并将结果分配给变量。
这是我的代码:
stage('check latest commit') {
steps {
script{
COMMIT = bat("c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'").trim() as String
echo "${COMMIT}"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在 Jenkins 作业中收到以下日志
c:\Software\JenkinsWorkspace\workspace\TFS - XXX>c:\Software\Git\bin\git.exe log -n 1 --pretty=format:'%H'
'656669102c187fe390a1e9d72ed47aa2d8528ad6'[Pipeline] }
[Pipeline] // script
Run Code Online (Sandbox Code Playgroud)
因此该命令按预期执行并返回 HEAD 中最新提交的哈希值。伟大的。然而:
[Pipeline] End of Pipeline
java.lang.NullPointerException: Cannot invoke method trim() on null object
at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
Run Code Online (Sandbox Code Playgroud)
在运行结束时,我收到此错误。这意味着命令的结果值为null,即使命令本身产生结果。
如果我不包括修剪,例如:
stage('check latest commit') {
steps {
script{
COMMIT = bat("c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'")
echo "${COMMIT}" …Run Code Online (Sandbox Code Playgroud)