2017-08-12 99 views
0

好吧我已經嘗試了一切我知道自定義呈現與JSON視圖的一對多關聯,並失敗慘敗。Grails 3 JSON視圖自定義渲染一對多關聯

這裏是我的機票域的一部分,看起來像(全好這裏)...

class TttTicket { 

    String title 
    String number 
    String description 
    TttUser assignee 
    String priority 
    String status 
    TttUser creator 


    Date dateCreated 
    Date lastUpdated 

    static mappedBy = [subscribers : 'none', creator:'none'] 

    static belongsTo = [project:TttProject, creator:TttUser] 
    static hasMany = [subscribers: TttUser] 

... blar blar 
} 

這裏是我的相關GSON呈現模板...

import ttt_api_server.TttTicket 

model { 
    TttTicket tttTicket 
} 

json g.render(tttTicket, [excludes:['creator','subscribers','project']]){ 
    creator { 
     id tttTicket.creator.id 
     name tttTicket.creator.name 
     email tttTicket.creator.email 
    } 

    project{ 
     id tttTicket.project.id 
     name tttTicket.project.name 
    } 
} 

...這是工作很好,迄今。我想現在限制每個用戶的屬性輸出。

如何旋轉這些?例如...

import ttt_api_server.TttTicket 

model { 
    TttTicket tttTicket 
} 

json g.render(tttTicket, [excludes:['creator','subscribers','project']]){ 
    creator { 
     id tttTicket.creator.id 
     name tttTicket.creator.name 
     email tttTicket.creator.email 
    } 
    subscibers g.render(){ 
     tttTicket.subscribers.each {sub -> 
      return { 
       name sub.name 
      } 
     } 
    } 
    project{ 
     id tttTicket.project.id 
     name tttTicket.project.name 
    } 
} 

這似乎沒有記錄在任何地方。我想控制這個級別的每個用戶的JSON輸出。不在域級別,因爲根據我的JSON要求,我可能需要更改屬性輸出。

請幫助:-(

+0

順便說一句 - 我已經建立了一個臨時解決方案,其中只包括我需要在訂戶類上通過它的gson的屬性,但這不是渴望d效果。我希望能夠在直接對訂閱者進行其他調用時保留所有屬性,但在對具有多個訂閱者的票據進行休息調用時限制屬性 – AndyRED

回答

1

如果我理解正確此,當你做機票REST調用,你想那是的hasMany關係來顯示指定的屬性裏面的域對象(在這種情況下,它的用戶)。但是當你直接在用戶打電話,你想所有屬性

可以先創建地圖,然後根據所創建的地圖上渲染的對象(看看this) 你的情況。:

import ttt_api_server.TttTicket 

model { 
    TttTicket tttTicket 
} 

json g.render(tttTicket, [excludes:['creator','subscribers','project']]){ 
    creator { 
     id tttTicket.creator.id 
     name tttTicket.creator.name 
     email tttTicket.creator.email 
    } 

    def s = tttTicket.subsribers.collect { 
     [ 
      id: it.id, 
      name: it.name 
     ] 
    } 

    subscribers s //this part is doing the rendering 

    project{ 
     id tttTicket.project.id 
     name tttTicket.project.name 
    } 
} 
0

如果這是你想要的,只要它呈現爲JSON要呈現此對象的方式,我建議實施ObjectMarshaller<JSON>

class TttTicketMarshaller implements ObjectMarshaller<JSON> { 

    @Override 
    boolean supports(Object object) { 
    return object instanceof TttTicket 
    } 

    @Override 
    void marshalObject(Object object, JSON converter) throws ConverterException { 
    TttTicket ticket = (TttTicket)object 

    def jsonWriter = converter.writer 
    jsonWriter.object() 
    jsonWriter.key("title") 
    jsonWriter.value(ticket.title) 

    //other fields 

    jsonWriter.key("creator") 
    jsonWriter.object() 
    jsonWriter.key("id") 
    jsonWriter.value(ticket.creator.id) 

    //other creator fields 
    jsonWriter.endObject() 
    } 
} 

我不是100%肯定的object()endObject()功能,但看起來是正確的用法。

一旦你有了這個,你BootStrap.groovy註冊這樣的:在地方

def init = { servletContext -> 
    JSON.registerObjectMarshaller(new TttTicketMarshaller()) 
} 

有了這一切,你可以簡單地使用

render myTicket as JSON 

所界定返回對象的JSON表示你的編組