使用Corda运行Spring服务器时,Quasar出现错误

3
我正在运行一个相当庞大的 Spring 版本(jHipster 生成),以配合我的 Corda 项目使用。当我运行 Spring 服务器时,出现了一些与 quasar 相关的错误。我猜测这是因为 quasar-utils 在服务器的 gradle 依赖中。Quasar 抱怨与 OAuth2 spring 服务相关的某些问题。实际上,到目前为止,我并没有使用任何 OAuth 功能,所以我不确定这些错误是否是良性的。无论如何,我有点担心 quasar 会干扰整个项目。在没有将 quasar-utils 放入服务器 gradle 依赖项的情况下,有没有一种方法可以进行 Corda 的 RPC 交互呢?
以下是错误信息:
[quasar] WARNING: Can't determine super class of org/springframework/security/ldap/authentication/BindAuthenticator
[quasar] WARNING: Can't determine super class of org/springframework/security/ldap/authentication/PasswordComparisonAuthenticator
2018-08-06 17:55:04.769 DEBUG 2492 --- [  restartedMain] c.ehcache.core.Ehcache-usersByLogin      : Initialize successful.
2018-08-06 17:55:04.801 DEBUG 2492 --- [  restartedMain] c.ehcache.core.Ehcache-usersByEmail      : Initialize successful.
[quasar] WARNING: Can't determine super class of org/springframework/security/oauth2/client/oidc/userinfo/OidcUserService
[quasar] WARNING: Can't determine super class of org/springframework/security/oauth2/client/userinfo/OAuth2UserService
[quasar] ERROR: Unable to instrument class org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2LoginConfigurer
java.lang.NullPointerException
    at co.paralleluniverse.asm.Item.a(Unknown Source)
    at co.paralleluniverse.asm.ClassWriter.c(Unknown Source)
    at co.paralleluniverse.asm.ClassWriter.a(Unknown Source)
    at co.paralleluniverse.asm.Frame.a(Unknown Source)
    at co.paralleluniverse.asm.Frame.a(Unknown Source)
    at co.paralleluniverse.asm.MethodWriter.visitMaxs(Unknown Source)
    at co.paralleluniverse.asm.tree.MethodNode.accept(Unknown Source)
    at co.paralleluniverse.asm.commons.JSRInlinerAdapter.visitEnd(Unknown Source)
    at co.paralleluniverse.asm.MethodVisitor.visitEnd(Unknown Source)
    at co.paralleluniverse.fibers.instrument.InstrumentClass$1.visitEnd(InstrumentClass.java:190)
    at co.paralleluniverse.asm.ClassReader.b(Unknown Source)
    at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
    at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
    at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:134)
    at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:94)
    at co.paralleluniverse.fibers.instrument.JavaAgent$Transformer.transform(JavaAgent.java:209)
    at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
    at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.getHttp(WebSecurityConfigurerAdapter.java:205)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.init(WebSecurityConfigurerAdapter.java:321)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.init(WebSecurityConfigurerAdapter.java:92)
    at com.cordatemplate.cordapp.config.SecurityConfiguration$$EnhancerBySpringCGLIB$$c1c18162.init(<generated>)
    at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.init(AbstractConfiguredSecurityBuilder.java:371)
    at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.doBuild(AbstractConfiguredSecurityBuilder.java:325)
    at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:41)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain(WebSecurityConfiguration.java:104)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$bc81b89d.CGLIB$springSecurityFilterChain$4(<generated>)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$bc81b89d$$FastClassBySpringCGLIB$$6a532806.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:361)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$bc81b89d.springSecurityFilterChain(<generated>:65535)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:582)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1256)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1105)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
    at com.cordatemplate.cordapp.CordaApp.main(CordaApp.java:61)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
