OmniFaces Json#encode() 堆栈溢出并出现 IllegalArgumentException:无法调用 bean 'class java.lang.Class' 的 属性 'classes' 的 getter

OmniFaces Json#encode() stack overflow with IllegalArgumentException: Cannot invoke getter of property 'classes' of bean 'class java.lang.Class'

我遇到了 Whosebug 异常,完全按照文档中的说明进行操作 (here)

发送字符串以外的任何内容(即 bean 或 HashMap)时发生错误。

@Push
@Inject
private PushContext console;

void onEvent(@Observes ApplicationEvent event) {

    final Map<String, Object> dto = new HashMap<>();
    dto.put("timestamp", event.getTimestamp());
    dto.put("message", event.getMessage());
    dto.put("severity", event.getSeverity());
    console.send(dto); 

    // console.send(event); This line does not work
    // console.send(event.getMessage()); This line works
}

.

堆栈跟踪

Caused by: java.lang.IllegalArgumentException: Cannot invoke getter of property 'classes' of bean 'class java.lang.Class'.
at org.omnifaces.util.Json.encodeBean(Json.java:178)
at org.omnifaces.util.Json.encode(Json.java:89)
at org.omnifaces.util.Json.encodeBean(Json.java:191)
at org.omnifaces.util.Json.encode(Json.java:89)
at org.omnifaces.util.Json.encodeArray(Json.java:123)
at org.omnifaces.util.Json.encode(Json.java:83)
at org.omnifaces.util.Json.encodeBean(Json.java:191)
at org.omnifaces.util.Json.encode(Json.java:89)
at org.omnifaces.util.Json.encodeBean(Json.java:191)
at org.omnifaces.util.Json.encode(Json.java:89)
at org.omnifaces.util.Json.encodeArray(Json.java:123)
at org.omnifaces.util.Json.encode(Json.java:83)
at org.omnifaces.util.Json.encodeBean(Json.java:191)
at org.omnifaces.util.Json.encode(Json.java:89)
at org.omnifaces.util.Json.encodeBean(Json.java:191)
at org.omnifaces.util.Json.encode(Json.java:89)
at org.omnifaces.util.Json.encodeBean(Json.java:191)
at org.omnifaces.util.Json.encode(Json.java:89)
at org.omnifaces.util.Json.encodeArray(Json.java:123)
// Repeats to infinity & beyond

当 map/bean 属性之一是一个 Class 对象,其 classes 属性 又引用自身时,确实会失败。也许是 severity?

我已经根据 this commit 改进了 Json#encode(),以便在遇到 Class 实例时仅打印 Class#getName(),而不是将其作为 bean 处理。根据 OmniFaces 2.5 提供修复。