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 提供修复。
我遇到了 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 提供修复。