属性是必需的但未设置(无法为接口创建快照 class)

Attribute is required but not set (Unable to create snapshot class for interface)

我的 Liferay 7 服务器一直在愉快地使用 SomeModule,直到我部署了新版本的 SomeModule,它有一个额外的必填字段 favoriteColor.

现在每当我尝试加载 portlet Liferay 时都会说:

java.lang.RuntimeException: Unable to create snapshot class for interface some.SomeModuleConfiguration
        at com.liferay.portal.configuration.metatype.bnd.util.ConfigurableUtil._createConfigurableSnapshot(ConfigurableUtil.java:77)
        at com.liferay.portal.configuration.metatype.bnd.util.ConfigurableUtil.createConfigurable(ConfigurableUtil.java:51)
        at some.SomeModule.activate(SomeModule.java:50)
...
aused by: java.lang.IllegalStateException: Attribute is required but not set favoriteColor
        at aQute.bnd.annotation.metatype.Configurable$ConfigurableHandler.invoke(Configurable.java:75)
        at com.sun.proxy.$Proxy1220.favoriteColor(Unknown Source)
        at some.SomeModuleConfigurationSnapshot407.<init>(Unknown Source)

SomeModule 的配置 UI 没有显示关于 favoriteColor 的任何信息。

如何解决这个问题,例如将 favoriteColor 设置为其默认值?

如果你有幸得到模块的源代码,你可以这样解决这个问题:

  1. 暂时将新字段设为可选,但将 SomeModuleConfiguration.java 中的 required = true 替换为 required = false
  2. 部署模块。
  3. 加载配置页面,保存。
  4. 恢复到 required = true
  5. 再次部署。

欢迎其他答案!

另一种方法是使用 OSGi 配置文件来设置默认值和缺失值。您可以像使用 liferay 附带的那些模块一样使用这些文件;例如,elasticsearch 配置。 (检查您的 osgi/configs 目录)