Отображать ошибки из службы - PullRequest
0 голосов
/ 30 октября 2009

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

В этом случае, я думаю, контроллер и, следовательно, 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
    }

}

1 Ответ

0 голосов
/ 30 октября 2009

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

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

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

...