correct StackOverflowEerror from rendering `java.nio.Path`
the `java.nio.Path` interface is recursively iterable on Path. This causes a stack-overflow in ST4's representation as it is never able to find an element that isnt iterable, so it calls `convertAnythingIteratableToIterator` all-the-way-down.
`java.nio.Path implements Iterable<java.nio.Path>`,
eg:
```
var path = Paths.get("some/path");
Path first = path.iterator().next(); //== "some"
Path firstFirst = first.iterator().next(); //== "some"
Path firstFirstFirst = firstFirst.iterator().next(); //== "some"
```
and so on.
This _really_ does not play nicely with `convertAnythingIteratableToIterator`: This behavior means, even if you supply a converter for `java.nio.path`, ST4 never identifies it as a POJO and so never asks for a renderer.
---
suggestions:
- could rewrite the convertAnything to keep a stack of elements that it checks against, if it finds that asking for iterable conversions ever produces the same value => we're _probably_ in an infinite loop => take some action
- could try to restructure to ask if a representation exists for the object before trying to iterate over it.
- a simple-ish fix would be to look for instances of `Collection` rather than `Iterable`; given that `Iterable` is used in some infinite sequences, this would likely help there too.
I'm swamped, but I need this so I could create a PR if needed. In the mean time I'm going to twiddle my thumbs for a while.
1 条评论