private boolean shouldBeIgnored(Field f, Object currentNode) {
        int modifiers = f.getModifiers();
        return Modifier.isStatic(modifiers)
                || ClassUtils.isPrimitiveOrWrapper(f.getType())
                || f.getType().isAnnotation()
                || Modifier.isAbstract(modifiers)
                || Modifier.isInterface(modifiers)
                || Modifier.isTransient(modifiers)
                || f.isEnumConstant()
                || !f.canAccess(currentNode)
                || f.isAnnotationPresent(JsonIgnore.class)
                || currentNode instanceof StreamingOutput;
    }
Chase object graph for all @BlobReference strings.
<ul>
  <li>Starting with root and until no entries remain: pop entry off stack, this becomes <code>currentNode</code></li>
  <li>Iterate through every field in <code>currentNode</code>.</li>
  <li>If a field is a <code>String</code> and annotated with <code>BlobReference</code>, it is captured.</li>
  <li>Any non-String type that begins with <code>io.apiman</code> is pushed onto the stack. All other types are ignored.</li>
</ul>
TODO(msavy): Add cache or use Jandex to avoid repeated expensive reflection and iteration.
Simple!
manager/api/rest-impl/src/main/java/io/apiman/manager/api/rest/interceptors/BlobResourceInterceptorProvider.java