gpt4 book ai didi

grails - 在 Grails 中应用 Groovy 扩展会为 String#toBoolean() 产生 MissingMethodException

转载 作者:行者123 更新时间:2023-12-04 14:59:27 25 4
gpt4 key购买 nike

背景

Groovy 具有 adding methods to the existing classes 的特性,我找到了some interesting那些。

然后我discovered我需要自定义我的 Grails Bootstrap 来加载它们,所以我添加:

def init = { servletContext -> addExtensionModules() }

def addExtensionModules() {

Map<CachedClass, List<MetaMethod>> map = [:]
ClassLoader classLoader = Thread.currentThread().contextClassLoader
try {
Enumeration<URL> resources = classLoader.getResources(MetaClassRegistryImpl.MODULE_META_INF_FILE)
for (URL url in resources) {
if (url.path.contains('groovy-all')) {
// already registered
continue
}
Properties properties = new Properties()
InputStream inStream
try {
inStream = url.openStream()
properties.load(inStream)
GroovySystem.metaClassRegistry.registerExtensionModuleFromProperties(properties,
classLoader, map)
}
catch (IOException e) {
throw new GroovyRuntimeException("Unable to load module META-INF descriptor", e)
} finally {
inStream?.close()
}
}
} catch (IOException ignored) {}
map.each { CachedClass cls, List<MetaMethod> methods ->
cls.setNewMopMethods(methods)
}
}

我添加了我的 BuildConfig.groovy
compile ('ca.redtoad:groovy-crypto-extensions:0.2') {
excludes 'groovy-all'
}

问题

问题是现在我不能使用 toBoolean() Groovy 字符串的方法:

groovy.lang.MissingMethodException: No signature of method: java.lang.String.toBoolean() is applicable for argument types: () values: [] Possible solutions: asBoolean(), asBoolean(), toFloat(), toDouble()



既然 groovy 已经注册了,为什么缺少这个方法呢?我正在使用 Grails 2.2.4。

编辑

在 groovy 2.0.8 控制台中测试,代码可以工作,所以可能与 Grails 相关。
@Grab('ca.redtoad:groovy-crypto-extensions:0.2')
@GrabExclude('org.codehaus.groovy:groovy-all')

addExtensionModules() //same method of BootStrap, ommited to make shorter.

def key = "password".toKey()
def ciphertext = "some plaintext".bytes.encrypt(key: key)
def x = new String(ciphertext.decrypt(key: key)).toBoolean()
println "S".toBoolean()

最佳答案

代替

map.each { CachedClass cls, List<MetaMethod> methods ->
cls.setNewMopMethods(methods)
}


map.each { CachedClass cls, List<MetaMethod> methods ->
//Add new MOP methods instead of set them as new
cls.addNewMopMethods(methods)
}

CachedClass 中设置新元方法时现有的扩展/元方法被扩展模块中唯一提供的扩展覆盖。在这种情况下, groovy-crypto-extension在 String 类上使用以下扩展方法
class java.lang.String=
[public static javax.crypto.spec.SecretKeySpec ca.redtoad.groovy.extensions.crypto.CryptoExtensionMethods.toKey(java.lang.String),
public static javax.crypto.spec.SecretKeySpec ca.redtoad.groovy.extensions.crypto.CryptoExtensionMethods.toKey(java.lang.String,java.util.Map)
]

如果这些方法设置为 CachedClass,则现有方法将被清除。所以必须将它们添加到 CachedClass 中。因此,制作 toBoolean可用于 String 类。

挑战接受并执行。你欠我一个款待。 (礼品卡也可以接受)。 ;)

关于grails - 在 Grails 中应用 Groovy 扩展会为 String#toBoolean() 产生 MissingMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19564902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com