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
相关产品推荐
相关产品推荐

