2014-01-11 98 views
4

我想使用重載的方法在Grails 2.3.4中的控制器中追加XML。Grails控制器操作不能超載

我在我的ReportController中有以下重載的方法。

String makePhotoXml(StringBuilder sb, Report r, String url, String desc) { 

    sb.append("<photo>") 
    sb.append(Utilities.makeElementCdata("url", url)) 
    sb.append(Utilities.makeElementCdata("caseId", r.caseId)) 
    sb.append(Utilities.makeElementCdata("type", r.type)) 
    sb.append(Utilities.makeElementCdata("date", r.dateCreated.format('MM/dd/yy'))) 
    sb.append(Utilities.makeElementCdata("address", r.address)) 
    sb.append("<extra>extra</extra>") 
    sb.append(Utilities.makeElementCdata("description", desc)) 
    sb.append("</photo>") 
} 

String makePhotoXml(List<Report> reports) { 
    StringBuilder sb = new StringBuilder() 
    sb.append("<photos>") 
    sb.append("<title>Photos</title>") 
    for (Report r : reports) { 
     for (Photo photo : r.photos) { 
      makePhotoXml(sb, r, photo.url(), photo.description) 
     } 
     for (Document doc : r.photoDocuments) { 
      makePhotoXml(sb, r, doc.url(-1), doc.getDescription()) 
     } 
    } 
    sb.append("</photos>") 
} 

當運行我得到這個編譯器錯誤的應用程序:

| Error Compilation error: startup failed: 
/Users/Anthony/GrailsApps/AppOrderWeb/grails-app/controllers/com/apporder/ReportController.groovy: 1360: Controller actions may not be overloaded. The [makePhotoXml] action has been overloaded in [com.apporder.ReportController]. @ line 1360, column 5. 
     String makePhotoXml(StringBuilder sb, Report r, String url, String desc) { 

我認爲Groovy和Grails的支持方法重載。關於如何解決這個問題並使這個重載方法有效的任何想法?

回答

6

Groovy一般確實允許方法重載,但Grails禁止它用於控制器操作的特定情況。如果你想在你的控制器中使用實用方法,你需要使它們成爲privateprotected,所以Grails不會嘗試將它們視爲Web可見操作。

或者,將更多的Grails-y移動輔助方法到一個服務,而不是在控制器中。

+1

是的,使輔助方法非公開,因爲它們不能從課堂外調用。錯誤消息的技術原因是,帶有args的操作方法通過AST被重寫爲被調用來處理請求的無參數方法,並且在對參數進行數據綁定之後調用您的「真實」方法。如果有兩種方法,哪一種可以模糊。 –