Класс предметной области Grails сохраняет свойство id NULL; что приводит к ошибке при запуске веб-приложения

В этом проекте я пытаюсь сохранить данные, возвращаемые Yahoo Finance URL API. URL-адрес для доступа: "http://ichart.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2000&d=0&e=31&f=2010&g=w&ignore=.csv". Я пытаюсь сохранить возвращенные данные в виде строки в моем параметре StockQuote.stockInfo.

Я получаю следующую ошибку при сохранении экземпляра объекта StockQuote:

Error 500: Internal Server Error
URI: /StockScreenerSD/stockQuote/tickerLookup
Class: org.h2.jdbc.JdbcSQLException
Message: NULL not allowed for column "STOCK_QUOTE"; SQL statement: insert into stock_quote (id, version, date_created, stock_info, ticker) values (null, ?, ?, ?, ?) [23502-164]

Around line 26 of grails-app/controllers/org/grails/finance/StockQuoteController.groovy
23://       def url = ("http://download.finance.yahoo.com/d/quotes.csv?s=" + stockQuote.ticker + "&f=xsna2t8pj1a").toURL()
24:     def url = ("http://ichart.yahoo.com/table.csv?s=" +stockQuote.ticker+ "&a=0&b=1&c=2000&d=0&e=31&f=2010&g=w&ignore=.csv").toURL()
25:     stockQuote.stockInfo = url.text.toString()
26:     stockQuote.save()(flush: true)
27:     def stockQuoteList = stockQuoteList()   
28:     render template: 'usedTickers', collection: stockQuoteList, var: 'stockData'
29: }

Мой код контроллера, который пытается выполнить действие сохранения, выглядит следующим образом:

package org.grails.finance


import grails.plugins.springsecurity.Secured
@Secured('IS_AUTHENTICATED_FULLY')

class StockQuoteController {
    // def scaffold = true

    def index() {
        redirect (action:'getTicker')
    }

    def getTicker() {
        def listing = stockQuoteList()
        return [stockQuoteList: listing] // this is a map. key=>value
        }

    def tickerLookup = { 
        def stockQuote = new StockQuote(ticker: params.ticker)
        def url = ("http://ichart.yahoo.com/table.csv?s=" +stockQuote.ticker+ "&a=0&b=1&c=2000&d=0&e=31&f=2010&g=w&ignore=.csv").toURL()
        stockQuote.stockInfo = url.text.toString()
        stockQuote.save()(flush: true)
        def stockQuoteList = stockQuoteList()   
        render template: 'usedTickers', collection: stockQuoteList, var: 'stockData'
    }

    private stockQuoteList() {
        StockQuote.list()
    }

person Sanket Deshpande    schedule 31.05.2013    source источник
comment
Был ли у вас (или был) ненулевой столбец с именем STOCK_QUOTE в вашем доменном классе в какой-то момент? Мне кажется, об этом говорит ошибка. Message: NULL not allowed for column "STOCK_QUOTE"   -  person Kelly    schedule 31.05.2013
comment
нет, я вообще так не называл свои доменные классы...   -  person Sanket Deshpande    schedule 31.05.2013
comment
@Kelly OP сопоставила бы stockInfo со столбцом таблицы STOCK_QUOTE.   -  person dmahapatro    schedule 01.06.2013
comment
@dmahapatro - Хорошо, это разумно. ОП сказал, что где-то я пропал?   -  person Kelly    schedule 01.06.2013
comment
@Kelly Он еще не сделал. Вини в этом пятницу. :П   -  person dmahapatro    schedule 01.06.2013
comment
Не уверен, но ОП относится ко мне? (новичковое невежество)... Я лично не уточнил и конкретное отображение. Grails, должно быть, делает это из-за своих собственных настроек.   -  person Sanket Deshpande    schedule 02.06.2013
comment
Вы смогли заставить его работать?   -  person dmahapatro    schedule 15.06.2013


Ответы (1)


Я надеюсь, что это должно быть мое последнее редактирование. Доказательство того, что пятница становится непродуктивной, если у вас была длинная напряженная неделя. :) Хорошо, вот как должна быть настроена, у меня работает:

//Domain class StockQuote
class StockQuote {
    String ticker
    String stockInfo

    static mapping = {
        stockInfo type: "text" //You have to set the type since the info is CLOB
    }
}

//Controller Action
def tickerLookup = {
    def stockQuote = new StockQuote(ticker: params.ticker)
    def url = ("http://ichart.yahoo.com/table.csv?s=" +stockQuote.ticker+ "&a=0&b=1&c=2000&d=0&e=31&f=2010&g=w&ignore=.csv").toURL()
    stockQuote.stockInfo = url.text.toString()
    stockQuote.save(flush: true) //Look at how flush is used in save
    def stockQuoteList = stockQuoteList()   
    render template: 'usedTickers', collection: stockQuoteList, var: 'stockData'
}

Это выше работает для меня, и я могу сохранить большой ответ CLOB из URL-адреса в таблицу. Взгляните на мой тест.

person dmahapatro    schedule 31.05.2013
comment
я использовал эту веб-страницу в качестве руководства...mrhaki.blogspot.co.uk/2009/10/ - person Sanket Deshpande; 31.05.2013
comment
Можете показать StockQuote класс домена? Я думаю, моя пятничная лихорадка уже началась. До этого хотел дать адекватный ответ :) - person dmahapatro; 31.05.2013
comment
Надеюсь, мне удалось решить вашу проблему, Санкет. Думаю, мне пора отправиться в отпуск в Индию. :) - person dmahapatro; 31.05.2013
comment
ой, я сейчас не за ноутбуком. но спасибо за отклик! я попробую, когда вернусь... спасибо! - person Sanket Deshpande; 31.05.2013
comment
Я подключил ваш код pastebin к новому проекту Grails в своей среде Eclipse GGTS. Это работает отлично. Но мой собственный проект не работает, несмотря на тот же код... - person Sanket Deshpande; 02.06.2013