У меня есть доменный объект 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>)
в обновлении в пользовательском контроллерено похожеможет быть лучший способ ???