Dxa — Расширенная Модель Ключевых Слов С Метаданными Завершается Сбоем, Когда Метаданные Пусты

  • Автор темы Воло9я
  • Обновлено
  • 20, Oct 2024
  • #1

Это схема метаданных, которую мы связали с ключевым словом.

 
 
 @Data
@SemanticEntity(entityName = "Hotel", vocabulary = SDL_CORE)
public class Hotel extends AbstractEntityModel {

//General

private Text text;

private ContactInfo contactInfo;

//Metadata

@SemanticProperty("tripadvisor")

private String tripAdvisorCode;

private HotelKeyword name;

private Tag brand;

private Tag city;

private Tag state;
}
 

"имя": {

"$type": "KeywordModelData",

Error: java.lang.IllegalArgumentException: Can not set com.dxa.modules.entities.hotel.HotelKeyword field com.dxa.modules.entities.hotel.Hotel.name to com.sdl.webapp.common.api.model.KeywordModel at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) at java.lang.reflect.Field.set(Field.java:764) at com.sdl.webapp.common.impl.mapping.SemanticMapperImpl$1.doWith(SemanticMapperImpl.java:144) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:693) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:673) at com.sdl.webapp.common.impl.mapping.SemanticMapperImpl.createEntity(SemanticMapperImpl.java:105) at com.sdl.dxa.tridion.mapping.impl.DefaultModelBuilder.createViewModel(DefaultModelBuilder.java:157) at com.sdl.dxa.tridion.mapping.impl.DefaultModelBuilder.buildEntityModel(DefaultModelBuilder.java:123) at com.sdl.dxa.tridion.mapping.impl.ModelBuilderPipelineImpl.createEntityModel(ModelBuilderPipelineImpl.java:86) at com.dxa.modules.entities.EntityLoader.loadEntityModel(EntityLoader.java:64) at com.dxa.modules.entities.EntityLoader.loadPageModelEntity(EntityLoader.java:59) at com.dxa.modules.entities.AnotherEntitiesIT.should_load_hotel_from_static_page(AnotherEntitiesIT.java:34) 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.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 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 org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 13:20:04.714 [Thread-1] INFO o.s.w.c.s.GenericWebApplicationContext - Closing org.springframework.web.context.support.GenericWebApplicationContext@482cd91f: startup date [Fri Jul 13 13:19:40 CEST 2018]; root of context hierarchy

"Идентификатор": "5228",

@Data @SemanticEntity(entityName = "HotelMeta", vocabulary = SDL_CORE) public class HotelKeyword extends KeywordModel { @JsonIgnore private List<KeywordModel> nearbyHotels; }

«Описание»: «Отель F»,

Воло9я


Рег
19 Feb, 2011

Тем
71

Постов
178

Баллов
553
  • 26, Oct 2024
  • #2

Исключение происходит в строке 144 этого файла: https://github.com/sdl/dxa-web-application-java/blob/release/2.0/dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/impl/mapping/SemanticMapperImpl.java

Я пытаюсь разобраться в сообщении об исключении, но не понимаю его. Судя по всему, он пытается установить поле с именем KeywordModel , which your View Model Type ( HotelKeyword ) не имеет. Не уверен, почему он считает, что следует установить это свойство. И что такое тип KeywordModel ?

Обратите внимание, что происходит вывод трассировки (например, строка 137). Может быть, файл журнала с уровнем журнала TRACE может пролить свет?

ОБНОВЛЯТЬ

После предоставления дополнительной информации сообщение об исключении приобретает для меня смысл: в нем просто говорится, что невозможно установить Hotel.name property to an object of type Hotel.name , что имеет смысл, поскольку свойство более строго типизировано (оно имеет тип KeywordModel ).

Я предполагаю, что это происходит в этом сценарии, потому что в модели данных R2 нет идентификатора схемы, поэтому он не может использовать семантическое сопоставление для определения конкретного типа модели представления для использования и, следовательно, создает экземпляр общего HotelKeyword .

Это действительно дефектно, поскольку оно могло/должно было определить тип модели представления из вашего KeywordModel property type.

Эта проблема возникает в целом или только для динамически расширяемых моделей ключевых слов?

В качестве обходного пути можно ли сделать Hotel.name property more loosely typed (let its type be com.dxa.entities.hotel.Hotel ), чтобы вы не попали в это исключение. Если все в порядке, он все равно создаст экземпляр HotelKeyword in case a Schema ID (and metadata) is present. In case it is not present, you won't have any additional metadata to map anyways, so a generic name должно быть достаточно.

 

Sadkov


Рег
22 May, 2008

Тем
87

Постов
212

Баллов
707
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно