Axon/SpringBoot中出现禁止类异常

pgccezyw  于 2022-12-23  发布在  Spring
关注(0)|答案(3)|浏览(171)

我正在尝试用spring boot来实现axon框架。
这是jar的版本。
1.Spring Boot2.6.1

  1. java 17
    1.轴突4.5.6
    我的项目结构为:
  • 用户命令
  • 用户查询
  • 用户核心(包含事件的通用jar)

尝试从查询应用程序访问*UserRegisteredEvent**时,我收到以下异常。

com.thoughtworks.xstream.security.ForbiddenClassException: com.tesla.user.core.events.UserRegisteredEvent
    at com.thoughtworks.xstream.security.NoTypePermission.allows(NoTypePermission.java:26) ~[xstream-1.4.18.jar:1.4.18]

我哪里错了?
注:
我也试过将我的java版本降级到16,并将spring boot降级到2.4。

1tu0hz3e

1tu0hz3e1#

我哪里错了?
您的问题出在XStream上,这可以从异常中看出。
几个月前,XStream已经看到一些CVE's在飞行,这需要它的去序列化/序列化方法转变180度。
XStream现在要求您告诉它可以序列化哪些类,而不是采用完全反射的方法来理解如何反序列化/序列化对象。
Axon认为XStreamSerializer对于任何应用程序来说都是一个不错的默认值,因为它 * 是 * 能够反序列化任何东西的,然而,上面的内容使这变得不可行,需要在序列化器的末尾做一些修改。
这些更改已在Framework 4.5.4中发布,您可以找到其发行说明here
在注解中可以看到,框架试图为XStream示例提供一些为您提供安全的类型,它通过查找@EnableAutoConfiguration注解类的包名来实现这一点,注意@SpringBootApplication是用@EnableAutoConfiguration进行元注解的。
Axon的自动配置将允许该软件包下的所有类型,但仅此而已.框架还会给你一个警告,在INFO级别声明如下:

Initializing an XStream instance since none was found. 
The auto configuration base packages will be used as wildcards for the XStream security settings.

综上所述,我有两点建议:
1.如果您想坚持使用XStream作为序列化器,我建议手动配置一个XStream示例,这样您就可以完全控制哪些类可以序列化,哪些类不可以序列化,从而解决前面提到的异常。
1.如果你对你正在使用的序列化器不感兴趣,你可以试试Axon Framework提供的JacksonSerializer,这需要你通过ObjectMapper使所有的对象都可以反序列化,这样就引入了额外的依赖和/或注解。
要了解如何在Axon中配置串行化器,请参阅其参考指南的this页。

avwztpqn

avwztpqn2#

我通过添加XStream bean找到了解决方案。

@Bean
public XStream xStream() {
    XStream xStream = new XStream();

    xStream.allowTypesByWildcard(new String[] { "com.example.**" });
    return xStream;
}

详情见this post
希望这能有所帮助

cygmwpex

cygmwpex3#

我通过将应用配置为使用JacksonSerializer解决了此问题
下面是我的环境规范:

  • JDK 17语言
  • Spring Boot2.7.6
  • 轴突4.5.8

解决方案:将此添加到您的Application.properties

# Axon serializer config
axon.serializer.general=jackson
axon.serializer.events=jackson
axon.serializer.messages=jackson

相关问题