You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hybris集成测试报错:无法找到addressLine1Attribute Spring Bean

Hybris集成测试保存关联Address的UserModel时抛出异常

我是Hybris新手,在为自定义服务编写集成测试时遇到问题。我在现有UserService中新增了getUsersWithoutAddresses()方法,编写集成测试模拟该功能时,保存关联Address的UserModel抛出异常。

测试代码

@IntegrationTest
public class TrainingUserServiceImplIntegrationTest extends ServicelayerTransactionalTest {

    @Resource
    private TrainingUserService trainingUserService;

    @Resource
    private ModelService modelService;

    @Resource
    private UserService userService;

    @Before
    public void setUp()  {
    }

    @Test
    public void getUsersWithoutAddressesTest(){
        UserModel userWithoutAddress = new UserModel();
        userWithoutAddress.setUid("testUser1");

        UserModel userWithAddress = new UserModel();
        userWithAddress.setUid("testUser2");
        userWithAddress.setName("testUsername2");

        AddressModel addressModel = new AddressModel();
        addressModel.setOwner(userWithAddress);
        addressModel.setLine1("some test address");
        userWithAddress.setAddresses(Arrays.asList(addressModel));

        modelService.save(userWithAddress);
        modelService.save(userWithoutAddress);

        assertTrue(trainingUserService.getUsersWithoutAddresses().contains(userWithoutAddress));
        assertFalse(trainingUserService.getUsersWithoutAddresses().contains(userWithAddress));


    }
}

报错信息

de.hybris.platform.servicelayer.exceptions.ModelSavingException: cannot find spring bean [addressLine1Attribute] configured for dynamic attribute [Address.line1] from extension [basecommerce]

    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAll(DefaultModelService.java:704)
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.save(DefaultModelService.java:643)
    at com.epam.training.service.impl.TrainingUserServiceImplIntegrationTest.getUsersWithoutAddressesTest(TrainingUserServiceImplIntegrationTest.java:56)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at de.hybris.platform.testframework.HybrisJUnit4ClassRunner$TenantActivationNotAllowedRunBefores.evaluate(HybrisJUnit4ClassRunner.java:163)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at de.hybris.platform.testframework.HybrisJUnit4ClassRunner.superRun(HybrisJUnit4ClassRunner.java:116)
    at de.hybris.platform.testframework.HybrisTestClassRunnerLogic.run(HybrisTestClassRunnerLogic.java:106)
    at de.hybris.platform.testframework.HybrisJUnit4ClassRunner.run(HybrisJUnit4ClassRunner.java:67)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnitStarter.java:235)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
    at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: de.hybris.platform.servicelayer.exceptions.SystemException: cannot find spring bean [addressLine1Attribute] configured for dynamic attribute [Address.line1] from extension [basecommerce]
    at de.hybris.platform.servicelayer.internal.converter.impl.ItemModelConverter.assembleMetaInfo(ItemModelConverter.java:1582)
    at de.hybris.platform.servicelayer.internal.converter.impl.ItemModelConverter.getTypeMetaInfo(ItemModelConverter.java:378)
    at de.hybris.platform.servicelayer.internal.converter.impl.ItemModelConverter.isConfiguredForLegacyPersistence(ItemModelConverter.java:415)
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.isModelConverterConfiguredForLegacyPersistence(ModelWrapper.java:93)
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.determineIfConfigureForLegacyPersistence(ModelWrapper.java:80)
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.<init>(ModelWrapper.java:73)
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.WrapperRegistry.createWrapper(WrapperRegistry.java:45)
    at de.hybris.platform.servicelayer.internal.model.extractor.impl.CascadingModelWalker.processChildren(CascadingModelWalker.java:141)
    at de.hybris.platform.servicelayer.internal.model.extractor.impl.CascadingModelWalker.processUnlocalizedAttributes(CascadingModelWalker.java:126)
    at de.hybris.platform.servicelayer.internal.model.extractor.impl.CascadingModelWalker.walkThrough(CascadingModelWalker.java:70)
    at de.hybris.platform.servicelayer.internal.model.extractor.impl.DefaultCascader.getNewModels(DefaultCascader.java:43)
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.getModelsToCreate(ModelWrapper.java:148)
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.executeInterceptorsAndCascade(ModelWrapper.java:119)
    at de.hybris.platform.servicelayer.internal.model.extractor.impl.DefaultModelExtractor.process(DefaultModelExtractor.java:44)
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.performPersistenceOperations(DefaultModelService.java:720)
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAllInternal(DefaultModelService.java:715)
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAll(DefaultModelService.java:695)
    ... 32 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'addressLine1Attribute' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1218)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:275)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1086)
    at de.hybris.platform.servicelayer.internal.converter.impl.ItemModelConverter.assembleMetaInfo(ItemModelConverter.java:1562)
    ... 48 more

解决方案

原因分析

报错核心是找不到addressLine1Attribute这个Spring Bean,Address的line1是basecommerce扩展中的动态属性,需要依赖对应的Spring配置。直接new AddressModel()的方式没有让Hybris容器正确初始化模型的元数据和关联Bean,导致动态属性无法找到对应的Bean定义。

修复步骤

  • 用ModelService创建模型实例:不要直接new模型对象,改用modelService.create()方法,让Hybris容器完成模型的初始化,注入所需的元数据和依赖Bean:
    UserModel userWithoutAddress = modelService.create(UserModel.class);
    UserModel userWithAddress = modelService.create(UserModel.class);
    AddressModel addressModel = modelService.create(AddressModel.class);
    
  • 检查扩展依赖:确保测试类所在扩展的extensioninfo.xml中已声明依赖basecommerce扩展,保证测试运行时加载对应的Spring配置:
    <requires-extension name="basecommerce"/>
    

修复后的测试代码示例

@IntegrationTest
public class TrainingUserServiceImplIntegrationTest extends ServicelayerTransactionalTest {

    @Resource
    private TrainingUserService trainingUserService;

    @Resource
    private ModelService modelService;

    @Resource
    private UserService userService;

    @Before
    public void setUp()  {
    }

    @Test
    public void getUsersWithoutAddressesTest(){
        // 使用modelService创建模型实例
        UserModel userWithoutAddress = modelService.create(UserModel.class);
        userWithoutAddress.setUid("testUser1");

        UserModel userWithAddress = modelService.create(UserModel.class);
        userWithAddress.setUid("testUser2");
        userWithAddress.setName("testUsername2");

        AddressModel addressModel = modelService.create(AddressModel.class);
        addressModel.setOwner(userWithAddress);
        addressModel.setLine1("some test address");
        userWithAddress.setAddresses(Arrays.asList(addressModel));

        modelService.save(userWithAddress);
        modelService.save(userWithoutAddress);

        assertTrue(trainingUserService.getUsersWithoutAddresses().contains(userWithoutAddress));
        assertFalse(trainingUserService.getUsersWithoutAddresses().contains(userWithAddress));
    }
}

内容的提问来源于stack exchange,提问作者Pertsh Galstyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:56:08