Код Grails завершается сбоем при обновлении (работает с новым объектом) списка без соответствующих редакторов или стратегии преобразования - PullRequest
1 голос
/ 26 января 2012

У меня есть доменный объект User, который

   static hasMany = [following:User]

. Когда я создаю нового пользователя, я могу выбрать пользователей, которым я хочу следовать, в моем множественном выборе, и он работает нормально, но если я затем обновлю свой User иизменить список «следующий»: ошибки при привязке параметров с

java.lang.IllegalStateException: невозможно преобразовать значение типа [org.codehaus.groovy.grails.web.binding.ListOrderedSet] в требуемоевведите [java.util.Set] для свойства 'follow': не найдено подходящих редакторов или стратегии преобразования

в UserController.update (UserController.groovy: 76) в java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908) в java.lang.Thread.run (Thread.java:68

gspкод

<div class="clearfix ${hasErrors(bean: userInstance, field: 'following', 'error')} ">
    <label for="following">
        <g:message code="user.following.label" default="Following" />

    </label>
    <div class="input">
    <g:select name="following" from="${com.social.User.list()}" multiple="multiple"
              optionKey="id" size="5" value="${userInstance?.following*.id}" class="many-to-many" />
    </div>
</div>

Вот код контроллера для обновления:

def update() {
    def userInstance = User.get(params.id)
    if (!userInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'user.label', default: 'User'), params.id])
        redirect(action: "list")
        return
    }

    if (params.version) {
        def version = params.version.toLong()
        if (userInstance.version > version) {
            userInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'user.label', default: 'User')] as Object[],
                      "Another user has updated this User while you were editing")
            render(view: "edit", model: [userInstance: userInstance])
            return
        }
    }

    userInstance.properties = params
    // It will work if I blacklist the following param as below
    //bindData(userInstance, params, ['following'])

    if (!userInstance.save(flush: true)) {
        render(view: "edit", model: [userInstance: userInstance])
        return
    }

        flash.message = message(code: 'default.updated.message', args: [message(code: 'user.label', default: 'User'), userInstance.id])
    redirect(action: "show", id: userInstance.id)
}

В настоящее время у меня есть обходной путь

// Auto saving of following seems to fail so blacklist following param
// then set the list manually...
bindData(userInstance, params, ['following'])
userInstance.following = User.getAll(params.get("following") as List<BigInteger>)

в обновлении в пользовательском контроллерено похожеможет быть лучший способ ???

1 Ответ

0 голосов
/ 03 марта 2013

У меня была эта проблема, и в конечном итоге она была вызвана плагином json-rest-api, который не обрабатывал правильно спящие прокси, полученные из базы данных.

См. https://github.com/padcom/grails-json-rest-api/issues/14

...