2017-08-07 54 views
1

我一直在玩這個遊戲一段時間了,我想我幾乎已經破解了它,但我仍然不完全滿意我的解決方案。AEM/Sling中的自定義JSON渲染器

所以,我想要做的是,有一段內容,一個項目列表,它有兩個視圖:標準的HTML視圖,所以人們可以查看和編輯它;然後爲其他服務使用JSON端點。

首先,我認爲這是創建兩個JSP腳本來呈現內容的簡單的事情:

  • /apps/my-stuff/components/list-page/html.jsp
  • /應用/我-stuff /組件/列表頁/ json.jsp

但是Apache的吊索DefaultServlet似乎是相當無知的json.jsp腳本。

作爲第二次嘗試,我創建了另一個腳本,它將在/apps/foundation/components/primary/cq/Page/json.jsp中實際調用,並呈現該頁面,如我所料。但是有一些關於這方面的擔心/問題:

  • 首先,爲什麼這被系統所尊重,而不是更具體的地方呢?
  • 的文檔狀態,即以找到適當的渲染器,第一sling:resourceType將被檢查,然後sling:resourceSuperType然後,僅作爲後備將jcr:PrimaryType檢查。不過,我認爲這是:jcr:PrimaryType,然後DefaultServlet,然後所有其他的事情。
  • 然而,最令人擔憂的是,我不得不承認,這是相當普遍的,所以它會打破jcr:PrmaryType = Page的所有contnet,所以可能會有一些副作用。

解決方案可能會創建一個新類型:ListPage extends Page;然後在/apps/foundation...中爲此創建一個渲染器。不過,我有這種不好的感覺,這可能會引入其他問題。

所以我的問題是雙重的:什麼是這樣做的正確方法,和/或那我從URL的方式缺失 - >腳本分辨率在AEM /吊索工作。 (因爲它似乎是略有不同的是描述herehere

(很明顯,我想保持默認的JSON渲染爲其他頁面,因爲這可能需要在頁面其他的事情。我甚至不當然,改變這一頁不會破壞這個特定頁面的UI ...)

回答

0

但是,Apache Sling DefaultServlet似乎對json.jsp腳本相當無知。

你有沒有嘗試過像這樣重命名你的JSP:「list-page.json.jsp」?

如果您使用AEM 6.3,您應該查看Sling model Exporters。它們允許你自動註冊一個servlet到你的Sling模型(你可以創建這個模型來建立你的列表內容)。該servlet可以爲您使用Jackson生成模型的JSON表示。

如果您不使用AEM 6.3,我建議您創建一個針對您的資源類型註冊的servlet並使用其他選擇器。

@SlingServlet(
    selectors = "json", 
    resourceType = "my-stuff/components/list-page", 
    methods = "GET") 

上吊帶servlet的更多信息,可以發現here