aem - 未使用自定义可序列化属性处理吊索作业
问题描述
我创建了自定义 Serializable 类,并将其添加到必要的 Sling Job 的有效负载中
public SomeClass extends Serializable {
//Implementaton details
}
.......
//some service
Map<String, Object> payload = new HashMap<>();
payload.put("property1", someClassObject);
jobManager.createJob("some/job/topic").properties(payload).add();
结果成功创建并分配了作业,但未触发process
方法。JobConsumer
我在 org.apache.sling.event.jobs 上启用了 TRACE 日志级别,日志说同样的:添加并分配了作业,没有其他任何事情发生:
20.03.2019 11:15:00.263 DEBUG [sling-threadpool-15f9e0b4-a24d-4b0d-bf4a-433ec604e41d-(apache-sling-job-thread-pool)-27-<main queue>(com/some/Service)] org.apache.sling.event.jobs.audit ASSIGN OK bb92b672-1b0d-4fe8-bf5e-9194a934f249 : 2019/3/20/11/15/bb92b672-1b0d-4fe8-bf5e-9194a934f249_50
20.03.2019 11:15:00.263 DEBUG [sling-threadpool-15f9e0b4-a24d-4b0d-bf4a-433ec604e41d-(apache-sling-job-thread-pool)-27-<main queue>(com/some/Service)] org.apache.sling.event.jobs.audit ADD OK topic=some/job/topic, properties={spreadsheet=com.some.project.SomeClass@7acdf4a2} : 2019/3/20/11/15/bb92b672-1b0d-4fe8-bf5e-9194a934f249_50
如果我传递标准的可序列化对象,如字符串、整数等;工作开始了,我可以在日志中找到证据:
20.03.2019 11:15:00.012 DEBUG [sling-threadpool-15f9e0b4-a24d-4b0d-bf4a-433ec604e41d-(apache-sling-job-thread-pool)-27-<main queue>(com/some/Service)] org.apache.sling.event.jobs.audit START OK : 2019/3/20/11/15/bb92b672-1b0d-4fe8-bf5e-9194a934f249_49
如何解决 Sling Job 处理的问题?
在 AEM 6.4.2 和 6.4.3 上测试
解决方案
问题是您的自定义类被禁止反序列化。实际上,所有类都被禁止反序列化,如此处所述。您应该将希望反序列化的类列入白名单。
只有在org.apache.sling.event.impl而不是org.apache.sling.event.jobs上创建调试记录器时,才会看到特定的RuntimeException:
*DEBUG* [sling-default-137-Registered Service.4303] org.apache.sling.event.impl.jobs.queues.QueueJobCache Unable to read resource.
java.lang.UnsupportedOperationException: Deserialization not allowed for class TestEnum
at org.kantega.notsoserial.DefaultNotSoSerial.preventDeserialization(DefaultNotSoSerial.java:256)
at org.kantega.notsoserial.DefaultNotSoSerial.onBeforeResolveClass(DefaultNotSoSerial.java:248)
at org.kantega.notsoserial.ObjectInputStreamClassVisitor.onBeforeResolveClass(ObjectInputStreamClassVisitor.java:48)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1994)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1570)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at org.apache.sling.jcr.resource.internal.helper.JcrPropertyMapCacheEntry.convertToType(JcrPropertyMapCacheEntry.java:330) [org.apache.sling.jcr.resource:3.0.8]
at org.apache.sling.jcr.resource.internal.helper.JcrPropertyMapCacheEntry.convertToType(JcrPropertyMapCacheEntry.java:231) [org.apache.sling.jcr.resource:3.0.8]
at org.apache.sling.jcr.resource.internal.JcrValueMap.get(JcrValueMap.java:105) [org.apache.sling.jcr.resource:3.0.8]
at org.apache.sling.event.impl.support.ResourceHelper.cloneValueMap(ResourceHelper.java:203) [org.apache.sling.event:4.2.10]
at org.apache.sling.event.impl.jobs.Utility.readJob(Utility.java:181) [org.apache.sling.event:4.2.10]
这是捕获此异常的代码行。
推荐阅读
- go - 如何在 monorepo 中设置 protobuf、grpc 和 Go 模块?
- android - ConstraintLayout 半径没有响应
- javascript - 在具有多个输入的自定义函数中支持数组
- wordpress - 从 React Native 到 Flywheel 本地服务器的请求失败
- python - 将变量名存储在列表中
- javascript - 从 Java Selenium 执行 JavaScript 库和函数
- javascript - IE 11 不会触发无效视频格式的错误事件
- php - 如果数据库中存在每个复选框的值,如何检查多个复选框,否则未选中
- java - 为什么行和列的全局声明在下面的代码中不起作用
- linux-kernel - 无法在虚拟地址处处理内核分页请求 - 树莓派 3b+