heroku で Grails + PostgreSQL を試してみる

GrailsアプリをHerokuで公開する の続きです。
今回はGrails2.1.1 で作成したCRUDアプリを heroku で動かしてみます。
ソースはGitHubにて公開しています。

 

大まかな手順
1.heroku のデータベース作成
2.ローカルで動作確認したアプリに heroku 用の設定を行う
3.デプロイ & 動作確認

 

以下、詳細。

 1.heroku のデータベース作成

  1. herokupostgres のページへ遷移。

    f:id:onBass_naga:20130105103952j:plain

    heroku dashboard > [ Resources] > [ Heroku Postgres Dev ]
  2. heroku のアカウントでログイン
  3. Your Databases ラベルの右横にある[ + ] ボタンを押下
  4. [ Dev Plan ] を押下後、表示された [ Add Database] を押下
  5. 追加されたDB名を押下して接続情報を確認
    (歯車ボタンで接続情報のフォーマットを変えられます)

    f:id:onBass_naga:20130105103955j:plain

 

 2.ローカルで動作確認したアプリに heroku 用の設定を行う
DataSource.groovy の本番用接続情報に 1-5 で確認した情報を設定する。
「sslfactory = org.postgresql.ssl.NonValidatingFactory」を忘れないよう注意!

上記設定を行っていない場合、下記エラーが発生。

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

 

3.デプロイ & 動作確認

f:id:onBass_naga:20130105202653j:plain

普通に動きます。

 

◇ おまけ ◇
<g:form>の使い方を誤っていたために、下記エラーが発生。
ローカル環境では動いていたが、heroku上でエラーになった。

URI /todo/index
Class java.lang.IllegalArgumentException
Message Method name must not be null
Error 500: Internal Server Error

    Line | Method
->>   41 | retrieveAction   in grails.plugin.cache.web.ProxyAwareMixedGrailsControllerHelper
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    547 | handle           in org.eclipse.jetty.servlet.ServletHolder
|   1359 | doFilter . . . . in org.eclipse.jetty.servlet.ServletHandler$CachedChain
|    186 | doFilter         in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter . . . . in grails.plugin.cache.web.filter.AbstractFilter
|   1330 | doFilter         in org.eclipse.jetty.servlet.ServletHandler$CachedChain
|    478 | doHandle . . . . in org.eclipse.jetty.servlet.ServletHandler
|    119 | handle           in org.eclipse.jetty.server.handler.ScopedHandler
|    520 | handle . . . . . in org.eclipse.jetty.security.SecurityHandler
|    227 | doHandle         in org.eclipse.jetty.server.session.SessionHandler
|    941 | doHandle . . . . in org.eclipse.jetty.server.handler.ContextHandler
|    409 | doScope          in org.eclipse.jetty.servlet.ServletHandler
|    186 | doScope . . . .  in org.eclipse.jetty.server.session.SessionHandler
|    875 | doScope          in org.eclipse.jetty.server.handler.ContextHandler
|    117 | handle . . . . . in org.eclipse.jetty.server.handler.ScopedHandler
|    288 | forward          in org.eclipse.jetty.server.Dispatcher
|    115 | forward . . . .  in     ''
|   1330 | doFilter         in org.eclipse.jetty.servlet.ServletHandler$CachedChain
|     51 | doFilterInternal in grails.plugin.databasesession.SessionProxyFilter
|   1330 | doFilter         in org.eclipse.jetty.servlet.ServletHandler$CachedChain
|    478 | doHandle . . . . in org.eclipse.jetty.servlet.ServletHandler
|    119 | handle           in org.eclipse.jetty.server.handler.ScopedHandler
|    520 | handle . . . . . in org.eclipse.jetty.security.SecurityHandler
|    227 | doHandle         in org.eclipse.jetty.server.session.SessionHandler
|    941 | doHandle . . . . in org.eclipse.jetty.server.handler.ContextHandler
|    409 | doScope          in org.eclipse.jetty.servlet.ServletHandler
|    186 | doScope . . . .  in org.eclipse.jetty.server.session.SessionHandler
|    875 | doScope          in org.eclipse.jetty.server.handler.ContextHandler
|    117 | handle . . . . . in org.eclipse.jetty.server.handler.ScopedHandler
|    250 | handle           in org.eclipse.jetty.server.handler.ContextHandlerCollection
|    149 | handle . . . . . in org.eclipse.jetty.server.handler.HandlerCollection
|    110 | handle           in org.eclipse.jetty.server.handler.HandlerWrapper
|    345 | handle . . . . . in org.eclipse.jetty.server.Server
|    441 | handleRequest    in org.eclipse.jetty.server.HttpConnection
|    936 | content . . . .  in org.eclipse.jetty.server.HttpConnection$RequestHandler
|    801 | parseNext        in org.eclipse.jetty.http.HttpParser
|    224 | parseAvailable . in     ''
|     51 | handle           in org.eclipse.jetty.server.AsyncHttpConnection
|    586 | handle . . . . . in org.eclipse.jetty.io.nio.SelectChannelEndPoint
|     44 | run              in org.eclipse.jetty.io.nio.SelectChannelEndPoint$1
|    598 | runJob . . . . . in org.eclipse.jetty.util.thread.QueuedThreadPool
|    533 | run              in org.eclipse.jetty.util.thread.QueuedThreadPool$3
^    636 | run . . . . . .  in java.lang.Thread

原因:formタグに controller 属性を記述していなかったためエラー
【駄目なソース】
<g:form method="post">
    <g:actionSubmit value="add" action="/create"/>
</g:form>
【正しいソース】
<g:form controller="todo" method="post">
    <g:actionSubmit value="add" action="create"/>
</g:form>

WEB+DB PRESS Vol.71

WEB+DB PRESS Vol.71