[quasar] ERROR: while transforming org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2LoginConfigurer: null
java.lang.NullPointerException
    at co.paralleluniverse.asm.Item.a(Unknown Source)
    at co.paralleluniverse.asm.ClassWriter.c(Unknown Source)
    at co.paralleluniverse.asm.ClassWriter.a(Unknown Source)
    at co.paralleluniverse.asm.Frame.a(Unknown Source)
    at co.paralleluniverse.asm.Frame.a(Unknown Source)
    at co.paralleluniverse.asm.MethodWriter.visitMaxs(Unknown Source)
    at co.paralleluniverse.asm.tree.MethodNode.accept(Unknown Source)
    at co.paralleluniverse.asm.commons.JSRInlinerAdapter.visitEnd(Unknown Source)
    at co.paralleluniverse.asm.MethodVisitor.visitEnd(Unknown Source)
    at co.paralleluniverse.fibers.instrument.InstrumentClass$1.visitEnd(InstrumentClass.java:190)
    at co.paralleluniverse.asm.ClassReader.b(Unknown Source)
    at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
    at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
    at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:134)
    at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:94)
    at co.paralleluniverse.fibers.instrument.JavaAgent$Transformer.transform(JavaAgent.java:209)
    at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
    at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.getHttp(WebSecurityConfigurerAdapter.java:205)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.init(WebSecurityConfigurerAdapter.java:321)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.init(WebSecurityConfigurerAdapter.java:92)
    at com.cordatemplate.cordapp.config.SecurityConfiguration$$EnhancerBySpringCGLIB$$c1c18162.init(<generated>)
    at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.init(AbstractConfiguredSecurityBuilder.java:371)
    at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.doBuild(AbstractConfiguredSecurityBuilder.java:325)
    at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:41)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain(WebSecurityConfiguration.java:104)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$bc81b89d.CGLIB$springSecurityFilterChain$4(<generated>)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$bc81b89d$$FastClassBySpringCGLIB$$6a532806.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:361)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$bc81b89d.springSecurityFilterChain(<generated>:65535)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:582)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1256)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1105)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
    at com.cordatemplate.cordapp.CordaApp.main(CordaApp.java:61)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)

你是否将Corda Quasar插件应用于你的节点Web服务器(请参见https://github.com/corda/spring-webserver/blob/release-V3/build.gradle#L39)?如果不应用此插件会发生什么? - Joel
是的,我正在应用该插件。如果我从build.gradle中删除那一行,应用程序就可以正常启动,但是我会收到有关隐私盐的单独错误(https://stackoverflow.com/questions/48578603/using-spring-boot-for-replacing-corda-server-giving-privacy-salt-should-be-32-bi)。我尝试清除缓存,但问题仍然存在。如果我替换quasar-utils插件,则隐私盐错误消失,原始错误返回。 - user123959
2个回答

0
只要您在流程中没有使用Quasar无法检测的任何对象,就不会遇到任何问题。Quasar主要用于Corda的可挂起纤维,这意味着一个序列化堆栈。如果该对象不在该堆栈上,它不应该引起任何问题。
但更重要的是,您的Corda节点和Spring Boot应用程序应该在单独的进程中运行,以避免任何干扰。编译Cordapps和Corda本身时才需要Quasar utils。如果您的Spring Boot应用程序是单独的,则建议在不依赖quasar-utils的单独gradle/maven子项目中构建它。

0
来晚了,但看一下quasar-utils这里的源代码,你可以在构建中设置一个忽略包的扩展属性:
ext.quasar_exclusions = [
        'co.paralleluniverse**',
        'groovy**',
        'com.esotericsoftware.**',
        'jdk**',
        'junit**',
        'kotlin**',
        'net.rubygrapefruit.**',
        'org.gradle.**',
        'org.apache.**',
        'org.jacoco.**',
        'org.junit**',
        'org.slf4j**',
        'worker.org.gradle.**',
        'com.nhaarman.mockito_kotlin**',
        'org.assertj**',
        'org.hamcrest**',
        'org.mockito**',
        'org.opentest4j**',
        'org.springframework**',
        'reactor.core.publisher**',
        'com.github.manosbatsis.corbeans.spring.boot**'
]

此外,看起来发布4.0.45允许像quasar这样的扩展:
quasar {
    /// ...
    // defaults to quasar_exclusions property
    excludePackages = [
        'glob for package not to be instrumented',
        //...
    ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接