2015-09-26 33 views
2

我们的应用程序使用一个使用SSL证书进行保护的WebApi。大多时候一切正常,但是,有时,有以下错误应用程序崩溃:Android Spring和SSL的java.lang.StackOverflowError

java.lang.StackOverflowError 
at java.io.FilterInputStream.read(FilterInputStream.java:118) 
at com.android.org.bouncycastle.asn1.DefiniteLengthInputStream.read(DefiniteLengthInputStream.java:74) 
at java.io.FilterInputStream.read(FilterInputStream.java:118) 
at com.android.org.bouncycastle.asn1.DefiniteLengthInputStream.read(DefiniteLengthInputStream.java:74) 
at java.io.FilterInputStream.read(FilterInputStream.java:118) 
at com.android.org.bouncycastle.asn1.DefiniteLengthInputStream.read(DefiniteLengthInputStream.java:74) 
at java.io.FilterInputStream.read(FilterInputStream.java:118) 
at com.android.org.bouncycastle.asn1.DefiniteLengthInputStream.read(DefiniteLengthInputStream.java:74) 
at com.android.org.bouncycastle.util.io.Streams.readFully(Streams.java:49) 
at com.android.org.bouncycastle.util.io.Streams.readFully(Streams.java:40) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.getBuffer(ASN1InputStream.java:384) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.createPrimitiveDERObject(ASN1InputStream.java:447) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildObject(ASN1InputStream.java:184) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.readObject(ASN1InputStream.java:272) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildEncodableVector(ASN1InputStream.java:193) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildDEREncodableVector(ASN1InputStream.java:204) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildObject(ASN1InputStream.java:173) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.readObject(ASN1InputStream.java:272) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildEncodableVector(ASN1InputStream.java:193) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildDEREncodableVector(ASN1InputStream.java:204) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildObject(ASN1InputStream.java:173) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.readObject(ASN1InputStream.java:272) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildEncodableVector(ASN1InputStream.java:193) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildDEREncodableVector(ASN1InputStream.java:204) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildObject(ASN1InputStream.java:173) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.readObject(ASN1InputStream.java:272) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildEncodableVector(ASN1InputStream.java:193) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildDEREncodableVector(ASN1InputStream.java:204) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.buildObject(ASN1InputStream.java:173) 
at com.android.org.bouncycastle.asn1.ASN1InputStream.readObject(ASN1InputStream.java:272) 
at com.android.org.bouncycastle.jce.provider.CertPathValidatorUtilities.getObject(CertPathValidatorUtilities.java:339) 
at com.android.org.bouncycastle.jce.provider.CertPathValidatorUtilities.getExtensionValue(CertPathValidatorUtilities.java:325) 
at com.android.org.bouncycastle.jce.provider.RFC3280CertPathUtilities.processCertD(RFC3280CertPathUtilities.java:1268) 
at com.android.org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:310) 
at com.sec.android.security.pkix.SecCertPathValidatorSpi.engineValidate(SecCertPathValidatorSpi.java:100) 
at java.security.cert.CertPathValidator.validate(CertPathValidator.java:190) 
at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:295) 
at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:202) 
at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:612) 
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) 
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:406) 
at com.android.okhttp.Connection.upgradeToTls(Connection.java:146) 
at com.android.okhttp.Connection.connect(Connection.java:107) 
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294) 
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89) 
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:161) 
at org.springframework.http.client.SimpleBufferingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders,byte[])(SourceFile:76) 
at org.springframework.http.client.AbstractBufferingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders)(SourceFile:48) 
at org.springframework.http.client.AbstractClientHttpRequest.org.springframework.http.client.ClientHttpResponse execute()(SourceFile:84) 
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.org.springframework.http.client.ClientHttpResponse execute(org.springframework.http.HttpRequest,byte[])(SourceFile:91) 
at com.myapplication.webapi.spring.interceptors.IonAuthenticationClientInterceptor.org.springframework.http.client.ClientHttpResponse intercept(org.springframework.http.HttpRequest,byte[],org.springframework.http.client.ClientHttpRequestExecution)(SourceFile:82) 
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.org.springframework.http.client.ClientHttpResponse execute(org.springframework.http.HttpRequest,byte[])(SourceFile:81) 
at org.springframework.http.client.InterceptingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders,byte[])(SourceFile:67) 
at org.springframework.http.client.AbstractBufferingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders)(SourceFile:48) 

//The stack below repeats about 100 times 
at org.springframework.http.client.AbstractClientHttpRequest.org.springframework.http.client.ClientHttpResponse execute()(SourceFile:84) 
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.org.springframework.http.client.ClientHttpResponse execute(org.springframework.http.HttpRequest,byte[])(SourceFile:91) 
at com.myapplication.webapi.spring.interceptors.IonAuthenticationClientInterceptor.org.springframework.http.client.ClientHttpResponse intercept(org.springframework.http.HttpRequest,byte[],org.springframework.http.client.ClientHttpRequestExecution)(SourceFile:82) 
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.org.springframework.http.client.ClientHttpResponse execute(org.springframework.http.HttpRequest,byte[])(SourceFile:81) 
at org.springframework.http.client.InterceptingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders,byte[])(SourceFile:67) 
at org.springframework.http.client.AbstractBufferingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders)(SourceFile:48) 
//End of stack that repeats 100 times 

