All the major information about ColdBox Releases
ColdBox is maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered in the following format:
And constructed with the following guidelines:
Breaking backward compatibility bumps the major (and resets the minor and patch)
New additions without breaking backward compatibility bump the minor (and resets the patch)
Bug fixes and misc changes bump the patch
For all ColdBox releases, updates are provided for 12 months, and security fixes are provided for 2 years after the next major release.
6.x
2022
2023
2025
7.x
2023
2024
2026
8.x
2024
2025
2027
9.x
2025
2026
2028
In this section, you will find the release notes and links for each version's documentation. If you are looking for the release notes of previous major versions, use the version switcher at the top left of this documentation book.
Version 3.0 - March 2011
Version 2.0 - April 2007
Version 1.0 - June 2006
March 2, 2025
COLDBOX-1293 DBAppender with SQL Server Not Compatible with Adobe 2023
COLDBOX-1270 Abililty to restart schedulers with a restart()
method
COLDBOX-1268 WireBox Singleton auto reload now only affects app singletons and not core singletons
COLDBOX-1269 Do not add double headers if `event.setHTTPHeader()
` is called more than once
COLDBOX-1273 Removal of deprecated CFML functions in core
COLDBOX-1275 Improved engine detection by the CFMLEngine feature class
COLDBOX-1278 Remove unsafe evaluate
function usage
COLDBOX-1266 Logger for MS SQL using date
not datetime
.
COLDBOX-1267 Lucee only isEmpty
function call
COLDBOX-1279 Render encapsulator bleed of this scope by engines
November 18, 2023
Welcome to ColdBox 7.2.0, which packs a big punch on stability and tons of new features.
A new helper has been born that assists you with dealing with Database Schema-related methods that are very common and core to ColdBox and supporting modules. This will grow as needed and be decoupled to its own module later.
hasTable()
hasColumn()
getDatabaseInfo()
getTextColumnType()
getDateTimeColumnType()
getQueryParamDateTimeType()
allApply()
error handlersThe allApply()
is great when dealing with async operations on arrays or collections of objects. However, if something blows up, it would blow up with no way for you to log in or know what happened. However, now you can pass an errorHandler
argument which is a UDF/closure that will be attached to the onException()
method of the future object. This way, you can react, log, or recover.
All scheduled tasks now have a group
property so you can group your tasks. This is now available when creating tasks or setting them manually.
You can then get the group using the getGroup()
method or it will be added to all task metadata and stats.
everySecond()
periodA new period method shortcut: everySecond()
. Very useful so you can fill up your logs with data.
All task results, if any, are now stored in a ColdBox Optional. Which is a class that can deal with nulls gracefully and it's very fluent:
A container object which may or may not contain a non-null value. If a value is present, isPresent()
will return true
and get()
will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orElse()
(return a default value if value not present) and ifPresent()
(execute a block of code if the value is present). See https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
New method to get the last result, if any, from a task via the getLastResult()
method.
Lot's of great new methods and goodies so you can deal with date and times and timezones Oh My!
now( [timezone] )
getSystemTimezoneAsString()
getLastBusinessDayOfTheMonth()
getFirstBusinessDayOfTheMonth()
dateTimeAdd()
timeUnitToSeconds()
validateTime()
getIsoTime()
toInstant()
toLocalDateTime()
parse()
toLocalDate()
getTimezone()
getSystemTimezone()
toJavaDate()
duration()
period()
If in your binder you declare aspects or AOP bindings. Then WireBox will automatically detect it and load the AOP Mixer listener for you. You no longer have to declare it manually.
You can now configure CacheBox by just passing a struct of CacheBox DSL config data:
https://cachebox.ortusbooks.com/configuration/cachebox-configuration
You can now configure LogBox by just passing a struct of LogBox DSL config data:
https://logbox.ortusbooks.com/configuration/configuring-logbox
When you declare categories in LogBox you usually choose the appenders to send messages to, but you could never exclude certain ones. Now you can use the exclude
property:
You now have two new event listeners that all LogBox appenders can listen to:
preProcessQueue( queue, context )
: Fires before a log queue is processed element by element.
postProcessQueue( queue, context )
: After the log queue has been processed and after the listener has slept.
processQueueElement
receives the queueThe processQueueElement( data, context, queue )
now receives the entire queue as well as the queue
third argument.
If you use the RollingFileAppender
the default layout format of the archive package was static and you could not change it. The default is:
Now you have the power. You can set a property for the appender called archiveLayout
which maps to a closure/UDF that will build out the layout of the file name.
The full release notes per library can be found below. Just click on the library tab and explore their release notes:
COLDBOX-1248 Scheduled tasks now get a `group` property so you can use it for grouping purposes
COLDBOX-1252 New `now()` method in the DateTmeHelper with optional TimeZone
COLDBOX-1253 New datetimehelper method: getSystemTimezoneAsString()
COLDBOX-1256 New ScheduledTask helper: getLastResult() to get the latest result
COLDBOX-1257 LastResult is now a cbproxies Optional to denote a value or not (COMPAT)
COLDBOX-1258 new scheduledTask method: isEnabled() to verify if the task is enabled
COLDBOX-1259 Complete rewrite of Scheduled Task setNextRuntime() calculations to account for start end running scenarios
COLDBOX-1260 new ScheduledTask period : everySecond()
COLDBOX-1262 New SchemaInfo helper to help interrogate databases for metadata
COLDBOX-1263 Add an errorHandler to the allApply method so you can attach your own error handler to each future computation
COLDBOX-1246 casting to long instead of int when using LocalDateTime and plus methods to avoid casting issues.
COLDBOX-1247 Do not expose restful handler exception data unless you are in debug mode
COLDBOX-1250 RestHandler.cfc should catch NotAuthorized exception
COLDBOX-1254 getFirstBusinessDayOfTheMonth(), getLastBusinessDayOfTheMonth() now refactored to the dateTimeHelper
COLDBOX-1255 validateTime() is now a helper method in the DateTimeHelper
COLDBOX-1261 Migration of old tasks to new task syntax of task()
COLDBOX-1241 Scheduled Task Stats "NextRun", "Created", "LastRun" Using Wrong Timezones
COLDBOX-1244 onSessionEnd Error when using Coldbox_App_Key
COLDBOX-1245 Scheduled task isConstrainted() on day of the month was calculating the days in month backwards
COLDBOX-1251 set next run time when using first or last business day was not accounting times
WIREBOX-61 Make wirebox.system.aop.Mixer
listener load automatically if any aspects are defined/mapped
CACHEBOX-70 Support ad-hoc struct literal of CacheBox DSL to configure CacheBox
LOGBOX-75 New listeners for all appenders: preProcessQueue() postProcessQueue()
LOGBOX-76 Add the queue as an argument to the processQueueElement() method
LOGBOX-79 new rolling appender property archiveLayout
which is a closure that returns the pattern of the archive layout
LOGBOX-73 Unhandled race conditions in FileRotator lead to errors and potential log data loss
LOGBOX-77 log rotator was not checking for file existence and 1000s of errors could be produced
LOGBOX-62 Support ad-hoc struct literal of LogBox DSL to configure LogBox
LOGBOX-70 Add `Exclude` key to Logbox Categories to Easily Exclude Appenders
LOGBOX-74 shutdown the appenders first instead of the executors to avoid chicken and egg issues
LOGBOX-78 Change fileMaxArchives default from 2 to 10
LOGBOX-72 Removal of instance approach in preferences to accessors for the LogBoxConfig
August 3, 2023
This is a minor release with tons of updates and bug fixes.
You can now add a debug
argument to your task definitions, and your console will add tons of debugging for your tasks:
You can now use this matcher to test relocations in a nice fluent expectation:
Thanks to our very own Gavin Pickin you can now create exception handlers in your REST Handlers that follow the on{type}Exception()
convention and you can listen to specific error type exceptions:
The full release notes per library can be found below. Just click on the library tab and explore their release notes:
Bug
COLDBOX-1233 Exception bean can't cast `"i"` to a number value
New Feature
COLDBOX-1229 Added debug argument to ScheduleExecutor and Scheduler when creating tasks for consistency
COLDBOX-1230 Reorganized ScheduledTasks functions within the CFC into code groups and comments
COLDBOX-1235 New StringUtil.prettySQL
method for usage in debugging and whoops reports
COLDBOX-1238 New testing matcher: toRedirectTo
for easier testing against relocations
COLDBOX-1239 New REST convention for custom error handlers: `on{errorType}Exception()`
Improvements
COLDBOX-1041 Logging category in ColdBox scheduler is generic
COLDBOX-1231 Improve RestHandler Exception handler with on#ExceptionType#Exception() convention
COLDBOX-1234 Account for null or empty incoming json to prettyjson output
COLDBOX-1236 Incorporate appName into the appHash to give more uniqueness to locks internally
Tasks
COLDBOX-1237 Removal of Lucee RC tests - no longer needed
Bug
WIREBOX-148 Several AOP and Internal WireBox methods not excluded from delegations
WIREBOX-150 Wirebox standalone is missing delegates
WIREBOX-151 Injections are null, sometimes
WIREBOX-152 getEnv
errors in Binder context
WIREBOX-154 populateFromQuery delegate defaulting composeRelationships to true
Improvement
WIREBOX-147 Improve debug logging to not send the full memento on several debug operations
Task
WIREBOX-149 `toWebservice()` is now deprecated
Discover the power of ColdBox 7.0.0
ColdBox 7.0.0 is a major release for the ColdBox HMVC platform. It has some dramatic new features as we keep pushing for more modern and sustainable approaches to web development and tons of bug fixes and improvements.
We break down the major areas of development below, and you can also find the full release notes per library at the end.
This release drops support for Adobe 2016 and adds support for Adobe 2023 and Lucee 6 (Beta). Please note that there are still issues with Adobe 2023 as it is still in Beta.
We now have an official CLI for ColdBox, which lives outside CommandBox. It will always be included with CommandBox, but it now has its own life cycles, and it will support each major version of ColdBox as well.
The new CLI has all the previous goodness but now also v7 support and many other great features like migration creation, API testing, and more. You can find the source for the CLI here: https://github.com/coldbox/coldbox-cli
We have updated our VSCode ColdBox extension now to support the latest version of snippets and skeletons for code generation.
All the application templates have been updated in our ColdBox Templates Org: https://github.com/coldbox-templates. They have been updated to support our LTS strategy, so now we can have templates based on each major iteration of ColdBox.
Here is a listing of the latest supported templates:
Default
default
The default ColdBox application template
Elixir
elixir
The default
template with ColdBox elixir support for asset pipelines
Modern (experimental)
modern
A fresh new approach to ColdBox applications that are non-root based. Still experimental
Rest
rest
A base REST API using ColdBox
Rest HMVC
rest-hmvc
An HMVC REST API using modules
Super Simple
supersimple
Barebones conventions baby!
WireBox has gotten tons of love in this release, with several additions, bug fixes, and improvements.
This feature is one of the most impactful for applications that leverage DI on transient objects, especially ORM-related applications. WireBox will now, by default, cache the signatures of the injections and delegations for you, so they are only done once per instance type. This addition has brought speed improvements of over 585% in Lucee and Adobe ColdFusion. You read that right, 585% performance increases. This is really a game changer for ORM-heavy applications that use DI and delegations. Go try it; you don't have to do a thing. Install and run it!
If this is not for you or there are issues in your system because of it, we have a setting for it to turn it off. Open the WireBox.cfc
binder and add it as a config item.
You can also disable the cache on a per-CFC basis by using the transientCache=false
annotation in your component declaration:
Even though the transient cache can help tremendously with performance, there is a price to pay. All the injections and delegations will be cached on a per-cfc definition basis. Thus, if you are injecting transients, those transients will become singletons. Therefore you have two options to alleviate this side effect:
Disable the cache entirely (The heavy-handed approach)
Disable the cache on that specific entity via the transientCache
annotation (The surgical approach)
Add the transient injection as a provider
injection (The ninja approach)
Add the property as a lazy property and add a builder that will construct it when called (The Jedi approach)
WireBox Delegators
WireBox supports the concept of object delegation in a simple, expressive DSL. You can now add a delegate
annotation to injections or use the delegates
annotations to components to inject and absorb the object's methods into yourself.
In object-oriented programming, an object delegator is a programming technique where an object delegates some of its responsibilities to another object. The delegating object passes the responsibility for handling a particular task to the delegate object. This allows the delegating object to focus on its core responsibilities while the delegate object handles the delegated task.
Basically, a way to inject/proxy calls from one object to the other and avoid the overuse of inheritance, and avoid runtime mixins. WireBox provides a set of rules for method lookup and dispatching that will allow you to provide delegation easily in your CFML applications. This feature is similar to traits in PHP or object delegators in Kotlin.
You can use it to encapsulate behavior on small, focused, and testable classes that can be brought in as traits into ANY component without abusing inheritance. In contrast, object delegation is a more flexible approach that allows objects to delegate tasks to any other object, regardless of its class hierarchy. Finally, object delegation can help to improve code performance by allowing objects to use specialized delegate objects for specific tasks.
Let's look at an example of how we would use delegation without this feature:
Now let's look at the computer
As you can see, in the traditional approach we must type and inject and know every detail of the delegated methods. Now let's delegalize it via WireBox:
Or use the shorthand notation via the delegates
annotation of components:
You can also do prefixes, suffixes, method includes, excludes, and even add as many delegates as you want:
Read more about delegates here: https://wirebox.ortusbooks.com/usage/wirebox-delegators
Core Delegates
Now that we have seen what delegators are, WireBox offers core delegators to your application via the @coreDelegates
namespace
Async - This delegate is useful to interact with the AsyncManager and the most used functionality for asynchronous programming
DateTime - Leverage the date time helper
Env - Talk to environment variables
Flow - Several fluent flow methods
JsonUtil - JSON utilities
StringUtil - String utilities
Population - Population utilities
So let's say you have a service that needs to populate objects and work with the system environment:
WireBox Property Observers
WireBox supports the concepts of component property observers. Meaning that you can define a function that will be called for you when the setter
for that property has been called and thus observe the property changes.
You will accomplish this by tagging a property with an annotation called observed
then by convention, it will look for a function called: {propertyName}Observer
by convention. This function will receive three arguments:
newValue
: The value is set into the property
oldValue
: The old value of the property, including null
property
: The name of the property
If you don’t like the convention and want to name the function as you see fit, then you can place the value of the observed annotation as the function's name to call.
property name="data" observed="myObserver"
Read more here: https://wirebox.ortusbooks.com/advanced-topics/property-observers
WireBox Lazy Properties
WireBox supports the concept of marking properties in your components as lazy
. This will allow the property to be constructed ONCE when requested ONLY (lazy loaded). This way, you can take advantage of the construction of the property being lazy-loaded.
Internally, we will generate a getter method for you that will make sure to construct your property via a builder function you will provide, lock the request (by default), store it in the variables
scope, and return it to you.
Note: With lazy properties, you must use the getter only to retrieve the property
Read more about Lazy Properties here: https://wirebox.ortusbooks.com/advanced-topics/lazy-properties
onInjectorMissingDependency
eventA new event called onInjectorMissingDependency
is now registered in Wirebox. It will be called whenever a dependency cannot be located. The data
sent into the event will contain:
name - The name of the requested dependency
initArguments - The init
arguments, if passed
targetObject - The target object that requested the dependency
injector - The injector in use building the dependency
If you return in the data
struct an element called, instance
we will return that as the dependency, else the normal exception will be thrown.
The object populator now caches ORM entity maps, so they are only loaded once, and the population with ORM objects accelerates tremendously.
The object populator caches relational metadata for a faster population of the same type of objects
this.population
This new convention allows for objects to encapsulate the way the mass population of data is treated. This way, you don’t have to scrub or pass include excludes lists via population arguments; it can all be nicely encapsulated in the targeted objects:
The populator will look for a this.population
struct with the following keys:
include
: an array of property names to allow population ONLY
exclude
: an array of property names to NEVER allow population
The population methods also get a new argument called: ignoreTargetLists
which defaults to false, meaning it inspects the objects for these population markers. If you pass it as true
then the markers will be ignored. This is great for the population of objects from queries or an array of structs or mementos that YOU have control of.
You can now instantiate an Injector with the binder
argument being the config structure instead of creating a binder. This will allow you to create injectors and pass the configuration structure as well:
Each injector can now have a human-friendly name via the name
property
You can also now use a clear( key )
method in ALL scopes so you can remove a-la-carte objects from any supported scope.
In a ColdBox or WireBox context, there will always be a root
injector in a hierarchy. This root injector can have children, and all of these children can have a direct link to its root via a hasRoot() and getRoot()
methods.
hasRoot()
getRoot()
setRoot()
There are also injection DSLs for retrieving the root injector:
Thanks to Giancarlo Gomez, scheduled tasks get a big revamp in ColdBox 7. Here are the updates:
annually
You can now task on an annual basis
delayTimeUnit
used to work with delays regardless of the setting in the chain
debug
used for debug output during task executions
firstBusinessDay
boolean to flag the task as on the first business day schedule
lastBusinessDay
boolean to flag the task as on the last business day schedule
taskTime
log of time of day for first business day and last business day tasks
startTime
limits tasks to run on or after a specific time of day
endTime
limits tasks to run on or before a specific time of day
meta
The user can use this struct to store any data for the task ( helpful for building UIs and not having to manage outside of the task )
stats.nextRun
ColdBox now determines the next run for the task in its scheduler interval
run( boolean force = false )
Added the force
argument, to allow running the task on demand, even if it is paused.
validateTime()
Sets minutes if missing from time entry and returns time value if successful - removes a lot of repetitive code
debug()
Used for setting debug setting ( can also be done in task init )
startOnTime()
used to set variables.startTime
endOnTime()
used to set variables.endTime
between()
used to set variables.startTime and variables.endTime in one call
setMeta()
used to set variables.meta
setMetaKey()
used to add / save a key to variables.meta
deleteMetaKey()
used to delete a key from variables.meta
getLastBusinessDayOfTheMonth()
getFirstBusinessDayOfTheMonth()
setInitialNextRunTime()
setInitialDelayPeriodAndTimeUnit()
setNextRunTime()
debugLog()
In ColdBox 7, you can now store the module configurations outside of the config/Coldbox.cfc
. Especially in an application with many modules and many configs, the modulesettings
would get really unruly and long. Now you can bring separation. This new convention will allow module override configurations to exist as their own configuration file within the application’s config folder.
The configuration CFC will have one configure()
method that is expected to return a struct of configuration settings as you did before in the moduleSettings
Just like a ModuleConfig
this configuration override also gets many injections:
This module configuration object will also inherit the ModuleConfig.cfc
behavior that if you create methods with the same name as the environment you are on, it will execute it for you as well.
Then you can change the original
struct as you see fit for that environment.
We have an experimental feature in ColdBox 7 to enable per-module injectors. This will create a hierarchy of injections and dependency lookups for modules. This is in preparation for future capabilities to allow for multi-named modules in an application. In order to activate this feature you need to use the this.moduleInjector = true
in your ModuleConfig.cfc
Once enabled, please note that your module injector will have a unique name, and a link to the parent and root injectors and will ONLY know about itself and its children. Everything will be encapsulated under itself. No more global dependencies, we are now in module-only dependencies. This means each module must declare its dependencies beforehand.
If the module injector is enabled, you will also get different injections in your ModuleConfig
binder
The root injector binder
rootWireBox
The root injector or global injector.
wirebox
This is now a reference to the module's injector.
The supertype also has methods to interact with the root and module injector getRootWireBox()
and getWireBox() for the module injector.
Every module also can inject/use its models
without the need to namespace them.
The injector will look into the models
of the module first and then it's children. Parent lookups are not guaranteed yet.
Please note that this is still experimental and there could be issues of not finding models or DSLs.
You can now use the {this}
placeholder in injections for module configurations-settings, and ColdBox will automatically replace it with the current module it's being injected in:
This is a great way to keep your injections clean without adhering to the module name.
listen()
OrderYou can now use listen( closure, point )
or listen( point, closure)
when registering closure interception points.
Since WireBox introduced delegates, we have taken advantage of this great reusable feature throughout ColdBox. We have also created several delegates for your convenience that can be used via its name and the @cbDelegates
namespace:
AppModes
Methods to let you know in which tier you are on and more
Interceptor
Announce interceptions
Locators
Locate files and/or directories
Population
Populate objects
Rendering
Render views and layouts
Settings
Interact with ColdBox/Module Settings
Let's say you have a security service that needs to get settings, announce events and render views:
Here you can find more information about the CBDelegates: https://s3.amazonaws.com/apidocs.ortussolutions.com/coldbox/7.0.0/coldbox/system/web/delegates/package-summary.html
In previous versions of ColdBox, it would auto-detect unique request identifiers for usage in Flash Ram, storages, etc., following this schema:
If we have session
enabled, use the jessionId
or session
URL Token
If we have cookies enabled, use the cfid/cftoken
If we have in the URL
the cfid/cftoken
Create a unique request-based tracking identifier: cbUserTrackingId
However, you can now decide what will be the unique identifier for requests, flash RAM, etc by providing it via a coldbox.identifierProvider
as a closure/lambda in your config/Coldbox.cfc
If this closure exists, ColdBox will use the return value as the unique identifier. A new method has also been added to the ColdBox Controller so you can retrieve this value:
The supertype as well so all handlers/layouts/views/interceptors can get the user identifier:
ColdBox 7 introduces opinionated helpers to the FrameworkSuperType
so you can determine if you are in three modes: production, development, and testing by looking at the environment
setting:
inProduction() == true
production
inTesting() == true
testing
inDevelopment() == true
development
or local
You can also find these methods in the controller
object.
These super-type methods delegate to the ColdBox Controller. So that means that if you needed to change their behavior, you could do so via a Controller Decorator.
You can also use them via our new AppModes@cbDelegates
delegate in any model:
When you register resourceful routes now, they will get assigned a name so you can use it for validation via routeIs()
or for route link creation via route()
GET
/photos
photos.index
photos
GET
/photos/new
photos.new
photos.new
POST
/photos
photos.create
photos
GET
/photos/:id
photos.show
photos.process
GET
/photos/:id/edit
photos.edit
photos.edit
PUT/PATCH
/photos/:id
photos.update
photos.process
DELETE
/photos/:id
photos.delete
photos.process
back()!
The framework super type now sports a back()
function so you can use it to redirect back to the referer in a request.
Here is the method signature:
RequestContext
Routing/Pathing EnhancementsThe RequestContext has a few new methods to assist you when working with routes, paths, and URLs.
routeIs( name ):boolean
Verify if the passed name
is the current route
getUrl( withQuery:boolean )
Returns the entire URL, including the protocol, host, mapping, path info, and query string.
getPath( withQuery:boolean )
Return the relative path of the current request.
getPathSegments():array
Get all of the URL path segments from the requested path.
getPathSegment( index, defaultValue )
Get a single path segment by position
The FrameworkSuperType
now has a getDateTimeHelper(), getIsoTime()
methods to get access to the ColdBox coldbox.system.async.time.DateTimeHelper
to assist you with all your date/time/timezone needs and generate an iso8601 formatted string from the incoming date/time.
You can also use the new date time helper as a delegate in your models:
Check out the API Docs for the latest methods in the helper
variables
Scope VariablesYou can now influence any view by injecting your own variables into a view's variables
scope using our new argument: viewVariables
. This is great for module developers that want native objects or data to exist in a view's varaibles
scope.
Then you can use the wire
and client
objects in your views natively:
Whoops got even more love:
SQL Syntax Highlighting
JSON Pretty Printing
JSON highlighting
Debug Mode to show source code
Production detection to avoid showing source code
Rendering performance improvements
The RESTFul handlers have been updated to present more useful debugging when exceptions are detected in any call to any resource. You will now get the following new items in the response:
environment
A snapshot of the current routes, URLs and event
exception
A stack frame, detail, and type
DebugMode
ColdBox now has a global debugMode
setting, which is used internally for presenting sources in Whoops and extra debugging parameters in our RESTFul handler. However, it can also be used by module developers or developers to dictate if your application is in debug mode or not. This is just a fancy way to say we trust the user doing the requests.
The default value is false
You also have a inDebugMode()
method in the main ColdBox Controller and the FrameworkSuperType that will let you know if you are in that mode or not.
You can also use the AppModes@cbDelegates
delegate to get access to the inDebugMode
and other methods in your models:
All integration tests now won't unload ColdBox after execution. Basically, the this.unloadColdBox = false
is now the default. This is to increase performance where each request run tries only to load the ColdBox virtual app once.
All test bundles now get a getEnv()
method to retrieve our environment delegate so you can get env settings and properties:
All logging messages in LogBox are now inspected for simplicity or complexity. If any extra argument is a complex variable, then LogBox will now serialize the output to JSON, and it will prettify it. This will allow for your log messages in your console to now look pretty!
If exception objects are being sent to any logger, LogBox will detect it and pretty print it back to the console instead of dumping a massive exception object.
In previous versions, you had to use the canxxxx
method to determine if you can log at a certain level:
In ColdBox 7, you can use a one-liner by leveraging a lambda function:
The RequestContext now has a setRequestTimeout()
function that can provide timeouts in your application, and when in testing mode, it will mock the request timeout. This is essential to encapsulate this setting as if you have requested timeout settings in your app; they will override the ones in testing.
You can find the release notes on the page below:
Release NotesRelease Notes for ColdBox 7.0.0
The full release notes per library can be found below. Just click on the library tab and explore their release notes:
COLDBOX-1079 Router resources doesn't seem to respect group() closures
COLDBOX-1100 Event Caching Does Not Preserve HTTP Response Codes
COLDBOX-1133 `getFullURL` encodes the query string when it should not.
COLDBOX-1136 Scoping lookup bug in Lucee affects route()
COLDBOX-1138 Event Cache Response Has Status Code of 0 (or Null)
COLDBOX-1139 make event caching cache keys lower cased to avoid case issues when clearing keys
COLDBOX-1143 render inline PDF (CB 6.8.1) throws a 500 error
COLDBOX-1145 RestHandler OnError() Exception not checking for empty `exception` blocks which would cause another exception on development ONLY
COLDBOX-1146 BiConsumer proxy was making both arguments required, when they can be null so execution fails
COLDBOX-1149 Woops and Adobe CF needs a double check if session/client is defined even if sessionManagement/clientManagement is defined
COLDBOX-1150 virtual app controller scoping is missing on ocassion due to this.load|unload flags
COLDBOX-1151 Integration Tests do not support NoRender()
COLDBOX-1153 RestHandler.cfc missing exception information on InvalidCredentials & TokenInvalidException
COLDBOX-1154 Invalid DateFormat Mask in Whoops.cfm
COLDBOX-1173 Update the Router.cfc to look at not only the cgi host but the forwarded hosts
COLDBOX-1175 calling function "view" from within function which has an argument named "view" causes error.
COLDBOX-1176 viewLocations struct does not exist in function renderer.layout() on line 684 if nolayout = true
COLDBOX-1191 Attempts to use `getHTMLBaseURL()` inside of Async Task Fail on ACF
COLDBOX-1193 Missing java casting on arrayRange() method ont the asyncmanager
COLDBOX-1194 Ensure modules are applied to routing action structs when necessary #243
COLDBOX-1196 Render collections items and counter variables are not thread safe since we migrated to a singleton renderer
COLDBOX-1202 urlMatches in the request context does not account for the path to be larger than the requested uri
COLDBOX-1204 Overridden events in preProcess interceptions assume event cache configuration of original request
COLDBOX-1211 Base Model and Interceptor Tests where overriding application.wirebox in integration tests
COLDBOX-1213 Var scoping issue on `includeUDF` in the super type
COLDBOX-1029 ModuleAwareness : Wirebox Injector Lookup Should Check Current Module First
COLDBOX-1155 Implement abort logic onAuthenticationFailure on RESTHandler
COLDBOX-1157 Reuse existing controller in getMockRequestContext()
COLDBOX-1159 JSON Serialization in `forAttribute` Does Not Support ACF Prefixing
COLDBOX-1171 Do not allow injection of the same applicatio helper on the same target
COLDBOX-1177 Please add more debugging info to REST handler
COLDBOX-1184 When whoops error template defaults to public for non-dev, the messaging is very confusing
COLDBOX-1185 ColdBox DebugMode with inDebugMode() helper
COLDBOX-1190 Reworking of several rest handler exception methods so they log the issues instead of announcing `onException` events and announce their appropriate events , onAuthenticationFailure, onAuthorizationFailure, onValidationException, onEntityNotFoundException
COLDBOX-1195 ColdBox Proxy should ignore the routing service captures to avoid redirects or returns
COLDBOX-1210 encapsulate route finding by name to the actual router itself
COLDBOX-1214 Compatibility layer for env methods in the Util object: getSystemSetting(), getSystemProperty(), getEnv()
COLDBOX-1022 Allow for Flash RAM to use a third party provided tracking variable via the new setting identifierProvider
COLDBOX-1039 Allow unregistering closure listeners
COLDBOX-1077 Provide ability for handlers/interceptors/etc. to have inherent self-knowledge of the module they live in for modulesettings/moduleConfig injections
COLDBOX-1137 Allow passing interception point first in interceptor listen() method
COLDBOX-1140 Whoops updates galore! SQL Syntax highlighting, json formatting and highlighting, and more
COLDBOX-1141 New Flow delegate helpers for functional usage everywhere in ColdBox land
COLDBOX-1142 New convention for module setting overrides: config/{moduleName}.cfc
COLDBOX-1147 PostLayoutRender and PostViewRender now pass which view/layout path was used to render
COLDBOX-1148 postEvent now get's new interceptData: ehBean, handler and data results
COLDBOX-1152 this.unloadColdBox is false now as the default thanks to the virtual test app
COLDBOX-1158 New `back()` function in super type that you can use to redirect back to your referer or a fallback
COLDBOX-1161 new toJson() helper in the Util class which is delegated in many locations around the framework to add struct based query serialization and no dubm security prefixes
COLDBOX-1162 Add in functionality to exclude patterns via router's findRoute()
COLDBOX-1164 New convention for coldfusion tags: includes/tags. Every ColdBox app will register that location as a repository for custom tags for your application
COLDBOX-1166 Lazy loading and persistence of engine helper to assist in continued performance and initial load speed
COLDBOX-1167 New core delegates for smaller building blocks, which leverages the `@coreDelegates` namespace
COLDBOX-1168 New coldbox based delegates mapped with `@cbDelegates`
COLDBOX-1172 core json utils now include a prettyJson() and a toPrettyJson() utilities
COLDBOX-1174 New getEnv() method on the base test class to get access to the env delegate for inquiring for env and java properties
COLDBOX-1178 ChronoUnit becomes the official cb Date Time Helper to assist with date/time conversions and formatting
COLDBOX-1179 New super type methods: getDateTimeHelper() getIsoTime() to assist with recurrent iso time conversions in modern APIs and responses
COLDBOX-1186 Add three environment location helpers in the controller and supertype: isProduction(), isDevelopment(), isTesting()
COLDBOX-1188 Request Context setRequestTimeout() method encapsulation, so you can control the time limit of a request
COLDBOX-1189 setRequestTimeout() mock in testing Request Context so handlers cannot override testing timeouts
COLDBOX-1192 Module Inception Isolation - every module has it's own injector that matches the module hierarchy
COLDBOX-1197 All rendering methods now accept a `viewVariables` argument that allows you to add variables into the view's `variables` scope
COLDBOX-1199 New request context method: `routeIs( name ):boolean` that evaluates if the passed name is the same as the current route
COLDBOX-1200 request context `getFullUrl()` renamed to `getUrl()`
COLDBOX-1201 request context `getFullPath()` renamed to `getPath()`
COLDBOX-1205 request context `event.getUrl( withQuery:true )` new argument `withQuery` to allow adding the query string or not
COLDBOX-1206 request context `event.getPath( withQuery:true )` new argument `withQuery` to allow adding the query string or not
COLDBOX-1207 New request context methods: `getPathSegments():array, getPathSegment( index, defaultValue ):string` so you can segment the incoming url path
COLDBOX-1208 Add `persist` and `persistStruct` to the `back()` method in the supertype
COLDBOX-1209 Add route names to resourceful routes according to conventions
COLDBOX-1215 this.moduleInjector enables modular injector hiearchy. By default it is false until ColdBox 8
COLDBOX-1216 New super type method: `getRootWireBox()` to get an instance of the root wirebox in the application
COLDBOX-1160 COMPAT: jsonQueryFormat has been removed in preference to "struct".
COLDBOX-1169 routes.cfm Support Removal
COLDBOX-1170 populateModel deprecated - refactored to just populate() in the supertype methods
COLDBOX-1187 Removal of uniqueUrls boolean indicator for URL routing, since Pretty URLs are now the standard. This rerouting feature needs to be removed.
WIREBOX-133 BeanPopulator renamed to ObjectPopulator to be consistent with naming
WIREBOX-132 WireBox caches Singletons even if their autowired dependencies throw exceptions.
WIREBOX-89 Wirebox - add onInjectorMissingDependency event
WIREBOX-130 Ability to remove specific objects from wirebox injector singleton's and request scopes via a `clear( key )` method
WIREBOX-131 Object Delegators
WIREBOX-134 Object Populator is now created by the Injector and it is now a singleton
WIREBOX-135 Object populator now caches orm entity maps, so they are ONLy loaded once and population with orm objects accelerates tremendously
WIREBOX-136 object populator cache relational metadata for faster population of the same objects
WIREBOX-137 New `this.population` marker for controlling mas population of objects. It can include an `include` and and `exclude` list.
WIREBOX-138 Lazy Properties
WIREBOX-139 Property Observers
WIREBOX-140 Transient request cache for injections and delegations
WIREBOX-141 New config setting transientInjectionCache to enable or disable globally, default is true
WIREBOX-142 You can now instantiate an Injector with the `binder` argument being the config structure instead of creating a binder
WIREBOX-143 New injection DSL for ColdBox Root Injector `coldbox:rootWireBox`
WIREBOX-144 Injectors can now track the root injector by having a root reference via `getRoot(), hasRoot()` methods
WIREBOX-145 New DSL for wirebox only root injectors: `wirebox:root`
CACHEBOX-83 Intermittent Exception from MetadataIndexer