blob: 6fed65aeeb712c71c291e5f164327bb5db852349 [file]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(["setDoNotTrack", true]);
_paq.push(["disableCookies"]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '79']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<title>3 Upgrading from the previous versions 5.3.0</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" href="../css/main.css" type="text/css" media="screen, print" title="Style" charset="utf-8"/>
<link rel="stylesheet" href="../css/pdf.css" type="text/css" media="print" title="PDF" charset="utf-8"/>
<script type="text/javascript">
function addJsClass() {
var classes = document.body.className.split(" ");
classes.push("js");
document.body.className = classes.join(" ");
}
</script>
</head>
<body class="body" onload="addJsClass();">
<div id="navigation">
<div class="navTitle">
The Grails Framework
</div>
<div class="navLinks">
<ul>
<li>
<div id="nav-summary" onmouseover="toggleNavSummary(false)" onmouseout="toggleNavSummary(true)">
<a href="../guide/index.html" class="button">Table of contents</a>
<div id="nav-summary-childs" style="display:none;">
<div class="toc-item" style="margin-left:0"><a href="../guide/introduction.html"><strong>1</strong><span>Introduction</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/gettingStarted.html"><strong>2</strong><span>Getting Started</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/upgrading.html"><strong>3</strong><span>Upgrading from the previous versions</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/conf.html"><strong>4</strong><span>Configuration</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/commandLine.html"><strong>5</strong><span>The Command Line</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/profiles.html"><strong>6</strong><span>Application Profiles</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/GORM.html"><strong>7</strong><span>Object Relational Mapping (GORM)</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/theWebLayer.html"><strong>8</strong><span>The Web Layer</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/traits.html"><strong>9</strong><span>Traits</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/REST.html"><strong>10</strong><span>REST</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/async.html"><strong>11</strong><span>Asynchronous Programming</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/validation.html"><strong>12</strong><span>Validation</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/services.html"><strong>13</strong><span>The Service Layer</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/staticTypeCheckingAndCompilation.html"><strong>14</strong><span>Static Type Checking And Compilation</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/testing.html"><strong>15</strong><span>Testing</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/i18n.html"><strong>16</strong><span>Internationalization</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/security.html"><strong>17</strong><span>Security</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/plugins.html"><strong>18</strong><span>Plugins</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/spring.html"><strong>19</strong><span>Grails and Spring</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/scaffolding.html"><strong>20</strong><span>Scaffolding</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/deployment.html"><strong>21</strong><span>Deployment</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/contributing.html"><strong>22</strong><span>Contributing to Grails</span></a>
</div>
</div>
</div>
</li>
<li class="separator selected">
<a id="ref-button" onclick="localToggle(); return false;" href="#">Quick Reference</a>
</li>
</ul>
</div>
</div>
<table id="colset" border="0" cellpadding="0" cellspacing="0">
<tr>
<td id="col1">
<div id="main" class="corner-all">
<div class="toc-item prev-left"><a href="../guide/gettingStarted.html">&lt;&lt; <strong>2</strong><span>Getting Started</span></a></div>
<span id='toggle-col1' class="toggle">(<a href="#" onclick="localToggle(); return false;">Quick Reference</a>)</span>
<div class="toc-item next-right"><a href="../guide/conf.html"><strong>4</strong><span>Configuration</span> >></a></div>
<div class="project">
<h1>3 Upgrading from the previous versions</h1>
<p><strong>Version:</strong> 5.3.0</p>
</div>
<div id="table-of-content">
<h2>Table of Contents</h2>
<div class="toc-item" style="margin-left:0px"><a href="#upgrading40x"><strong>3.1</strong><span>Upgrading from Grails 4 to Grails 5</span></a>
</div>
<div class="toc-item" style="margin-left:0px"><a href="#upgrading33x"><strong>3.2</strong><span>Upgrading from Grails 3.3.x to Grails 4</span></a>
</div>
</div>
<h1 id="upgrading">3 Upgrading from the previous versions</h1>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/upgrading.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<h2 id="upgrading40x">3.1 Upgrading from Grails 4 to Grails 5</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/upgrading/upgrading40x.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<div class="sect2">
<h3 id="_bump_up_grails_version">Bump up Grails Version</h3>
<div class="paragraph">
<p>You will need to upgrade your Grails version defined in <code>gradle.properties</code> as:</p>
</div>
<div class="listingblock">
<div class="title">gradle.properties</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">...
grailsVersion=5.1.1
...</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_apache_groovy_3_0_7">Apache Groovy 3.0.7</h3>
<div class="paragraph">
<p>Grails 5.1.1 provide support for Groovy 3. We would recommend you to please check the <a href="https://groovy-lang.org/releasenotes/groovy-3.0.html">Release notes for Groovy 3</a> to update your application in case you are using a specific feature which might not work in Groovy 3.</p>
</div>
<div class="paragraph">
<p>Define groovyVersion in <code>gradle.properties</code> to force the application to use Groovy 3.</p>
</div>
<div class="paragraph">
<p>Grails 5.1 app&#8217;s <code>gradle.properties</code></p>
</div>
<div class="listingblock">
<div class="title">gradle.properties</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">...
groovyVersion=3.0.7
...</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_bump_up_gorm_version">Bump up GORM Version</h3>
<div class="paragraph">
<p>If you were using <a href="https://grails.apache.org/docs/latest/grails-data/">GORM</a>, you will need to update the version defined in <code>gradle.properties</code> as:</p>
</div>
<div class="listingblock">
<div class="title">gradle.properties</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">...
gormVersion=7.2.0
...</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_gorm_for_monogdb_sync_driver">GORM for MonogDB Sync Driver</h3>
<div class="paragraph">
<p>The GORM for MongoDB is updated to support latest mongodb-driver-sync. If you are using GORM for MongoDB and doing something specific to MongoDB Driver or low level Mongo API then you might want to take a look at <a href="https://mongodb.github.io/mongo-java-driver/4.0/upgrading/">Upgrading to the 4.0 Driver</a></p>
</div>
</div>
<div class="sect2">
<h3 id="_bump_up_asset_pipeline_plugin_version">Bump up Asset Pipeline plugin version</h3>
<div class="paragraph">
<p>The previous version of asset-pipeline is not supported with Grails 5.0 as it is compiled with a version of Groovy which is binary incompatible with Groovy 3. So, please update the plugin version to 3.2.4.</p>
</div>
</div>
<div class="sect2">
<h3 id="_disabled_stringchararrayaccessor_by_default">Disabled StringCharArrayAccessor by default</h3>
<div class="paragraph">
<p>The previous version of Grails use the <code>StringCharArrayAccessor</code> which is enabled by default and provides optimized access to <code>java.lang.String</code> internals. In Grails 5.0 it is disabled by default but you can enable it by setting a system property with name <code>stringchararrayaccessor.disabled</code> and value <code>false</code>.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Enabling StringCharArrayAccessor would show IllegalReflectiveAccess warnings as it uses reflection to do the optimizations.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_changes_in_profile_yml_and_feature_yml_files_in_grails_profiles">Changes in profile.yml and feature.yml files in Grails Profiles</h3>
<div class="paragraph">
<p>The format of how dependencies are defined in features and profiles has been changed. See the section on <a href="profiles.html">Application Profiles</a> for more information.</p>
</div>
</div>
<div class="sect2">
<h3 id="_deprecation_of_dot_navigation_of_grails_configuration">Deprecation of dot navigation of Grails configuration</h3>
<div class="paragraph">
<p>In order to reduce complexity, improve performance, and increase maintainability, accessing configuration through dot notation (config.a.b.c) has been deprecated. This functionality will be removed in a future release.</p>
</div>
<div class="paragraph">
<p>Also, you would see a warning message if you are accessing configuration through the dot notation.</p>
</div>
<div class="paragraph">
<p>The recommended way to access configuration is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">grailsApplication.config.getProperty(<span class="string"><span class="delimiter">&quot;</span><span class="content">hola</span><span class="delimiter">&quot;</span></span>, <span class="predefined-type">String</span>.class)</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_deprecated_classes">Deprecated Classes</h3>
<div class="ulist">
<ul>
<li>
<p><a href="https://grails.apache.org/docs/5.3.0/api/org/grails/config/NavigableMap.html">org.grails.config.NavigableMap</a></p>
</li>
<li>
<p><a href="https://grails.apache.org/docs/5.3.0/api/org/grails/config/NavigableMapConfig.html">org.grails.config.NavigableMapConfig</a></p>
</li>
<li>
<p><a href="https://grails.apache.org/docs/5.3.0/api/org/grails/config/NavigableMapPropertySource.html">org.grails.config.NavigableMapPropertySource</a></p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_spring_5_3">Spring 5.3</h3>
<div class="paragraph">
<p>Grails 5.0.0.RC1 is built on Spring 5.3.2 See the <a href="https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-5.x#upgrading-to-version-53">Upgrading to Spring 5.3</a> if you are using Spring specific features.</p>
</div>
</div>
<div class="sect2">
<h3 id="_spring_boot_2_4">Spring Boot 2.4</h3>
<div class="paragraph">
<p>Grails 5.1.1 updates to Spring Boot 2.6. Please check <a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes">Spring Boot 2.6 Release Notes</a> for more information.</p>
</div>
</div>
<div class="sect2">
<h3 id="_micronaut_3_2_0">Micronaut 3.2.0</h3>
<div class="paragraph">
<p>Grails 5.1.1 is shipped with Micronaut 3.2.0. Please check the <a href="https://docs.micronaut.io/3.2.0/guide/index.html#upgrading">Upgrading to Micronaut 3.x</a> if you are using a specific feature.</p>
</div>
</div>
<div class="sect2">
<h3 id="_micronaut_for_spring_4_0_1">Micronaut for Spring 4.0.1</h3>
<div class="paragraph">
<p>Grails 5.1.1 is updated to Micronaut for Spring 4.0.1, please check out <a href="https://github.com/micronaut-projects/micronaut-spring/releases/tag/v4.0.1">release notes</a> for more information.</p>
</div>
</div>
<div class="sect2">
<h3 id="_gradle_7_x">Gradle 7.x</h3>
<div class="sect3">
<h4 id="_compile_dependency_configuration_as_well_as_others_have_been_removed_from_gradle_7_x_in_previous_version_they_were_deprecated">Compile dependency configuration as well as others have been removed from Gradle 7.x. In previous version they were deprecated.</h4>
<div class="paragraph">
<p>Replace configurations:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">...
compile -&gt; implementation
testCompile -&gt; testImplementation
runtime -&gt; runtimeOnly
...</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
More information in Gradle upgrade docs <a href="https://docs.gradle.org/current/userguide/upgrading_version_6.html#sec:configuration_removal">Gradle upgrade docs</a>
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="_plugins_in_multi_project_setup">Plugins in multi-project setup</h4>
<div class="paragraph">
<p>If you have grails plugins as part of multi-project builds you should also replace the <code>compile</code> with <code>implementation</code> configuration.</p>
</div>
<div class="paragraph">
<p>Additionally if your main application relied on the dependencies declared by the plugin you need to apply further changes.</p>
</div>
<div class="paragraph">
<p>To make the dependencies available again you have to declare them with <code>api</code> configuration. You also have to apply the <code>java-library</code> gradle plugin in your plugin project.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
More information <a href="https://docs.gradle.org/current/userguide/java_library_plugin.html">gradle java-library-plugin</a>
</td>
</tr>
</table>
</div>
</div>
</div>
<h2 id="upgrading33x">3.2 Upgrading from Grails 3.3.x to Grails 4</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/upgrading/upgrading33x.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<div class="sect2">
<h3 id="_bump_up_grails_version">Bump up Grails Version</h3>
<div class="paragraph">
<p>You will need to upgrade your Grails version defined in <code>gradle.properties</code>.</p>
</div>
<div class="paragraph">
<p>Grails 3 app&#8217;s <code>gradle.properties</code></p>
</div>
<div class="listingblock">
<div class="title">gradle.properties</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">...
grailsVersion=3.3.8
...</code></pre>
</div>
</div>
<div class="paragraph">
<p>Grails 4 app&#8217;s <code>gradle.properties</code></p>
</div>
<div class="listingblock">
<div class="title">gradle.properties</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">...
grailsVersion=4.0.4
...</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_bump_up_gorm_version">Bump up GORM Version</h3>
<div class="paragraph">
<p>If you were using <a href="https://grails.apache.org/docs/latest/grails-data/">GORM</a>, you will need to update the version defined in <code>gradle.properties</code>.</p>
</div>
<div class="paragraph">
<p>Grails 3 app&#8217;s <code>gradle.properties</code></p>
</div>
<div class="listingblock">
<div class="title">gradle.properties</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">...
gormVersion=6.1.10.RELEASE
...</code></pre>
</div>
</div>
<div class="paragraph">
<p>Grails 4 app&#8217;s <code>gradle.properties</code></p>
</div>
<div class="listingblock">
<div class="title">gradle.properties</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">...
gormVersion=7.0.4
...</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_move_gorm_dsl_entries_to_runtime_groovy">Move GORM DSL Entries to runtime.groovy</h3>
<div class="paragraph">
<p>GORM DSL entries should be move to <code>runtime.groovy</code>. For instance, using following GORM configuration in the <code>application.groovy</code> is not supported and will break the application:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">grails.gorm.default.mapping = {
id <span class="key">generator</span>: <span class="string"><span class="delimiter">'</span><span class="content">identity</span><span class="delimiter">'</span></span>
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_spring_5_and_spring_boot_2_1">Spring 5 and Spring Boot 2.1</h3>
<div class="paragraph">
<p>Grails 4.0 is built on Spring 5 and Spring Boot 2.1. See the <a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide">migration guide</a> and <a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes">release notes</a> if you are using Spring specific features.</p>
</div>
</div>
<div class="sect2">
<h3 id="_hibernate_5_4_and_gorm_7_x">Hibernate 5.4 and GORM 7.x</h3>
<div class="paragraph">
<p>Grails 4.x supports a minimum version of Hibernate 5.4 and GORM 7.x. Several changes have been made to GORM to support the newer version of Hibernate and simplify GORM itself.</p>
</div>
<div class="paragraph">
<p>The details of these changes are covered in the <a href="https://grails.apache.org/docs-legacy-gorm/7.0.x/hibernate/manual/index.html#upgradeNotes">GORM upgrade documentation</a>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_spring_boot_2_1_actuator">Spring Boot 2.1 Actuator</h3>
<div class="paragraph">
<p>Please check the <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html">Spring Boot Actuator</a> documentation since it has changed substantially from Spring Boot 1.5 the version Grails 3.x used.</p>
</div>
<div class="paragraph">
<p>If you had configuration such as:</p>
</div>
<div class="listingblock">
<div class="title">grails-app/conf/application.yml - Grails 3.3.x</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="yml"><span class="key">endpoints</span>:
<span class="key">enabled</span>: <span class="string"><span class="content">false</span></span>
<span class="key">jmx</span>:
<span class="key">enabled</span>: <span class="string"><span class="content">true</span></span>
<span class="key">unique-names</span>: <span class="string"><span class="content">true</span></span></code></pre>
</div>
</div>
<div class="paragraph">
<p>replace it with:</p>
</div>
<div class="listingblock">
<div class="title">grails-app/conf/application.yml - Grails 4.x</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="yml"><span class="key">spring</span>:
<span class="key">jmx</span>:
<span class="key">unique-names</span>: <span class="string"><span class="content">true</span></span>
<span class="key">management</span>:
<span class="key">endpoints</span>:
<span class="key">enabled-by-default</span>: <span class="string"><span class="content">false</span></span></code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_spring_boot_developer_tools_and_spring_loaded">Spring Boot Developer Tools and Spring Loaded</h3>
<div class="paragraph">
<p>Previous versions of Grails used a reloading agent called <a href="https://github.com/spring-projects/spring-loaded">Spring Loaded</a>. Since this library is no longer maintained and does not support Java 11 support for Spring Loaded has been removed.</p>
</div>
<div class="paragraph">
<p>As a replacement, Grails 4 applications include <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html">Spring Boot Developer Tools</a> dependencies in the <code>build.gradle</code> build script. If you are migrating a Grails 3.x app, please include the following set of dependencies:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">.
..
...
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
dependencies {
developmentOnly(<span class="string"><span class="delimiter">&quot;</span><span class="content">org.springframework.boot:spring-boot-devtools</span><span class="delimiter">&quot;</span></span>)
...
..
}
...
..
.</code></pre>
</div>
</div>
<div class="paragraph">
<p>Also you should configure the necessary excludes for Spring Developer Tools in <code>application.yml</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="yaml"><span class="key">spring</span>:
<span class="key">devtools</span>:
<span class="key">restart</span>:
<span class="key">exclude</span>:
- <span class="string"><span class="content">grails-app/views/**</span></span>
- <span class="string"><span class="content">grails-app/i18n/**</span></span>
- <span class="string"><span class="content">grails-app/conf/**</span></span></code></pre>
</div>
</div>
<div class="paragraph">
<p>The above configuration prevents the server from restarting when views or message bundles are changed.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
You can use Spring Developer Tools in combination with a browser extension such as the <a href="https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei">Chrome LiveReload extension</a> to get automatic browser
refresh when you change anything in your Grails application.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_spring_boot_gradle_plugin_changes">Spring Boot Gradle Plugin Changes</h3>
<div class="paragraph">
<p>Grails 4 is built on top of Spring Boot 2.1. Grails 3 apps were built on top of Spring Boot 1.x.</p>
</div>
<div class="paragraph">
<p>Your Grails 3 app&#8217;s <code>build.gradle</code> may have such configuration:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bootRun {
addResources = <span class="predefined-constant">true</span>
...
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Grails 4 apps are built on top of Spring Boot 2.1. Starting from Spring Boot 2.0, the <code>addResources</code> property no longer exists. Instead, you need to set the sourceResources property to the source set that you want to use. Typically that’s <code>sourceSets.main</code>. This is described in the <a href="https://docs.spring.io/spring-boot/docs/2.0.0.M3//gradle-plugin/reference/html/#running-your-application-reloading-resources">Spring Boot Gradle plugin’s documentation</a>.</p>
</div>
<div class="paragraph">
<p>Your Grails 4 app&#8217;s <code>build.gradle</code> can be configured:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bootRun {
sourceResources sourceSets.main
...
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_building_executable_jars_for_grails_plugins">Building executable jars for Grails Plugins</h3>
<div class="paragraph">
<p><a href="https://spring.io/blog/2017/04/05/spring-boot-s-new-gradle-plugin">Spring Boot&#8217;s new Gradle Plugin</a>:</p>
</div>
<div class="quoteblock">
<blockquote>
<div class="paragraph">
<p>The bootRepackage task has been replaced with bootJar and bootWar tasks for building executable jars and wars respectively. Both tasks extend their equivalent standard Gradle jar or war task, giving you access to all of the usual configuration options and behaviour.</p>
</div>
</blockquote>
</div>
<div class="paragraph">
<p>If you had configuration such as:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle | Grails 3</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// enable if you wish to package this plugin as a standalone application</span>
bootRepackage.enabled = <span class="predefined-constant">false</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>replace it with:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle | Grails 4</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// enable if you wish to package this plugin as a standalone application</span>
bootJar.enabled = <span class="predefined-constant">false</span></code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_upgrading_to_gradle_5">Upgrading to Gradle 5</h3>
<div class="paragraph">
<p>Grails 3 apps by default used <a href="http://gradle.org">Gradle</a> 3.5. Grails 4 apps use Gradle 5.</p>
</div>
<div class="paragraph">
<p>To upgrade to Gradle 5 execute:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">./gradlew wrapper --gradle-version 5.0</code></pre>
</div>
</div>
<div class="paragraph">
<p>Due to changes in Gradle 5, <a href="https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:pom_compile_runtime_separation">transitive dependencies are no longer resolved</a> for plugins. If your project makes use of a plugin that has transitive dependencies, you will need to add those explicitly to your <code>build.gradle</code> file.</p>
</div>
<div class="paragraph">
<p>If you customized your app&#8217;s build, other migrations may be necessary. Please check
<a href="https://docs.gradle.org/current/userguide/upgrading_version_4.html">Gradle Upgrading your build</a> documentation. Especially notice, that default Gradle daemon now starts with 512MB of heap instead of 1GB. Please check <a href="https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:default_memory_settings">Default memory settings changed</a> documentation.</p>
</div>
</div>
<div class="sect2">
<h3 id="_groovy_language_update_to_2_5_6">Groovy language update to 2.5.6</h3>
<div class="paragraph">
<p>Keep in mind, that with grails 4.0.x there is a minor groovy language upgrade (e.g. 3.3.9. used groovy 2.4.x), which requires a couple of changes, that are immediately obvious when trying to compile your source code. However there are also issues with changed implementations of core linkedlist functions! Check an overview of the breaking changes here: <a href="https://groovy-lang.org/releasenotes/groovy-2.5.html#Groovy2.5releasenotes-Breakingchanges">Breaking changes of Groovy 2.5</a></p>
</div>
<div class="sect3">
<h4 id="_removed_date_helper_functions">Removed date helper functions</h4>
<div class="paragraph">
<p>Most common issue is that date util functions have been moved to individual project, e.g new Date().format("ddMMyyyy") no longer works without adding:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">dependencies {
compile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.codehaus.groovy:groovy-dateutil:3.0.4</span><span class="delimiter">&quot;</span></span>
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_changed_linked_list_method_implementations">Changed linked list method implementations</h4>
<div class="paragraph">
<p>Check whether you are using the groovy version of linkedlist implementations:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>[].pop()</code> - will no longer remove the last, but the first element of the list. Replace it with <code>[].removeLast()</code> is recommended.</p>
</li>
<li>
<p><code>[].push(..)</code> - will no longer add to the end, but to the beginning of the list. Replace it with <code>[].add(..)</code> is recommended.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_h2_web_console">H2 Web Console</h3>
<div class="paragraph">
<p>Spring Boot 2.1 includes native support for the H2 database web console. Since this is already included in Spring Boot the equivalent feature has been removed from Grails. The H2 console is therefore now available at <code>/h2-console</code> instead of the previous URI of <code>/dbconsole</code>. See <a href="https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-sql-h2-console">Using H2’s Web Console</a> in the Spring Boot documentation for more information.</p>
</div>
</div>
<div class="sect2">
<h3 id="_upgrade_hibernate">Upgrade Hibernate</h3>
<div class="paragraph">
<p>If you were using GORM for Hibernate implementation in your Grails 3 app, you will need to upgrade to Hibernate 5.4.</p>
</div>
<div class="paragraph">
<p>A Grails 3 <code>build.gradle</code> such as:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">dependencies {
...
compile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.grails.plugins:hibernate5</span><span class="delimiter">&quot;</span></span>
compile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.hibernate:hibernate-core:5.1.5.Final</span><span class="delimiter">&quot;</span></span>
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>will be in Grails 4:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">dependencies {
...
compile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.grails.plugins:hibernate5</span><span class="delimiter">&quot;</span></span>
compile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.hibernate:hibernate-core:5.4.0.Final</span><span class="delimiter">&quot;</span></span>
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_migrating_to_geb_2_3">Migrating to Geb 2.3</h3>
<div class="paragraph">
<p>Geb 1.1.x (a JDK 1.7 compatible version) was the version shipped by default with Grails 3. Grails 4 is no longer compatible with Java 1.7. You should migrate to Geb 2.3.</p>
</div>
<div class="paragraph">
<p>In Grails 3, if your build.gradle looks like:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">dependencies {
testCompile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.grails.plugins:geb:1.1.2</span><span class="delimiter">&quot;</span></span>
testRuntime <span class="string"><span class="delimiter">&quot;</span><span class="content">org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1</span><span class="delimiter">&quot;</span></span>
testRuntime <span class="string"><span class="delimiter">&quot;</span><span class="content">net.sourceforge.htmlunit:htmlunit:2.18</span><span class="delimiter">&quot;</span></span>
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>In Grails 4, you should replace it with:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">buildscript {
repositories {
...
}
dependencies {
...
classpath <span class="string"><span class="delimiter">&quot;</span><span class="content">gradle.plugin.com.energizedwork.webdriver-binaries:webdriver-binaries-gradle-plugin:</span><span class="inline"><span class="inline-delimiter">$</span>webdriverBinariesVersion</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="1"></i><b>(1)</b>
}
}
...
..
repositories {
...
}
apply <span class="key">plugin</span>:<span class="string"><span class="delimiter">&quot;</span><span class="content">idea</span><span class="delimiter">&quot;</span></span>
...
...
apply <span class="key">plugin</span>:<span class="string"><span class="delimiter">&quot;</span><span class="content">com.energizedwork.webdriver-binaries</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="1"></i><b>(1)</b>
dependencies {
...
testCompile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.grails.plugins:geb</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="4"></i><b>(4)</b>
testRuntime <span class="string"><span class="delimiter">&quot;</span><span class="content">org.seleniumhq.selenium:selenium-chrome-driver:</span><span class="inline"><span class="inline-delimiter">$</span>seleniumVersion</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="5"></i><b>(5)</b>
testRuntime <span class="string"><span class="delimiter">&quot;</span><span class="content">org.seleniumhq.selenium:selenium-firefox-driver:</span><span class="inline"><span class="inline-delimiter">$</span>seleniumVersion</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="5"></i><b>(5)</b>
testRuntime <span class="string"><span class="delimiter">&quot;</span><span class="content">org.seleniumhq.selenium:selenium-safari-driver:</span><span class="inline"><span class="inline-delimiter">$</span>seleniumSafariDriverVersion</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="5"></i><b>(5)</b>
testCompile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.seleniumhq.selenium:selenium-remote-driver:</span><span class="inline"><span class="inline-delimiter">$</span>seleniumVersion</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="5"></i><b>(5)</b>
testCompile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.seleniumhq.selenium:selenium-api:</span><span class="inline"><span class="inline-delimiter">$</span>seleniumVersion</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="5"></i><b>(5)</b>
testCompile <span class="string"><span class="delimiter">&quot;</span><span class="content">org.seleniumhq.selenium:selenium-support:</span><span class="inline"><span class="inline-delimiter">$</span>seleniumVersion</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="5"></i><b>(5)</b>
}
webdriverBinaries {
chromedriver <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">$</span>chromeDriverVersion</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="2"></i><b>(2)</b>
geckodriver <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">$</span>geckodriverVersion</span><span class="delimiter">&quot;</span></span> <i class="conum" data-value="3"></i><b>(3)</b>
}
tasks.withType(Test) {
systemProperty <span class="string"><span class="delimiter">&quot;</span><span class="content">geb.env</span><span class="delimiter">&quot;</span></span>, <span class="predefined-type">System</span>.getProperty(<span class="string"><span class="delimiter">'</span><span class="content">geb.env</span><span class="delimiter">'</span></span>)
systemProperty <span class="string"><span class="delimiter">&quot;</span><span class="content">geb.build.reportsDir</span><span class="delimiter">&quot;</span></span>, reporting.file(<span class="string"><span class="delimiter">&quot;</span><span class="content">geb/integrationTest</span><span class="delimiter">&quot;</span></span>)
systemProperty <span class="string"><span class="delimiter">&quot;</span><span class="content">webdriver.chrome.driver</span><span class="delimiter">&quot;</span></span>, <span class="predefined-type">System</span>.getProperty(<span class="string"><span class="delimiter">'</span><span class="content">webdriver.chrome.driver</span><span class="delimiter">'</span></span>)
systemProperty <span class="string"><span class="delimiter">&quot;</span><span class="content">webdriver.gecko.driver</span><span class="delimiter">&quot;</span></span>, <span class="predefined-type">System</span>.getProperty(<span class="string"><span class="delimiter">'</span><span class="content">webdriver.gecko.driver</span><span class="delimiter">'</span></span>)
}</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">gradle.properties</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">gebVersion=2.3
seleniumVersion=3.12.0
webdriverBinariesVersion=1.4
hibernateCoreVersion=5.1.5.Final
chromeDriverVersion=2.44 <i class="conum" data-value="2"></i><b>(2)</b>
geckodriverVersion=0.23.0 <i class="conum" data-value="3"></i><b>(3)</b>
seleniumSafariDriverVersion=3.14.0</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Includes <a href="https://plugins.gradle.org/plugin/com.energizedwork.webdriver-binaries">Webdriver binaries Gradle plugin</a>.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>Set the appropriate <a href="http://chromedriver.chromium.org">Webdriver for Chrome version</a>.</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>Set the appropriate <a href="https://github.com/mozilla/geckodriver/releases">Webdriver for Firefox version</a>.</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td>Includes the <a href="https://github.com/grails3-plugins/geb">Grails Geb Plugin dependency</a> which has a transitive dependency to <code>geb-spock</code>. This is the dependency necessary to work with <a href="http://www.gebish.org">Geb</a> and Spock.</td>
</tr>
<tr>
<td><i class="conum" data-value="5"></i><b>5</b></td>
<td>Selenium and different driver dependencies.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Create also a <a href="http://www.gebish.org/manual/current/#configuration">Geb Configuration</a> file at <code>src/integration-test/resources/GebConfig.groovy</code>.</p>
</div>
<div class="listingblock">
<div class="title">src/integration-test/resources/GebConfig.groovy</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">org.openqa.selenium.chrome.ChromeDriver</span>
<span class="keyword">import</span> <span class="include">org.openqa.selenium.chrome.ChromeOptions</span>
<span class="keyword">import</span> <span class="include">org.openqa.selenium.firefox.FirefoxDriver</span>
<span class="keyword">import</span> <span class="include">org.openqa.selenium.firefox.FirefoxOptions</span>
<span class="keyword">import</span> <span class="include">org.openqa.selenium.safari.SafariDriver</span>
environments {
<span class="comment">// You need to configure in Safari -&gt; Develop -&gt; Allowed Remote Automation</span>
safari {
driver = { <span class="keyword">new</span> SafariDriver() }
}
<span class="comment">// run via “./gradlew -Dgeb.env=chrome iT”</span>
chrome {
driver = { <span class="keyword">new</span> ChromeDriver() }
}
<span class="comment">// run via “./gradlew -Dgeb.env=chromeHeadless iT”</span>
chromeHeadless {
driver = {
ChromeOptions o = <span class="keyword">new</span> ChromeOptions()
o.addArguments(<span class="string"><span class="delimiter">'</span><span class="content">headless</span><span class="delimiter">'</span></span>)
<span class="keyword">new</span> ChromeDriver(o)
}
}
<span class="comment">// run via “./gradlew -Dgeb.env=firefoxHeadless iT”</span>
firefoxHeadless {
driver = {
FirefoxOptions o = <span class="keyword">new</span> FirefoxOptions()
o.addArguments(<span class="string"><span class="delimiter">'</span><span class="content">-headless</span><span class="delimiter">'</span></span>)
<span class="keyword">new</span> FirefoxDriver(o)
}
}
<span class="comment">// run via “./gradlew -Dgeb.env=firefox iT”</span>
firefox {
driver = { <span class="keyword">new</span> FirefoxDriver() }
}
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_deprecated_classes">Deprecated classes</h3>
<div class="paragraph">
<p>The following classes, which were deprecated in Grails 3.x, have been removed in Grails 4. Please, check the list below to find a suitable replacement:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Removed Class</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Alternative</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.UniqueConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.builtin.UniqueConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.util.BuildScope</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.transaction.GrailsTransactionTemplate</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.gorm.transactions.GrailsTransactionTemplate</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.transaction.transform.RollbackTransform</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.transactions.transform.RollbackTransform</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.transaction.NotTransactional</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.gorm.transactions.NotTransactional</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.transaction.Rollback</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.gorm.transactions.Rollback</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.transaction.Transactional</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.gorm.transactions.Transactional</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.config.FlatConfig</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.core.metaclass.MetaClassEnhancer</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Use traits instead.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.core.util.ClassPropertyFetcher</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.mapping.reflect.ClassPropertyFetcher</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.transaction.transform.TransactionalTransform</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.transactions.transform.TransactionalTransform</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.core.ComponentCapableDomainClass</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.core.GrailsDomainClassProperty</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Use the <code>org.grails.datastore.mapping.model.MappingContext</code> API instead</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.core.DefaultGrailsDomainClassProperty</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.core.MetaGrailsDomainClassProperty</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.core.support.GrailsDomainConfigurationUtil</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Use the <code>org.grails.datastore.mapping.model.MappingContext</code> and <code>org.grails.datastore.mapping.model.MappingFactory</code> APIs instead</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.plugins.domain.DomainClassPluginSupport</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.plugins.domain.support.GormApiSupport</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.plugins.domain.support.GrailsDomainClassCleaner</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Handled by <code>org.grails.datastore.mapping.model.MappingContext</code> now</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.validation.AbstractConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Use <code>org.grails.datastore.gorm.validation.constraints.AbstractConstraint</code> instead</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.validation.AbstractVetoingConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"> <code>org.grails.datastore.gorm.validation.constraints.AbstractVetoingConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.validation.CascadingValidator</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.gorm.validation.CascadingValidator</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.validation.ConstrainedProperty</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.gorm.validation.ConstrainedProperty</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.validation.Constraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.gorm.validation.Constraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.validation.ConstraintFactory</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.factory.ConstraintFactory</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.validation.VetoingConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.gorm.validation.VetoingConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.validation.ConstraintException</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.BlankConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.BlankConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.ConstrainedPropertyBuilder</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.builder.ConstrainedPropertyBuilder</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.ConstraintDelegate</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.ConstraintsEvaluatorFactoryBean</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.eval.ConstraintsEvaluator</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.CreditCardConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.CreditCardConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.DefaultConstraintEvaluator</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.eval.DefaultConstraintEvaluator</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.DomainClassPropertyComparator</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.EmailConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.EmailConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.GrailsDomainClassValidator</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.gorm.validation.PersistentEntityValidator</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.InListConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.InListConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.MatchesConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.MatchesConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.MaxConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.MaxConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.MaxSizeConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.MaxSizeConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.MinConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.MinConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.MinSizeConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.MinSizeConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.NotEqualConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.NotEqualConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.NullableConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.NullableConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.RangeConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.RangeConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.ScaleConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.ScaleConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.SizeConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.SizeConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.UrlConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.UrlConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.ValidatorConstraint</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.datastore.gorm.validation.constraints.ValidatorConstraint</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.routines.DomainValidator</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Replaced by newer version of commons-validation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.routines.InetAddressValidator</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Replaced by newer version of commons-validation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.routines.RegexValidator</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Replaced by newer version of commons-validation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.routines.ResultPair</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Replaced by newer version of commons-validation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.grails.validation.routines.UrlValidator</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Replaced by newer version of commons-validation</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.web.JSONBuilder</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>groovy.json.StreamingJsonBuilder</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_grails_java8">Grails-Java8</h3>
<div class="paragraph">
<p>For those who have added a dependency on the <code>grails-java8</code> plugin, all you should need to do is simply remove the dependency. All of the classes in the plugin have been moved out to their respective projects.</p>
</div>
</div>
<div class="sect2">
<h3 id="_profiles_deprecation">Profiles Deprecation</h3>
<div class="paragraph">
<p>A few of the profiles supported in Grails 3.x will no longer be maintained going forward and as a result it is no longer possible to create applications when them in the shorthand form. When upgrading existing projects, it will be necessary to supply the version for these profiles.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>org.grails.profiles:angularjs</code> &#8594; <code>org.grails.profiles:angularjs:1.1.2</code></p>
</li>
<li>
<p><code>org.grails.profiles:webpack</code> &#8594; <code>org.grails.profiles:webpack:1.1.6</code></p>
</li>
<li>
<p><code>org.grails.profiles:react-webpack</code> &#8594; <code>org.grails.profiles:react-webpack:1.0.8</code></p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_scheduled_methods">Scheduled Methods</h3>
<div class="paragraph">
<p>In Grails 3 no configuration or additional changes were necessary to use the Spring <code>@Scheduled</code> annotation. In Grails 4 you must apply the <code>@EnableScheduling</code> annotation to your application class in order for scheduling to work.</p>
</div>
</div>
<div style="clear:both;margin-top:15px;"></div>
<div class="toc-item prev-left"><a href="../guide/gettingStarted.html">&lt;&lt; <strong>2</strong><span>Getting Started</span></a></div>
<div class="toc-item next-right"><a href="../guide/conf.html"><strong>4</strong><span>Configuration</span> >></a></div>
<div style="clear:both"></div>
</div>
</td>
<td id="col2">
<div class="local clearfix">
<div class="local-title">
<a href="../guide/index.html" target="mainFrame">Quick Reference</a>
<span class="toggle">(<a href="#" onclick="localToggle(); return false;">hide</a>)</span>
</div>
<div class="menu">
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Command Line</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Command%20Line/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Command%20Line/bug-report.html">bug-report</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/clean.html">clean</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/compile.html">compile</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/console.html">console</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-app.html">create-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-command.html">create-command</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-controller.html">create-controller</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-domain-class.html">create-domain-class</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-functional-test.html">create-functional-test</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-hibernate-cfg-xml.html">create-hibernate-cfg-xml</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-integration-test.html">create-integration-test</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-interceptor.html">create-interceptor</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-plugin.html">create-plugin</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-profile.html">create-profile</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-script.html">create-script</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-service.html">create-service</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-taglib.html">create-taglib</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-unit-test.html">create-unit-test</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/dependency-report.html">dependency-report</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/docs.html">docs</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/generate-all.html">generate-all</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/generate-controller.html">generate-controller</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/generate-views.html">generate-views</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/help.html">help</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/install-templates.html">install-templates</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/list-plugins.html">list-plugins</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/list-profiles.html">list-profiles</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/package-plugin.html">package-plugin</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/package.html">package</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/plugin-info.html">plugin-info</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/profile-info.html">profile-info</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/run-app.html">run-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/run-command.html">run-command</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/run-script.html">run-script</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/schema-export.html">schema-export</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/shell.html">shell</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/stats.html">stats</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/stop-app.html">stop-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/test-app.html">test-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/war.html">war</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Constraints</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Constraints/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Constraints/attributes.html">attributes</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/bindable.html">bindable</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/blank.html">blank</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/creditCard.html">creditCard</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/email.html">email</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/inList.html">inList</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/matches.html">matches</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/max.html">max</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/maxSize.html">maxSize</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/min.html">min</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/minSize.html">minSize</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/notEqual.html">notEqual</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/nullable.html">nullable</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/range.html">range</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/scale.html">scale</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/size.html">size</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/unique.html">unique</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/url.html">url</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/validator.html">validator</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/widget.html">widget</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Controllers</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Controllers/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Controllers/actionName.html">actionName</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/allowedMethods.html">allowedMethods</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/bindData.html">bindData</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/chain.html">chain</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/controllerName.html">controllerName</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/defaultAction.html">defaultAction</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/errors.html">errors</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/flash.html">flash</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/forward.html">forward</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/grailsApplication.html">grailsApplication</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/hasErrors.html">hasErrors</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/header.html">header</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/namespace.html">namespace</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/params.html">params</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/redirect.html">redirect</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/render.html">render</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/request.html">request</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/respond.html">respond</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/response.html">response</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/responseFormats.html">responseFormats</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/scope.html">scope</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/servletContext.html">servletContext</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/session.html">session</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/withForm.html">withForm</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/withFormat.html">withFormat</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Database Mapping</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Database%20Mapping/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Database%20Mapping/autoImport.html">autoImport</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/autoTimestamp.html">autoTimestamp</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/batchSize.html">batchSize</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/cache.html">cache</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/cascade.html">cascade</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/column.html">column</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/comment.html">comment</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/discriminator.html">discriminator</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/dynamicInsert.html">dynamicInsert</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/dynamicUpdate.html">dynamicUpdate</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/fetch.html">fetch</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/id.html">id</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/ignoreNotFound.html">ignoreNotFound</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/indexColumn.html">indexColumn</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/insertable.html">insertable</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/joinTable.html">joinTable</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/lazy.html">lazy</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/order.html">order</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/sort.html">sort</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/table.html">table</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/type.html">type</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/updateable.html">updateable</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/version.html">version</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Domain Classes</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Domain%20Classes/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Domain%20Classes/addTo.html">addTo</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/attach.html">attach</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/belongsTo.html">belongsTo</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/clearErrors.html">clearErrors</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/constraints.html">constraints</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/count.html">count</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/countBy.html">countBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/createCriteria.html">createCriteria</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/delete.html">delete</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/discard.html">discard</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/embedded.html">embedded</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/errors.html">errors</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/executeQuery.html">executeQuery</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/executeUpdate.html">executeUpdate</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/exists.html">exists</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/fetchMode.html">fetchMode</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/find.html">find</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findAll.html">findAll</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findAllBy.html">findAllBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findAllWhere.html">findAllWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findBy.html">findBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrCreateBy.html">findOrCreateBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrCreateWhere.html">findOrCreateWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrSaveBy.html">findOrSaveBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrSaveWhere.html">findOrSaveWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findWhere.html">findWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/first.html">first</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/get.html">get</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/getAll.html">getAll</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/getDirtyPropertyNames.html">getDirtyPropertyNames</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/getPersistentValue.html">getPersistentValue</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/hasErrors.html">hasErrors</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/hasMany.html">hasMany</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/hasOne.html">hasOne</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/ident.html">ident</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/instanceOf.html">instanceOf</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/isAttached.html">isAttached</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/isDirty.html">isDirty</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/last.html">last</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/list.html">list</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/listOrderBy.html">listOrderBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/load.html">load</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/lock.html">lock</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/mapWith.html">mapWith</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/mappedBy.html">mappedBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/mapping.html">mapping</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/merge.html">merge</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/namedQueries.html">namedQueries</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/properties.html">properties</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/read.html">read</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/refresh.html">refresh</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/removeFrom.html">removeFrom</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/save.html">save</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/transients.html">transients</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/validate.html">validate</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/where.html">where</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/whereAny.html">whereAny</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withCriteria.html">withCriteria</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withNewSession.html">withNewSession</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withSession.html">withSession</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withTransaction.html">withTransaction</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Plug-ins</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Plug-ins/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Plug-ins/URL%20mappings.html">URL mappings</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/codecs.html">codecs</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/controllers.html">controllers</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/core.html">core</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/dataSource.html">dataSource</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/domainClasses.html">domainClasses</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/hibernate.html">hibernate</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/i18n.html">i18n</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/logging.html">logging</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/scaffolding.html">scaffolding</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/services.html">services</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/servlets.html">servlets</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Services</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Services/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Services/scope.html">scope</a>
</div>
<div class="menu-item"><a href="../ref/Services/transactional.html">transactional</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Servlet API</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Servlet%20API/request.html">request</a>
</div>
<div class="menu-item"><a href="../ref/Servlet%20API/response.html">response</a>
</div>
<div class="menu-item"><a href="../ref/Servlet%20API/servletContext.html">servletContext</a>
</div>
<div class="menu-item"><a href="../ref/Servlet%20API/session.html">session</a>
</div>
</div>
</div>
</div>
</div>
</td>
</tr>
</table>
<div id="footer">
Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.
</div>
<script type="text/javascript" src="../js/docs.js"></script>
</body>
</html>