at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.org.springframework.http.client.ClientHttpResponse execute(org.springframework.http.HttpRequest,byte[])(SourceFile:91) 
at com.myapplication.webapi.spring.interceptors.IonAuthenticationClientInterceptor.org.springframework.http.client.ClientHttpResponse intercept(org.springframework.http.HttpRequest,byte[],org.springframework.http.client.ClientHttpRequestExecution)(SourceFile:82) 
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.org.springframework.http.client.ClientHttpResponse execute(org.springframework.http.HttpRequest,byte[])(SourceFile:81) 
at org.springframework.http.client.InterceptingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders,byte[])(SourceFile:67) 
at org.springframework.http.client.AbstractBufferingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders)(SourceFile:48) 
at org.springframework.http.client.AbstractClientHttpRequest.org.springframework.http.client.ClientHttpResponse execute()(SourceFile:84) 
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.org.springframework.http.client.ClientHttpResponse execute(org.springframework.http.HttpRequest,byte[])(SourceFile:91) 
at com.myapplication.webapi.spring.interceptors.IonAuthenticationClientInterceptor.org.springframework.http.client.ClientHttpResponse intercept(org.springframework.http.HttpRequest,byte[],org.springframework.http.client.ClientHttpRequestExecution)(SourceFile:82) 
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.org.springframework.http.client.ClientHttpResponse execute(org.springframework.http.HttpRequest,byte[])(SourceFile:81) 
at org.springframework.http.client.InterceptingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders,byte[])(SourceFile:67) 
at org.springframework.http.client.AbstractBufferingClientHttpRequest.org.springframework.http.client.ClientHttpResponse executeInternal(org.springframework.http.HttpHeaders)(SourceFile:48) 
at org.springframework.http.client.AbstractClientHttpRequest.org.springframework.http.client.ClientHttpResponse execute()(SourceFile:84) 
at org.springframework.web.client.RestTemplate.java.lang.Object doExecute(java.net.URI,org.springframework.http.HttpMethod,org.springframework.web.client.RequestCallback,org.springframework.web.client.ResponseExtractor)(SourceFile:536) 
at org.springframework.web.client.RestTemplate.java.lang.Object execute(java.lang.String,org.springframework.http.HttpMethod,org.springframework.web.client.RequestCallback,org.springframework.web.client.ResponseExtractor,java.util.Map)(SourceFile:506) 
at org.springframework.web.client.RestTemplate.org.springframework.http.ResponseEntity exchange(java.lang.String,org.springframework.http.HttpMethod,org.springframework.http.HttpEntity,java.lang.Class,java.util.Map)(SourceFile:455) 
at com.myapplication.webapi.smartclients.SynchronizationClient_.org.springframework.http.ResponseEntity requestUpdateFile(long,long)(SourceFile:95) 
at com.myapplication.services.synchronization.SynchronizationTask$2$1.org.springframework.http.ResponseEntity call()(SourceFile:514) 
at com.myapplication.services.synchronization.SynchronizationTask$2$1.java.lang.Object call()(SourceFile:509) 
at com.myapplication.managers.rest.RestManager$RestRequest.java.lang.Object execute()(SourceFile:110) 
at com.myapplication.managers.rest.RestManager.java.lang.Object executeRequest(java.lang.String,int,com.myapplication.webapi.spring.RestErrorProcessor,java.util.concurrent.Callable)(SourceFile:67) 
at com.myapplication.services.synchronization.SynchronizationTask$2.void run()(SourceFile:506) 
at java.lang.Thread.run(Thread.java:841) 

有不是一个具体的WebAPI调用导致此问题......它已经几乎所有的WebAPI方法报告可在我们的系统,但正如我之前所说的,在同一台设备上,大多数情况下它工作得很好。

我也注意到,在我们的web服务服务器上启用SSL后,发生了这种情况。

有没有人知道发生了什么,还有,我怎么解决这个问题?

回答

0

您可以尝试增加执行REST调用的线程的堆栈大小。 在Android的主UI线程堆栈大小是有限的,但理论上你可以开始与一个任意大小的新线程(在这种情况下1MB),如下

ThreadGroup group = new ThreadGroup("restAPIgroup"); 
new Thread(group, runnableObject, "YourThreadName", 1024*1024).start(); 
+0

你好卡捷琳娜!非常感谢!我会尝试你的方法,但是我真的担心同一段代码被反复调用,因为堆栈跟踪显示...我认为,增加堆栈大小只会使系统重复这些调用,然后再次失败... – regisxp

+0

原因可能是你有一个非常复杂的SSL证书,在这种情况下,具有适当大小的堆栈可以解决你的问题。 –

+0

我怎么知道我的证书是否复杂?它有2048个密钥长度和两个中间证书以及根证书。非常感谢! – regisxp