【问题标题】:How to resolve FatalBeanException in Spring?如何在 Spring 中解决 FatalBeanException?
【发布时间】:2021-10-21 00:24:01
【问题描述】:

我得到以下异常:

org.springframework.beans.FatalBeanException: 无法正确创建上下文 hybris 全局上下文工厂,原因是在类路径资源 [config/cmsfacades-cmsitems-spring .xml]: bean 初始化失败;

在类路径资源 [ordermanagementfacades-spring.xml] 中定义名称为“ordermanagementOrderConverter”的 bean 创建时出错:使用键 [0] 设置 bean 属性“populators”时无法解析对 bean 'ordermanagementOrderPopulator' 的引用;

在类路径资源 [ordermanagementfacades-spring.xml] 中创建名称为“ordermanagementOrderPopulator”的 bean 时出错:在设置 bean 属性“orderEntryConverter”时无法解析对 bean“ordermanagementOrderEntryConverter”的引用;

在类路径资源 [ordermanagementfacades-spring.xml] 中创建名称为“ordermanagementOrderEntryConverter”的 bean 时出错:使用键 [0] 设置 bean 属性“populators”时无法解析对 bean 'ordermanagementOrderEntryPopulator' 的引用;

在类路径资源 [warehousingfacades-spring.xml] 中创建名称为“warehousingOrderEntryPopulator”的 bean 时出错:在设置 bean 属性“productConverter”时无法解析对 bean“ordermanagementProductConverter”的引用;

在类路径资源 [ordermanagementfacades-spring.xml] 中创建名称为“ordermanagementProductConverter”的 bean 时出错:使用键 [0] 设置 bean 属性“populators”时无法解析对 bean 'ordermanagementProductPopulator' 的引用;

在类路径资源 [ordermanagementfacades-spring.xml] 中定义名称为“ordermanagementProductPopulator”的 bean 创建错误:设置属性值时出错;

bean 类 [de.hybris.platform.ordermanagementfacades.product.converters.populator.OrdermanagementProductBasicPopulator] 的无效属性“designerConverter”:Bean 属性“designerConverter”不可写或具有无效的 setter 方法。 setter的参数类型和getter的返回类型是否匹配?

这是我的 bean 注册:

   <alias name="defaultCustomProductBasicPopulator" alias="productBasicPopulator"/>
    <bean id="defaultCustomProductBasicPopulator" parent="defaultProductBasicPopulator"
    class="de.hybris.NagAcc.facades.product.converters.populator.CustomProductBasicPopulator">
        <property name="designerConverter" ref="designerConverter" />
    </bean>

这是课程:

public class CustomProductBasicPopulator<SOURCE extends ProductModel, TARGET extends ProductData> extends ProductBasicPopulator<SOURCE,TARGET> {

    private Converter<DesignerModel,DesignerData> designerConverter;

    public Converter<DesignerModel, DesignerData> getDesignerConverter() {
        return designerConverter;
    }

    public void setDesignerConverter(Converter<DesignerModel, DesignerData> designerConverter) {
        this.designerConverter = designerConverter;
    }

    @Override
    public void populate(SOURCE productModel, TARGET productData) throws ConversionException {
        super.populate(productModel, productData);
        if (productModel.getDesigner() != null)
        {
            DesignerData designerData = getDesignerConverter().convert(productModel.getDesigner());
            productData.setDesigner(designerData);
        }
    }


这是父 bean 定义:

<alias name="defaultProductBasicPopulator" alias="productBasicPopulator"/>
    <bean id="defaultProductBasicPopulator" parent="baseProductPopulator"
          class="de.hybris.platform.commercefacades.product.converters.populator.ProductBasicPopulator">
        <property name="productConfigurableChecker" ref="productConfigurableChecker"/>
    </bean>

完整的堆栈跟踪:

