Как экспортировать модель Sling в JSON и отобразить ее для конечного пользователя?

Предположим, у меня есть следующая модель:

@Model(adaptables = Resource.class)
public class BasicScheduleModel {
   @Self
   protected Resource resource;
   protected Envelope envelope;
   protected Status status;
   protected Metadata metadata;
   protected Data data;
   protected Messages messages;
   ........

Как я могу отобразить эту модель для конечного пользователя в виде JSON?

Я знаю, что можно преобразовать java-класс в JSON с помощью библиотеки GSON, но в этом случае я должен ввести новое поле и инициализировать его в методе @PostConstruct:

private String json;

@PostContruct
private void init() {
    this.json = new GsonBuilder().create().toJson(this);
}

private String getJson() {
    return this.json;
}

И чем использовать эту модель в html, используя визуально (нужно создать новый компонент)

<sly data-sly-use.model="com.somewebsite.models.BasicScheduleModel">
${model.json @ context='unsafe'}
</sly>

Есть ли элегантное решение без создания компонентов?


person cylinder.y    schedule 23.08.2018    source источник
comment
вам нужен этот JSON в поле зрения или в качестве конечной точки?   -  person Sharath Madappa    schedule 23.08.2018
comment
@SharathMadappa в качестве конечной точки, когда пользователь запрашивает /some/path/shcedule.json, он получит JSON-представление модели.   -  person cylinder.y    schedule 23.08.2018


Ответы (1)


Если вы используете версию 6.3+, вы можете использовать для этого функцию экспорта моделей слинга,

https://sling.apache.org/documentation/bundles/models.html#exporter-framework-since-130-1

Измените свой код на

@Model(adaptable = Resource.class, resourceType = "<resourcetype-here>") 
@Exporter(name = "jackson", extensions = "json")

Запросы к <path-to-resource>.model.json вернут модель в формате JSON. Вы можете переопределить селектор, чтобы он был чем-то другим, кроме «модели», с помощью конфигураций в аннотации Exporter.

person Sharath Madappa    schedule 23.08.2018
comment
Также я добавил конфигурацию селектора @Exporter(name = jackson, extensions = json, selector =), чтобы иметь запрос без селектора. Большое тебе спасибо - person cylinder.y; 24.08.2018
comment
@cylinder.y отсутствие селектора может привести к неожиданному поведению. AEM использует вывод json для рендеринга диалогов и т. д. отправка обработанного ответа вместо дампа ресурса/свойств нарушит такую ​​функциональность - person Sharath Madappa; 24.08.2018
comment
но эта модель используется только для представления ответа JSON, этот тип ресурса не имеет никакой конфигурации - person cylinder.y; 24.08.2018