Не удалось сохранить экземпляр класса домена;получение ошибки несоответствия типов - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть классы доменов:

package mnm.schedule 

class Project { 
        static hasMany = [ tasks : Tasks , users : User ] 
        String name 
        static constraints = { 
                name(nullable:false) 
                tasks(nullable:true) 
        } 
}

User.groovy

package mnm.schedule 
import org.example.*; 
class User extends SecUser { 
        //relationships. . . . 
        static belongsTo = [ company : Company, role : Role, resource : Resource] 
        static hasMany = [ holidays : Holiday, tasks : Tasks, pt:String ] 
        Profile profile 
        Project project 
        String username 
        String password 
        boolean enabled 
        List pt 
        boolean ptTaken       
} 

У меня есть файл представления, внутри которого у меня есть фрагмент кода:

<g:each in="${ans}">
                <li>${it.username.toUpperCase()}<g:checkBox name="checkedUsers" value="${ans}" checked="false" /></li>
</g:each>

Переменная ans является массивом, в котором есть объекты пользователя.Я использую g: checkBox, чтобы конечный пользователь мог «проверить» имя нужного пользователя. Когда пользователь отправляет эту форму, я выполняю это действие в своем контроллере:

def users = params.checkedUsers 
users.each { index -> 
    new Project(name:"testing",users:index).save() 

    }   

Идея состоит в том, что мне нужнодобавьте пользователя проекта (через флажок) в проект.

Но это выдает ошибку как:

2012-02-03 10:13:08,173 ["http-bio-8080"-exec-4] ERROR errors.GrailsExceptionResolver  - TypeMismatchException occurred when processing request: [POST] /scheduleNew/project/project - parameters: 
_checkedUsers: 
_checkedUsers: 
Add: Add 
checkedUsers: anto2 
Provided id of the wrong type for class mnm.schedule.User. Expected: class java.lang.Long, got class java.lang.String. Stacktrace follows: 
Message: Provided id of the wrong type for class mnm.schedule.User. Expected: class java.lang.Long, got class java.lang.String

Что происходит?Где я ошибся?

1 Ответ

1 голос
/ 03 февраля 2012

Мне кажется несколько странным (но, возможно, я не до конца понимаю, чего вы пытаетесь достичь).

Вид:

<g:each in="${ans}">
    <li>${it.username.toUpperCase()}<g:checkBox name="checkedUsers" 
       value="${it.id}" checked="false" /></li>
</g:each>

Я бы передал идентификатор, а не весь список (у вас было значение = "$ {ans})

В контроллере переданные параметры имеют тип String, поэтому вы получаете несоответствие типов. Есть несколько способов сделать это, одно решение ниже:

Контроллер:

def actionCalled = {
   def project = new Project(name:"testing")       
   def users = params.checkedUsers
   users.each { index -> 
      def user = User.findById(index.toLong())
      project.addToUsers(user)
   }   
   project.save()
}

Я уверен, что вы можете еще больше упростить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...