2009-10-29 3 views
0

Я вызываю службу, которая создает родительскую и дочернюю записи. Если произошла ошибка, служба выдает исключение RuntimeException. RuntimeExceptionis пойман контроллером, а затем есть перенаправление обратно в gsp. Но ошибка не отображается.Render Errors from A Service

В этом случае, я думаю, контроллер и, следовательно, gsp на самом деле ничего не знают об объектах, поскольку все делается в службе. Итак, как мне сделать ошибки?

Простой ввод данных GSP

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Sample title</title> 
    </head> 
    <body> 
    <h1>Add A Record</h1> 

<g:hasErrors bean="${parent}"> 
    <div class="errors"> 
     <g:renderErrors bean="${parent}" as="list" /> 
    </div> 
</g:hasErrors> 
<g:hasErrors bean="${child}"> 
    <div class="errors"> 
     <g:renderErrors bean="${child}" as="list" /> 
    </div> 
</g:hasErrors> 
    <g:form action="add" name="doAdd"> 
    <table> 
     <tr> 
     <td> 
      Parent Name 
     </td> 
     <td> 
      Child Name 
     </td> 
     </tr> 
     <tr> 
     <td> 
     <g:textField name="parentName" /> 
     </td> 
     <td> 
     <g:textField name="childName" /> 
     </td> 
     </tr> 
     <tr><td><g:submitButton name="update" value="Update" /></td></tr> 
    </table> 
    </g:form> 
</body> 
</html> 

Контроллер

class AddrecordController { 

    def addRecordsService 

    def index = { 
     redirect action:"show", params:params 
    } 

    def add = { 
     println "do add" 


     try { 
      addRecordsService.addAll(params) 
     } catch (java.lang.RuntimeException re){ 
      println re.message 
      flash.message = re.message 
     } 
     redirect action:"show", params:params 

    } 

    def show = {} 

} 

Сервис

class AddRecordsService { 

    static transactional = true 



    def addAll(params) { 
     def Parent theParent = addParent(params.parentName) 
     def Child theChild = addChild(params.childName,theParent) 
    } 

    def addParent(pName) { 
     def theParent = new Parent(name:pName) 
     if(!theParent.save()){ 
      throw new RuntimeException('unable to save parent') 
     } 

     return theParent 
    } 

    def addChild(cName,Parent theParent) { 
     def theChild = new Child(name:cName,parent:theParent) 

     if(!theChild.save()){ 
      throw new RuntimeException('unable to save child') 
     } 
     return theChild 
    } 

} 

ответ

0

Вы пе ed, чтобы каким-то образом получить ссылку на недопустимый объект и передать его в представление через модель, поэтому я бы расширил RuntimeException и добавил поля, чтобы содержать объекты с ошибками проверки, например.

}catch(MyCustomException m){ 
render view:'show', model:[parent:m.getParent(), child:m.getChild()] 
} 

целом Это упражнение может быть проще, используя Parent.withTransaction вместо автоматического отката через RuntimeExceptions. Затем вы можете вручную отменить транзакцию, если есть ошибки проверки и просто вернуть объекты, а не содержать их в исключении.