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!
4 Réponses :
Essayez d'exécuter une mise à jour avec l'option "Mettre à jour le système en cours d'exécution" activée.
Je sais faire URS juste par hac. Est-ce une autre façon de faire cela?
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);
}
La dernière sauvegarde est inutile, vérifiez ma réponse pour plus de détails.
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);
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);