Summary
The focus of the 4.0 release is on improving REST support. The following changes are part of FW/1 4.0, DI/1 1.2.0, and cfmljure 1.1.0.
- JSON-encoded and URL-encoded POST / PUT body support.
- Controllers have easy access to HTTP headers.
- Builder syntax for
renderData()result elements. - Support for user-supplied rendering functions.
- Integrated support for HTTP
OPTIONSverb. - Per-resource error handling.
- Setting status text (in addition to status code) in HTTP responses.
- Wildcard HTTP method support.
In addition, DI/1 has had a number of enhancements, including the addition of a builder syntax for programmatically declaring beans.
Breaking Changes
- 443 - Prevented
loadListenerfrom being accidentally inherited and run on a managed subsystem bean factory (it should only run on the main parent factory). This is potentially breaking: if you relied on running load listeners multiple times – however, that was never a recommended approach. - 400 - By default,
propertydeclarations that contain atypeordefaultare now ignored for autowiring. In earlier versions of FW/1 (DI/1), suchpropertydeclarations would have been treated as dependencies and autowired: you could override that behavior for typed properties by specifyingomitTypedProperties : truein your configuration. That is now the default behavior. In addition a newomitDefaultedPropertiessetting has been added, also defaulted totrue, which is what tells FW/1 (DI/1) to ignorepropertydeclarations that contain adefault. If you need to restore the pre-4.0 behavior, addomitDefaultedPropertiesand/oromitTypedPropertiesto your configuration, set tofalse. - 391 - Adobe ColdFusion 9.0.2 is no longer a supported platform. FW/1 4.0 relies on closure support and therefore requires Adobe ColdFusion 10 or later. Support for Railo and Lucee has not changed.
- 390 - If you override
missingBean()in DI/1, read the documentation carefully as this is now an official extension point with different behavior to previous releases.
Enhancements
- 448 - Added
callClojure()extension point forcljcontroller.cfc. - 442 - In Alpha 1 and Beta 1, the
decodeRequestBodysetting was calledenableJSONPOST. As a migration aid, attempting to setenableJSONPOSTwill throw an exception saying you should usedecodeRequestBodyinstead. - 441 -
decodeRequestBodyhandles URL-encoded form variables, which is typical for PUT, as well as JSON-encoded form bodies (see issue 389 below for the introduction of this setting). - 439 - Add
framework.facadecomponent to make FW/1 accessible out-of-band (for integration purposes). - 434 - Add
getRoutePath()convenience method. - 419 - Add
getCGIRequestMethod()convenience method. - 418 - Allow
factoryBean()to accept function/closure. - 417 - Add builder syntax for bean declarations.
- 416 - Delay bean discovery (where possible) until after declarations are processed.
- 415 - Add support for CFML-only and Clojure-only search paths.
- 414 - Add support for Boot to cfmljure.
- 413 -
layout()may now be called from controllers. - 412 - Add
renderer()to accessrenderData()builder and addheader()to set HTTP response headers. - 411 - Add
headersargument to controllers. - 410 - Clarified license (Apache Source License 2.0), added LICENSE file.
- 409 - Dependency injection uses additional caches to improve
getBean()performance (by a factor of 9x-25x, depending on your usage and your CFML engine). - 407 - DI/1 now has a public
hasParent()predicate method. - 400 - Dependency injection ignores typed/defaulted properties by default. This can be disabled via the
omitDefaultedPropertiesandomitTypedPropertiessettings. - 399 -
getBean()now accepts an optional second argument that can override beans in the factory to provide constructor arguments to be used in the bean’sinit()call. - 394 - Improved error messages when DI/1 attempts to use a CFC that has syntax errors to include filename/line number of the underlying error.
- 392 - A wildcard resource match is generated for
$RESOURCESto provide per-resource error handling. This can be disabled via theperResourceErrorsetting. - 390 - DI/1 now considers
missingBean()to be a fully supported extension point that allows users to handlinggetBean()calls for unknown beans by any means, including creating and returning their own beans. - 389 - A new setting
decodeRequestBodytells FW/1 to deserialize the JSON-encoded body of an HTTP request. - 388 - The
statusCodeandjsonpCallbackarguments torenderData()have been deprecated and a new builder syntax has been added to support all possible parameters available when rendering data, e.g.,renderData( "json" ).data( result ).statusCode( 202 ). - 387 - A new setting
preflightOptionstells FW/1 to provide built-in support for HTTPOPTIONS. An additional settingoptionsAccessControlallows you to fine tune theAccess-Control-*headers returned. - 386 - Routes can now have
$*as an explicit wildcard for the HTTP method. - 385 - The new
renderData()build syntax supportsstatusText()to set the HTTP response status text. - 328 - The
renderData()typemay be a function/closure that returnscontentType, renderedcontent, and an optionalwriterfor delivering the data to the browser.
Bug Fixes
- 449 - Fix race condition in DI/1’s bean resolution caching.
- 446 - Fix bug in
$RESOURCESwhennestedresource appeared in multipleresources. - 440 - Improved thread safety on application reloading. Even
reloadApplicationOnEveryRequest : trueshould be safe now! - 429 - Removed
expandPath()in calls tocachedFileExists(). - 427 - Fixed bug that prevented
before()/after()working in Clojure controllers; fixed bug that caused Clojure controller shims to be created twice. - 422 - Fix bug with case insensitive routes.
- 420 - Fix bug in transient autowiring (caused by caching metadata).
- 395 - Corrected calls to
buildURL()in examples.