<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Here comes the Sun &#187; Grails</title>
	<atom:link href="http://sunng.info/blog/tag/grails/feed/" rel="self" type="application/rss+xml" />
	<link>http://sunng.info/blog</link>
	<description>Homemade Clojure Geek</description>
	<lastBuildDate>Fri, 11 May 2012 02:24:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Grails的核心依赖必须保证项目中版本一致！</title>
		<link>http://sunng.info/blog/2011/10/grails%e7%9a%84%e6%a0%b8%e5%bf%83%e4%be%9d%e8%b5%96%e5%bf%85%e9%a1%bb%e4%bf%9d%e8%af%81%e9%a1%b9%e7%9b%ae%e4%b8%ad%e7%89%88%e6%9c%ac%e4%b8%80%e8%87%b4%ef%bc%81/</link>
		<comments>http://sunng.info/blog/2011/10/grails%e7%9a%84%e6%a0%b8%e5%bf%83%e4%be%9d%e8%b5%96%e5%bf%85%e9%a1%bb%e4%bf%9d%e8%af%81%e9%a1%b9%e7%9b%ae%e4%b8%ad%e7%89%88%e6%9c%ac%e4%b8%80%e8%87%b4%ef%bc%81/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 14:51:43 +0000</pubDate>
		<dc:creator>sunng</dc:creator>
				<category><![CDATA[手艺]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://sunng.info/blog/?p=1037</guid>
		<description><![CDATA[好久没写语录式大标题了，实在是今天玩Grails受害很深很深。 Grails因为本身是通过ivy来管理依赖的，虽然后续的版本和maven的集成不断加深，但是本身还是通过ivy来解析pom.xml。也就是说最后的活还是ivy干的。如果你的项目比较大，选择了通过maven来管理项目，而你的依赖中又牵扯了很多其他的依赖，那么你危险了。 :: UNRESOLVED DEPENDENCIES :: :: log4j#log4j;1.2.16: configuration not found in log4j#log4j;1.2.16: &#8216;master&#8217;. It was required from &#8230;;1.7.0 runtime 对maven用户这是一条多么发指的报错！（比如这个） 它的原因其实是你的dependency中有!=1.2.16版本你的log4j，比如1.2.12，即使你在pom里将它添加到了exclusion中也没有用，必须要保持版本的一致！至于你用什么办法让他们保持一致，还是干脆放弃用maven管理你的grails项目：It&#8217;s up to you. 同样的问题还出现在其他核心依赖上，例如commons-pool。]]></description>
			<content:encoded><![CDATA[<p>好久没写语录式大标题了，实在是今天玩Grails受害很深很深。</p>
<p>Grails因为本身是通过ivy来管理依赖的，虽然后续的版本和maven的集成不断加深，但是本身还是通过ivy来解析pom.xml。也就是说最后的活还是ivy干的。如果你的项目比较大，选择了通过maven来管理项目，而你的依赖中又牵扯了很多其他的依赖，那么你危险了。</p>
<blockquote><p>:: UNRESOLVED DEPENDENCIES ::</p>
<p>:: log4j#log4j;1.2.16: configuration not found in log4j#log4j;1.2.16: &#8216;master&#8217;. It was required from &#8230;;1.7.0 runtime</p></blockquote>
<p>对maven用户这是一条多么发指的报错！（比如<a href="http://forum.springsource.org/showthread.php?104033-Can-not-load-a-log4J-library" target="_blank">这个</a>）</p>
<p>它的原因其实是你的dependency中有!=1.2.16版本你的log4j，比如1.2.12，即使你在pom里将它添加到了exclusion中也没有用，必须要保持版本的一致！至于你用什么办法让他们保持一致，还是干脆放弃用maven管理你的grails项目：It&#8217;s up to you.</p>
<p>同样的问题还出现在其他核心依赖上，例如commons-pool。</p>
]]></content:encoded>
			<wfw:commentRss>http://sunng.info/blog/2011/10/grails%e7%9a%84%e6%a0%b8%e5%bf%83%e4%be%9d%e8%b5%96%e5%bf%85%e9%a1%bb%e4%bf%9d%e8%af%81%e9%a1%b9%e7%9b%ae%e4%b8%ad%e7%89%88%e6%9c%ac%e4%b8%80%e8%87%b4%ef%bc%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mapping Geometry in Grails and MySQL</title>
		<link>http://sunng.info/blog/2009/10/mapping-geometry-in-grails-and-mysql/</link>
		<comments>http://sunng.info/blog/2009/10/mapping-geometry-in-grails-and-mysql/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 11:14:36 +0000</pubDate>
		<dc:creator>sunng</dc:creator>
				<category><![CDATA[手艺]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[jts]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.classicning.com/blog/?p=238</guid>
		<description><![CDATA[针对地理数据的ORM，有一个Hibernate的扩展HibernateSpatial项目可以将JTS对象映射到MySQL/PostGIS/Oracle中。这个扩展同样可以用在Grails里，这里有一篇简单的介绍，关于在Grails和MySQL中管理地理数据： http://www.grails.org/MySQL+GIS-Geometry+with+Grails 不过按照这个文章里介绍的方法用，很可能会遭遇这样的报错： org.hibernate.MappingException: No Dialect mapping for JDBC type: 2003 这个问题最终在这里得到了解答： http://n2.nabble.com/No-Dialect-mapping-for-JDBC-type-2003-td1141106.html 按照邮件列表里的反映，上面的配置在Postgis里是可以work的，但是如果用Mysql还需要指定JPA的columnDefinition，对应的Hibernate属性是sql-type。虽然作者承诺会在今后的版本里修改这个问题，不过眼下的M2版本还没有修正这个问题。为此，Grails的用户特地提出在Grails中加入sql-type的支持： http://jira.codehaus.org/browse/GRAILS-3201 现在按照下面文档的说明，可以在mapping里指定sqlType了： http://grails.org/doc/latest/ref/Database%20Mapping/column.html 实例代码里的domain定义应该改成： import com.vividsolutions.jts.geom.Polygon import org.hibernatespatial.GeometryUserType public class MyPoly { String name Polygon poly static mapping = { poly type: GeometryUserType， sqlType:"GEOMETRY" } } &#8230; <a href="http://sunng.info/blog/2009/10/mapping-geometry-in-grails-and-mysql/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>针对地理数据的ORM，有一个Hibernate的扩展<a href="http://www.hibernatespatial.org/" target="_blank">HibernateSpatial</a>项目可以将JTS对象映射到MySQL/PostGIS/Oracle中。这个扩展同样可以用在Grails里，这里有一篇简单的介绍，关于在Grails和MySQL中管理地理数据：<br />
<a href="http://www.grails.org/MySQL+GIS-Geometry+with+Grails" target="_blank">http://www.grails.org/MySQL+GIS-Geometry+with+Grails</a></p>
<p>不过按照这个文章里介绍的方法用，很可能会遭遇这样的报错：</p>
<blockquote><p>org.hibernate.MappingException: No Dialect mapping for JDBC type: 2003</p></blockquote>
<p>这个问题最终在这里得到了解答：<br />
<a href="http://n2.nabble.com/No-Dialect-mapping-for-JDBC-type-2003-td1141106.html" target="_blank">http://n2.nabble.com/No-Dialect-mapping-for-JDBC-type-2003-td1141106.html</a><br />
按照邮件列表里的反映，上面的配置在Postgis里是可以work的，但是如果用Mysql还需要指定JPA的columnDefinition，对应的Hibernate属性是sql-type。虽然作者承诺会在今后的版本里修改这个问题，不过眼下的M2版本还没有修正这个问题。为此，Grails的用户特地提出在Grails中加入sql-type的支持：<br />
<a href="http://jira.codehaus.org/browse/GRAILS-3201" target="_blank">http://jira.codehaus.org/browse/GRAILS-3201</a><br />
现在按照下面文档的说明，可以在mapping里指定sqlType了：<br />
<a href="http://grails.org/doc/latest/ref/Database%20Mapping/column.html" target="_blank">http://grails.org/doc/latest/ref/Database%20Mapping/column.html</a></p>
<p>实例代码里的domain定义应该改成：</p>
<pre class="brush:groovy">
import com.vividsolutions.jts.geom.Polygon
import org.hibernatespatial.GeometryUserType

public class MyPoly {
    String name
    Polygon poly

    static mapping = {
        poly type: GeometryUserType， sqlType:"GEOMETRY"
    }

}
</pre>
<p>于是，再也没有莫名其妙的No Dialect报错了。</p>
]]></content:encoded>
			<wfw:commentRss>http://sunng.info/blog/2009/10/mapping-geometry-in-grails-and-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inside Grails Flash Scope</title>
		<link>http://sunng.info/blog/2009/08/inside-grails-flash-scope/</link>
		<comments>http://sunng.info/blog/2009/08/inside-grails-flash-scope/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 14:09:01 +0000</pubDate>
		<dc:creator>sunng</dc:creator>
				<category><![CDATA[手艺]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.classicning.com/blog/?p=147</guid>
		<description><![CDATA[Grails的在Servlet API的基础上增加了一个非常实用的FlashScope，FlashScope的生命周期为两次请求（也就是在一次重定向）。它的典型应用是POST方式提交后显示服务器端发给用户的提示信息，在平时的应用中会经常使用。 Grails的FlashScope接口定义在org.codehaus.groovy.grails.web.servlet包中，这个接口继承了Map接口，并定义了一个方法next()。 Grails的默认实现在org.codehaus.groovy.grails.web.servlet包中，GrailsFlashScope。这个实现内部定义了两个Map（生命周期为两个请求），current和next，这两个Map不断滚动，保持在一个请求中可以且仅可以访问到当前和前一次请求的上下文。 [codesyntax lang="java"] public void next() { current.clear(); current = (HashMap)next.clone(); next.clear(); reassociateObjectsWithErrors(current); } [/codesyntax] put的时候，Grails只把新制放到next表中，因为next将在下一次请求时继续保存 [codesyntax lang="java"] public Object put(Object key, Object value) { // create the session if it doesn&#8217;t exist registerWithSessionIfNecessary(); if(current.containsKey(key)) { current.remove(key); &#8230; <a href="http://sunng.info/blog/2009/08/inside-grails-flash-scope/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.grails.org" target="_blank">Grails</a>的在Servlet API的基础上增加了一个非常实用的FlashScope，FlashScope的生命周期为两次请求（也就是在一次重定向）。它的典型应用是POST方式提交后显示服务器端发给用户的提示信息，在平时的应用中会经常使用。</p>
<p>Grails的FlashScope接口定义在org.codehaus.groovy.grails.web.servlet包中，这个接口继承了Map接口，并定义了一个方法next()。</p>
<p>Grails的默认实现在org.codehaus.groovy.grails.web.servlet包中，GrailsFlashScope。这个实现内部定义了两个Map（生命周期为两个请求），current和next，这两个Map不断滚动，保持在一个请求中可以且仅可以访问到当前和前一次请求的上下文。<br />
[codesyntax lang="java"]<br />
public void next() {<br />
current.clear();<br />
current = (HashMap)next.clone();<br />
next.clear();<br />
reassociateObjectsWithErrors(current);<br />
}<br />
[/codesyntax]</p>
<p>put的时候，Grails只把新制放到next表中，因为next将在下一次请求时继续保存<br />
[codesyntax lang="java"]<br />
public Object put(Object key, Object value) {<br />
// create the session if it doesn&#8217;t exist<br />
registerWithSessionIfNecessary();<br />
if(current.containsKey(key)) {<br />
current.remove(key);<br />
}<br />
storeErrorsIfPossible(next,value);</p>
<p>return next.put(key,value);<br />
}<br />
[/codesyntax]</p>
<p>get的时候，Grails在两个Map中查找<br />
[codesyntax lang="java"]<br />
public Object get(Object key) {<br />
if(next.containsKey(key))<br />
return next.get(key);<br />
return current.get(key);<br />
}<br />
[/codesyntax]</p>
<p>此外，FlashScope本身还是被放在session中<br />
[codesyntax lang="java"]<br />
private void registerWithSessionIfNecessary() {<br />
GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.currentRequestAttributes();<br />
HttpSession session = webRequest.getCurrentRequest().getSession(true);<br />
if(session.getAttribute(GrailsApplicationAttributes.FLASH_SCOPE) == null)<br />
session.setAttribute(GrailsApplicationAttributes.FLASH_SCOPE, this);<br />
}<br />
[/codesyntax]</p>
<p>然后，滚动FlashScope的行为在GrailsWebRequestFilter中被调用，GrailsWebRequestFilter继承自spring-web的OncePerRequestFilter<br />
[codesyntax lang="java"]<br />
protected void doFilterInternal(<br />
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)<br />
throws ServletException, IOException {<br />
&#8230;</p>
<p>// Set the flash scope instance to its next state. We do<br />
// this here so that the flash is available from Grails<br />
// filters in a valid state.<br />
FlashScope fs = webRequest.getAttributes().getFlashScope(request);<br />
fs.next();<br />
&#8230;<br />
}<br />
[/codesyntax]</p>
]]></content:encoded>
			<wfw:commentRss>http://sunng.info/blog/2009/08/inside-grails-flash-scope/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

