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
OPTIONS
verb. - 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
loadListener
from 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,
property
declarations that contain atype
ordefault
are now ignored for autowiring. In earlier versions of FW/1 (DI/1), suchproperty
declarations would have been treated as dependencies and autowired: you could override that behavior for typed properties by specifyingomitTypedProperties : true
in your configuration. That is now the default behavior. In addition a newomitDefaultedProperties
setting has been added, also defaulted totrue
, which is what tells FW/1 (DI/1) to ignoreproperty
declarations that contain adefault
. If you need to restore the pre-4.0 behavior, addomitDefaultedProperties
and/oromitTypedProperties
to 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
decodeRequestBody
setting was calledenableJSONPOST
. As a migration aid, attempting to setenableJSONPOST
will throw an exception saying you should usedecodeRequestBody
instead. - 441 -
decodeRequestBody
handles 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.facade
component 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
headers
argument 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
omitDefaultedProperties
andomitTypedProperties
settings. - 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
$RESOURCES
to provide per-resource error handling. This can be disabled via theperResourceError
setting. - 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
decodeRequestBody
tells FW/1 to deserialize the JSON-encoded body of an HTTP request. - 388 - The
statusCode
andjsonpCallback
arguments 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
preflightOptions
tells FW/1 to provide built-in support for HTTPOPTIONS
. An additional settingoptionsAccessControl
allows 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()
type
may be a function/closure that returnscontentType
, renderedcontent
, and an optionalwriter
for delivering the data to the browser.
Bug Fixes
- 449 - Fix race condition in DI/1’s bean resolution caching.
- 446 - Fix bug in
$RESOURCES
whennested
resource appeared in multipleresources
. - 440 - Improved thread safety on application reloading. Even
reloadApplicationOnEveryRequest : true
should 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.