Этот фрагмент кода вызывает исключение stackOverflow:
ISerializer serializer = buildSerializer(TestDataProvider.getAuthor());
ASObject result = (ASObject) serializer.serialize();
assert result.isNotLazyProxy
В этой строке создается поток StackOverflow: assert result.isNotLazyProxy
.Обратите внимание, что метод isNotLazyProxy
фактически никогда не вызывается.
isNotLazyProxy
- это метод расширения (как они называются в groovy?) , определяемый следующим образом:
/**
* Asserts that this ASObject is not a lazy loaded proxy,
* ie - that all of it's properties' values have been included
*/
ASObject.metaClass.isNotLazyProxy = { ->
assert delegate[HibernateProxyConstants.PROXYINITIALIZED] == true
return true;
}
Тем не менее, установка точки останова в первой строке этого замыкания показывает, что оно никогда не вызывается.
Вместо этого генерируется StackOverflow:
java.lang.StackOverflowError
at java.lang.System.arraycopy(Native Method)
at java.lang.String.getChars(String.java:855)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:391)
at java.lang.StringBuffer.append(StringBuffer.java:224)
at java.lang.StringBuffer.<init>(StringBuffer.java:104)
at org.codehaus.groovy.runtime.InvokerHelper.formatMap(InvokerHelper.java:557)
at org.codehaus.groovy.runtime.InvokerHelper.format(InvokerHelper.java:530)
at org.codehaus.groovy.runtime.InvokerHelper.formatList(InvokerHelper.java:602)
at org.codehaus.groovy.runtime.InvokerHelper.format(InvokerHelper.java:527)
at org.codehaus.groovy.runtime.InvokerHelper.formatMap(InvokerHelper.java:575)
snip
Я не уверен, что это актуально, но ASObject
является подклассом Map
, и его содержимое может иметь свойства, которые ссылаются на другие ключи внутри себя.
IЯ бы подумал, что это актуально, за исключением того, что StackOverflow указывает на то, что groovy пересекает элементы карты.
Что происходит?Почему происходит этот стекопоток?