  org.springframework.beans.FatalBeanException: Context hybris Global Context Factory  couldn't  be created correctly due to, Error creating bean with name 'modifyPopulatorList$child#0' defined in class path resource [config/cmsfacades-cmsitems-spring.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ordermanagementOrderConverter' defined in class path resource [ordermanagementfacades-spring.xml]: Cannot resolve reference to bean 'ordermanagementOrderPopulator' while setting bean property 'populators' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ordermanagementOrderPopulator' defined in class path resource [ordermanagementfacades-spring.xml]: Cannot resolve reference to bean 'ordermanagementOrderEntryConverter' while setting bean property 'orderEntryConverter'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ordermanagementOrderEntryConverter' defined in class path resource [ordermanagementfacades-spring.xml]: Cannot resolve reference to bean 'ordermanagementOrderEntryPopulator' while setting bean property 'populators' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'warehousingOrderEntryPopulator' defined in class path resource [warehousingfacades-spring.xml]: Cannot resolve reference to bean 'ordermanagementProductConverter' while setting bean property 'productConverter'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ordermanagementProductConverter' defined in class path resource [ordermanagementfacades-spring.xml]: Cannot resolve reference to bean 'ordermanagementProductPopulator' while setting bean property 'populators' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ordermanagementProductPopulator' defined in class path resource [ordermanagementfacades-spring.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'designerConverter' of bean class [de.hybris.platform.ordermanagementfacades.product.converters.populator.OrdermanagementProductBasicPopulator]: Bean property 'designerConverter' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
        at de.hybris.platform.core.HybrisContextFactory.build(HybrisContextFactory.java:307)
        at de.hybris.platform.core.HybrisContextFactory$GlobalContextFactory.buildSelf(HybrisContextFactory.java:179)
        at de.hybris.platform.core.HybrisContextFactory$GlobalContextFactory.build(HybrisContextFactory.java:165)
        at de.hybris.platform.core.HybrisContextHolder.getGlobalInstanceCached(HybrisContextHolder.java:122)
        at de.hybris.platform.core.HybrisContextHolder.getGlobalInstance(HybrisContextHolder.java:101)
        at de.hybris.platform.core.HybrisContextHolder.getAppCtxFactory(HybrisContextHolder.java:152)
        at de.hybris.platform.core.HybrisContextHolder.getApplicationInstance(HybrisContextHolder.java:78)
        at de.hybris.platform.core.AbstractTenant.createCoreApplicationContext(AbstractTenant.java:758)
        at de.hybris.platform.core.AbstractTenant.doStartupSafe(AbstractTenant.java:799)
        ... 22 more

据我所知,所有的 getter 和 setter 都很好,我无法解决这个错误。请帮忙。

【问题讨论】:

  • 似乎加载了错误的类de.hybris.platform.ordermanagementfacades.product.converters.populator.OrdermanagementProductBasicPopulator。我假设这是您的父 bean 'defaultProductBasicPopulator' 的类。您可能需要至少发布父 bean 定义(在 hybris 内部的某个地方......)以获得更多帮助。我还认为您可能不需要 bean 定义中的 parent 属性。至少您的 Java 类继承自与 bean 定义完全不同的类(默认情况下这不是问题)。
  • 发布了父 bean 定义。你现在可以检查吗?
  • 不,bean id 'defaultProductPopulator' 属于我扩展的类。
  • 将在几分钟内完成。请发布整个异常和堆栈跟踪?
  • 异常消息的底部是否描述了问题? “bean类[de.hybris.platform.ordermanagementfacades.product.converters.populator.OrdermanagementProductBasicPopulator]的无效属性'designerConverter':Bean属性'designerConverter'不可写或具有无效的setter方法。setter的参数类型是否匹配getter 的返回类型?” OrdermanagementProductBasicPopulator 有一个名为 designerConverter 的属性,当 Spring 尝试设置它时,它是不可写的。

标签: spring dependency-injection hybris


【解决方案1】:

我无法访问 hybris 资源来查看(感谢上帝!),但我认为值得查看 Javadoc of OrdermanagementProductBasicPopulator

public void populate​(ProductModel productModel, ProductData productData) 从接口复制的描述:Populator 使用源实例中的值填充目标实例。 覆盖: 在 ProductBasicPopulator 类中填充

所以我猜,class OrdermanagementProductBasicPopulator extends ProductBasicPopulatorOrdermanagementProductBasicPopulatorbean 定义 有你的productBasicPopulator 作为父级,这意味着spring 试图注入您的 bean 定义的属性,它不是 OrdermanagementProductBasicPopulator 的继承链中的属性。

如前所述,这只是一个猜测,因为我没有看到来源...... 如果我的猜测是正确的,这取决于您的要求如何摆脱这个问题。您可以给您的 bean 一个新别名并在必要时修改填充器列表,或者您相应地覆盖 OrdermanagementProductBasicPopulator 的 bean 别名。

如果这不是问题,请发布OrdermanagementProductBasicPopulator的bean定义。

【讨论】:

  • @user15948501 如果它解决了您的问题,请您接受答案吗?如果我的假设是正确的,我很感兴趣......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2014-12-17
  • 1970-01-01
相关资源
最近更新 更多