2016-09-20 2 views
0

Учитывая настройку конечной точки REST, которая сохраняет пользователя, например, можно использовать validate() Command Object для получения конкретных кодов ошибок HTTP, которые могут быть просто возвращены Контроллер для обработки ответа?Возвращает конкретный код ошибки HTTP от Grails. Проверка объекта объекта

Я хочу, чтобы избежать ситуации, когда действие контроллера должно обрабатывать множество блоков if, чтобы проверить конкретное сообщение об ошибке, и выполнить поиск/преобразование его в код ошибки HTTP.

Например, я хотел бы, чтобы пользовательский валидатор каким-то образом сообщил контроллеру вернуть 404, если ему не удалось найти соответствующего пользователя в базе данных.

Ниже не то, что я пробовал. Вместо этого это всего лишь доказательство концепции идеальной структуры, которую я хотел бы использовать для проверки параметров REST. Возможно, это совершенно неправильно или что есть лучший подход. Если есть, это было бы также приветствоваться.

например:

User.groovy

... 
class User { 
    String username 

    static constraints = { 
     username unique:true 
    } 
} 

UserController.groovy

... 
class UserController extends RestfulController { 
    def update(UserCommand userCmd) { 
     /* 
     * Not actually working code, but proof of concept of what 
     * I'm trying to achieve 
     */ 
     render status: userCmd.validate() 
    } 

    class UserCommand { 
     Long id 
     String username 

     static constraints = { 
      importFrom User 

      /* 
      * I also get that you can't return Error codes via the 
      * custom validator, but also just to illustrate what I'm 
      * trying to achieve 
      */ 
      id validator: { 
       User user = User.get(id) 
       if(user == null) { 
        return 404 
       } 
      } 
     } 
    } 
} 

ответ

1

Так что ваш пример не делает много смысла. Если вы сохраняете пользователя, и его нельзя найти, это хорошо, нет? И если вы обновляете пользователя, вы, вероятно, вызываете в своем контроллере действие update().

Тем не менее, в то время как это кажется хорошей идеей, так как он не будет работать, я хотел бы предложить что-то более похожее на следующее:

class UserController { 

    def edit() { 
     withUser { user -> 
      [user:user] 
     } 
    } 

    private def withUser(id="id", Closure c) { 
     def user = User.get(params[id]) 
     if(user) { 
      c.call user 
     } else { 
      flash.message = "The user was not found." 
      response.sendError 404 
     } 
    } 
} 

Вы можете настроить, что иметь дело с объектом команды, но Я думаю, что это дает общее представление о том, чтобы быть более DRY.

+1

Спасибо, я имел в виду обновление. Это выглядит многообещающим –

+0

Не могли бы вы объяснить или указать мне некоторые документы, объясняющие параметр id id id в '' withUser'? Я понятия не имею, чего я боюсь. –

+1

Это просто переменная, которую вы можете переопределить. Поэтому, если вы хотите искать объект по другому параметру, вы передаете это как идентификатор вместо стандартного «id». – Gregg

0

Может быть, вы должны попытаться возвращения 404, а затем фактическая ошибка, что вы разбираете и сделать что-то еще с

У вас не будет большого количества кодов ошибок для игры с i п первый экземпляр (that will make proper sense and actually valid)

if (userCmd.validate()) { 
    def error=userCmd.errors.allErrors.collect{g.message(error : it)} 
    render status:404,text: error 
    return 
} 
//otherwise 
render status:201, text: 'something' 

вы также можете сделать

response.status=404 
render "Some content" 
Смежные вопросы