1
votes

Erreur en ajoutant une nouvelle valeur dans mon énumération dynamique via le code

J'ai une énumération dynamique, ManufacturerName, je dois rendre possible l'ajout d'une nouvelle valeur (un nouveau fabricant). J'ai essayé mais cela génère une erreur.

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

L'erreur est:

 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);
...

Qu'est-ce que je fais mal? Merci!


0 commentaires

4 Réponses :


0
votes

Essayez d'exécuter une mise à jour avec l'option "Mettre à jour le système en cours d'exécution" activée.


1 commentaires

Je sais faire URS juste par hac. Est-ce une autre façon de faire cela?



1
votes

J'ai essayé ceci et il semble que cela fonctionne.

try
    {
        final HybrisEnumValue manufacturer = ManufacturerName.valueOf(code);
        modelService.save(manufacturer);
        enumerationService.setEnumerationName(manufacturer, name, Locale.GERMAN);
        enumerationService.setEnumerationName(manufacturer, name, Locale.ENGLISH);
    }


1 commentaires

La dernière sauvegarde est inutile, vérifiez ma réponse pour plus de détails.



1
votes

L'exemple fourni pour l'énumération dynamique OOTB de.hybris.platform.basecommerce.enums.StockLevelStatus.

final EnumerationValueModel newStockLevelStatus = modelService.create(StockLevelStatus._TYPECODE);
newStockLevelStatus.setCode("OVERRUN");
newStockLevelStatus.setName("Overrun");
modelService.save(newStockLevelStatus);


0 commentaires

1
votes

Vous trouvez une solution. Voici l'exemple d'hybris. Notez que vous n'avez pas besoin d'enregistrer après avoir appelé setEnumerationName . Il contient déjà un appel à modelService.save .

Il s'agit d'un copier / coller d'un test de SAP hybris présenté dans 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 commentaires