Домен Grails get(params.id) работает в Controller.show(), но не в Contoller.edit()

Итак, вот интересное. У меня есть приложение Grails 2.1.1 с прямыми доменами и контроллером с скаффолдингом по умолчанию. Мой метод show() работает, просто находит и извлекает объект домена с помощью def quarterEndAdjustmentInstance = QuarterEndAdjustment.get(params.id) Однако, когда я вызываю метод edit(), я получаю java.lang.IllegalArgumentException - argument type mismatch при точно таком же вызове def quarterEndAdjustmentInstance = QuarterEndAdjustment.findByID(params.id) Я подтвердил, что карта параметров передается в идентификаторе, и я пробовал все варианты get(id), get(params), findByID(id), findByID(params) yadayadayada

Вот форма отправки в show.gsp, которая вызывает метод редактирования в контроллере:

    <g:form>
        <fieldset class="buttons">
            <g:hiddenField name="id" value="${quarterEndAdjustmentInstance.id}" />
            <g:link class="edit" action="edit" id="${quarterEndAdjustmentInstance.id}"><g:message code="default.button.edit.label" default="Edit" /></g:link> 
            <%-- <g:actionSubmit class="edit" action="edit" value="${message(code: 'default.button.edit.label', default: 'Edit')}"  /> --%>
        </fieldset>
    </g:form>

Вот два замыкания из моего контроллера. show() работает нормально, edit() выдает исключение.

 def show() 
{   
    //params.each() { key, value -> println "${key} = ${value}" };
    def quarterEndAdjustmentInstance = QuarterEndAdjustment.get(params.id) //here are your inbound params
    if(!quarterEndAdjustmentInstance)
    {
        flash.message = "Quarter End Metric record not found with ${params}"
        redirect(action:"list", params: params)
    }
    else
    {
        quarterEndAdjustmentInstance.setFrName(mriUtils.getCompRecipient(quarterEndAdjustmentInstance.getCompPayeeID()))
        return [quarterEndAdjustmentInstance: quarterEndAdjustmentInstance]
    }
}

def edit() 
{
    def quarterEndAdjustmentInstance = QuarterEndAdjustment.get(params.id)

    if(!quarterEndAdjustmentInstance)
    {
        flash.message = "Quarter End M12 Adjustment not found with ${params}"
        redirect(action:"list", params:params)
    }
    else
    {
        quarterEndAdjustmentInstance.setFrName(mriUtils.getCompRecipient(quarterEndAdjustmentInstance.getCompPayeeID()))
        return [quarterEndAdjustmentInstance: quarterEndAdjustmentInstance]
    }   
}

person john_solo    schedule 26.04.2013    source источник
comment
Чтобы помочь тем, кто может ответить, всегда добавляйте фрагменты кода, в котором есть проблемы. Пожалуйста, опубликуйте код из контроллера, который вызывает проблему. И код, который работает.   -  person Sudhir N    schedule 28.04.2013


Ответы (1)


По умолчанию Grails создает атрибут Long для вашего доменного класса.

Если не ошибаюсь, get() - это единственный метод, который превратит ваш String в нужный Long. Для остальных вам нужно использовать long:

def quarterEndAdjustmentInstance = QuarterEndAdjustment.findByID(params.long('id'))
person Community    schedule 26.04.2013
comment
get(params.id) работает, потому что Grails внутренне преобразует String в Long. - person ; 26.04.2013
comment
Правильно, но это проблема, с которой я столкнулся. Я получаю IllegalArgumentExcepton на get(params.id), get(id) и т. д. Но точно такой же вызов работает и в других методах контроллера. - person john_solo; 26.04.2013
comment
Я принимаю этот ответ, потому что Серджио был прав. Хотя это то, что у меня было в моем коде все время (используя params.id), только после нескольких чисток оно начало работать. - person john_solo; 29.04.2013