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