当我通过maven运行测试时,我在本地机器上遇到以下异常(mvn test).
ch.qos.logback.core.joran.event.SaxEventRecorder@195ed659 - Parser configuration error occured
java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory
Run Code Online (Sandbox Code Playgroud)
在谷歌搜索后,我遇到了几个页面,描述了它背后的主要问题(在不同的类加载器中有几个SAXParserFactoryImpl).
- > http://www.xinotes.org/notes/note/702/
我的问题是,如何确定哪个库也提供SAXParserFactoryImpl,以便我可以排除它.我正在使用Maven,IntelliJ和JDK 1.6.0_23.问题出现在命令行以及从IntelliJ运行测试时.
但奇怪的是,在构建服务器上,这个问题不会发生.
更新1
刚刚想到,当我在mvn clean之后第一次运行mvn测试时,错误没有出现.但是一旦我再次运行mvn test(没有干净,就会发生异常)(当我从IntelliJ运行它时).
当我在cmd行上运行它时,几个mvn测试调用确实有效.
我确实遇到过TestNG和RESTeasy的烦人问题.
我有一个类,它针对API类运行多个测试,该类使用RESTeasy框架来暴露自己.
但是,如果我让测试运行maven(mvn test),那么我得到以下异常:
java.lang.LinkageError: ClassCastException: attempting to castjar:file:/C:/Users/rit/.m2/repository/org/jboss/resteasy/jaxrs-api/2.3.0.GA/jaxrs-api-2.3.0.GA.jar!/javax/ws/rs/ext/RuntimeDelegate.classtojar:file:/C:/Users/rit/.m2/repository/org/jboss/resteasy/jaxrs-api/2.3.0.GA/jaxrs-api-2.3.0.GA.jar!/javax/ws/rs/ext/RuntimeDelegate.class
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:126)
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:96)
at javax.ws.rs.core.Response$ResponseBuilder.newInstance(Response.java:394)
at javax.ws.rs.core.Response.status(Response.java:116)
at javax.ws.rs.core.Response.status(Response.java:130)
at com.pd.api.TokenAPI_V1.validateAccessToken(TokenAPI_V1.java:141)
at com.test.pd.api.TokenAPI_V1Test.testIfValidAccessTokenReturnsCorrectHTTPHeadersWhenTokenIsNotFound(TokenAPI_V1Test.java:359)
Run Code Online (Sandbox Code Playgroud)
测试只是调用API obejct的方法,该方法返回一个Response对象(来自RESTeasy).作为测试框架,我使用TestNG.
测试方法
@Test
public void testIfValidAccessTokenReturnsCorrectHTTPHeadersWhenTokenIsNotFound() throws InvalidAccessTokenException {
Mockito.when(tokenService.validateAccessToken(TestConstants.ACCESS_TOKEN)).thenThrow(new InvalidAccessTokenException());
Response response = tokenAPI_v1.validateAccessToken(TestConstants.ACCESS_TOKEN, TestConstants.USER_AGENT);
assert "no-store".equals(response.getMetadata().getFirst("Cache-Control"));
assert "no-cache".equals(response.getMetadata().getFirst("Pragma"));
}
Run Code Online (Sandbox Code Playgroud)
问题说明
看起来RESTeasy框架在不同的类加载器中加载RuntimeDelegate.如果我看一下源代码,那么在RuntimeDelegate(包括第126行)中有以下方法:RuntimeDelegate.java.
因此,与错误相关的主要语句是instanceof check:
if (!(delegate instanceof RuntimeDelegate))
Run Code Online (Sandbox Code Playgroud)
如果我检查委托实例的类加载器与RuntimeDelegate的类加载器,那么我得到以下输出:
delegate.getClass().getClassLoader() -> org.powermock.core.classloader.MockClassLoader@31e46a68
RuntimeDelegate.class.getClassLoader() -> sun.misc.Launcher$AppClassLoader@3c0fabe9
Run Code Online (Sandbox Code Playgroud)
我知道这当然不起作用,但我想知道为什么RESTeasy的东西被加载到MockClassLoader而不是另一个.特别是因为我没有模拟被测试的TokenAPI.
奇怪的事实
奇怪的是,当我从IntelliJ运行测试时(我选择只运行包含产生错误的方法的给定类的所有测试),然后它就会运行.看起来它与mvn测试运行maven项目中的所有测试(或者至少我认为是这样)的事实有某种关系.
我尝试在{{#each}}循环内调用已注册的车把助手.不幸的是,Ember.js抱怨是因为它试图将助手解析为控制器的属性而不是助手.
Handlebars.registerHelper('testHelper', function(name) {
return 'foo: ' + name
});
Run Code Online (Sandbox Code Playgroud)
(名称和内容只是显示示例的虚拟值)
{{#each entry in App.testController}}
<div>{{{testHelper entry.name}}}</div>
{{/each}}
Run Code Online (Sandbox Code Playgroud)
Ember.js打印的错误是:
Uncaught Error: Handlebars error: Could not find property 'testHelper' on object <App.testController:ember254>.
Run Code Online (Sandbox Code Playgroud)
我如何调用已注册的助手以便识别它?
我目前正在考虑如何使用NoSQL解决方案为Web应用程序实现身份验证.我遇到的问题是,在大多数NoSQL解决方案(例如Cassandra,MongoDB)中可能会延迟写入.例如,我们在节点A上写入,但不能保证写入同时出现在节点B上.这与NoSQL解决方案背后的方法是合乎逻辑的.
现在有一个想法是你没有二次读取(所以一切都超过了主人).这可能适用于MongoDB(你实际上有一个主人),但不适用于Cassandra(所有节点都相同).但是我们的应用程序在世界各地的几个独立点运行,因此我们需要多主机功能.
目前我不知道Cassandra的解决方案,我可以更新数据,并确保后续读取(到所有节点)确实有更改.那么如何在那些认证请求(读取)可以并行出现在几个节点上的NoSQL解决方案之上构建身份验证呢?
谢谢你的帮助!