Ошибка при добавлении нового значения в моем динамическом перечислении через код - PullRequest
0 голосов
/ 09 января 2019

У меня есть динамическое перечисление, ManufacturerName. Я должен сделать возможным добавить новое значение (нового производителя). Я пробовал это, но выдает ошибку.

 public void createNewManufacturerEnum(final String code, final String name)
{
    try
    {
        final HybrisEnumValue manufacturer =ManufacturerName.valueOf(code);     
        enumerationService.setEnumerationName(manufacturer, name, Locale.GERMAN);
        enumerationService.setEnumerationName(manufacturer, name, Locale.ENGLISH);
...

Ошибка:

Caused by: de.hybris.platform.servicelayer.exceptions.ModelSavingException: [com.cancom.core.manufacturer.CCManufNameInterceptor@907afc5]: unexpected validator error: missing persistent item for enum value 0000505008
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.invokeValidateInterceptors(ModelWrapper.java:311) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.validate(ModelWrapper.java:239) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.extractor.impl.DefaultModelExtractor.process(DefaultModelExtractor.java:58) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.performPersistenceOperations(DefaultModelService.java:711) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAllInternal(DefaultModelService.java:706) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAll(DefaultModelService.java:686) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAll(DefaultModelService.java:648) ~[coreserver.jar:?]
    at com.hybris.backoffice.cockpitng.dataaccess.facades.object.DefaultPlatformObjectFacadeStrategy.save(DefaultPlatformObjectFacadeStrategy.java:137) ~[classes/:?]
    ... 92 more
Caused by: java.lang.IllegalStateException: missing persistent item for enum value 0000505008
    at de.hybris.platform.servicelayer.internal.converter.impl.EnumValueModelConverter.getSource(EnumValueModelConverter.java:154) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.getSource(DefaultModelService.java:431) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.type.impl.DefaultTypeService.getEnumerationValue(DefaultTypeService.java:330) ~[coreserver.jar:?]
    at de.hybris.platform.enumeration.impl.DefaultEnumerationService.setEnumerationName(DefaultEnumerationService.java:180) ~[coreserver.jar:?]
    at com.cancom.core.manufacturer.dao.impl.CCManufNameDaoImpl.createNewManufacturerEnum(CCManufNameDaoImpl.java:73) ~[classes/:?]
    at com.cancom.core.manufacturer.services.impl.CCManufNameServiceImpl.createNewEnum(CCManufNameServiceImpl.java:37) ~[classes/:?]
    at com.cancom.core.manufacturer.CCManufNameInterceptor.onValidate(CCManufNameInterceptor.java:66) ~[classes/:?]
    at com.cancom.core.manufacturer.CCManufNameInterceptor.onValidate(CCManufNameInterceptor.java:1) ~[classes/:?]
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.invokeValidateInterceptors(ModelWrapper.java:291) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.validate(ModelWrapper.java:239) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.extractor.impl.DefaultModelExtractor.process(DefaultModelExtractor.java:58) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.performPersistenceOperations(DefaultModelService.java:711) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAllInternal(DefaultModelService.java:706) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAll(DefaultModelService.java:686) ~[coreserver.jar:?]
    at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAll(DefaultModelService.java:648) ~[coreserver.jar:?]
    at com.hybris.backoffice.cockpitng.dataaccess.facades.object.DefaultPlatformObjectFacadeStrategy.save(DefaultPlatformObjectFacadeStrategy.java:137) ~[classes/:?]
    ... 92 more

Что я делаю не так? Спасибо!

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Вы найдете решение. Вот пример из гибриса. Обратите внимание, что вам не нужно сохранять после вызова setEnumerationName. Он уже содержит вызов modelService.save.

Это копирование / вставка из теста от SAP hybris, представленного в EnumerationServiceDemoTest

private EnumerationValueModel testEVModel;
//Create the new enum value
testEVModel = modelService.create(OrderStatus.CREATED.getType());
modelService.save(testEVModel);

//find the enumeration for given type and code
final HybrisEnumValue matchingEnumeration = enumerationService.getEnumerationValue([your enumerationCode],
            [your valueCode]);

//setEnumerationName for the given Enum
enumerationService.setEnumerationName(matchingEnumeration, "testName");

//get the name and check if correct
String enumName = enumerationService.getEnumerationName(matchingEnumeration);
assertEquals("testName", enumName);

//setEnumerationName for the given Enum again with german language and check it
enumerationService.setEnumerationName(matchingEnumeration, "neuer_name", Locale.GERMAN);

enumName = enumerationService.getEnumerationName(matchingEnumeration, Locale.GERMAN);
assertEquals("neuer_name", enumName);
0 голосов
/ 10 января 2019

Я попробовал это, и кажется, что это работает.

try
    {
        final HybrisEnumValue manufacturer = ManufacturerName.valueOf(code);
        modelService.save(manufacturer);
        enumerationService.setEnumerationName(manufacturer, name, Locale.GERMAN);
        enumerationService.setEnumerationName(manufacturer, name, Locale.ENGLISH);
    }
0 голосов
/ 10 января 2019

Пример для динамического перечисления OOTB de.hybris.platform.basecommerce.enums.StockLevelStatus.

final EnumerationValueModel newStockLevelStatus = modelService.create(StockLevelStatus._TYPECODE);
newStockLevelStatus.setCode("OVERRUN");
newStockLevelStatus.setName("Overrun");
modelService.save(newStockLevelStatus);
0 голосов
/ 09 января 2019

Попробуйте запустить обновление с активированной опцией «Обновление работающей системы».

...