Reputation: 7027
The following is done comparing Coldfusion 9.0.1 against Railo 4.0.2.002
I have the following (truncated) as the init for a cfc
component {
public myComponent function init(
required string inSetting1,
required string inSetting2
) {
return this;
}
}
If I run the following, then it invokes correctly
objInstance = new myComponent(
inSetting1 = 'xxx',
inSetting2 = 'yyy'
);
However I am attempting to handle a misconfiguration requesting this object without all required arguments. So far I have got the following
try {
// inSetting2 is not defined == will cause error
objInstance = new myComponent(
inSetting1 = 'xxx'
);
} catch (coldfusion.runtime.MissingArgumentException e) {
// This catches the error for CF 9.0.1
} catch (expression e) {
// This catches the error for Railo 4.0.2
debug(e); // get the error dump for stack trace below
}
So far in place of expression
I have tried the following to no avail based off the opening railo.runtime.type.UDFImpl.defineArguments(UDFImpl.java:171)
from the stack trace (which is how I retrieved the specific type for CF9)
Now while I could just do catch (expression e)
or even catch (any e)
, I would much rather be able to catch the specific errors for the simple reason that in some locations within the components which I am currently updating to work with Railo it has relied on being able to determine the reason for failure to be able to differentiate configuration errors (missing arguments) from deployment errors (missing template).
So, is anyone aware of a method by which I could make the above try/catch look specifically for an equivilant of coldfusion.runtime.MissingArgumentException
(or for that matter, a method by which I could check the required arguments prior to attempting to invoke/run the method(s) in question)
Edit : I forgot to include the stack trace. Here is the Railo stack trace. I have also already tried the following in place of expression
The parameter environment to function init is required but was not
passed in. at
railo.runtime.type.UDFImpl.defineArguments(UDFImpl.java:171):171 at
railo.runtime.type.UDFImpl._call(UDFImpl.java:369):369 at
railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:275):275
at railo.runtime.ComponentImpl._call(ComponentImpl.java:608):608 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:490):490 at
railo.runtime.ComponentImpl.callWithNamedValues(ComponentImpl.java:1800):1800
at
railo.runtime.functions.other._CreateComponent.call(_CreateComponent.java:49):49
at
mso.dev_test315.mycomponenttest_cfc$cf._1(/var/www/html/myComponentTest.cfc:133):133
at
mso.dev_test315.mycomponenttest_cfc$cf.udfCall(/var/www/html/myComponentTest.cfc):-1
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:103):103 at
railo.runtime.type.UDFImpl._call(UDFImpl.java:371):371 at
railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:275):275
at railo.runtime.ComponentImpl._call(ComponentImpl.java:608):608 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:490):490 at
railo.runtime.ComponentImpl.callWithNamedValues(ComponentImpl.java:1796):1796
at railo.runtime.tag.Invoke.doComponent(Invoke.java:209):209 at
railo.runtime.tag.Invoke.doEndTag(Invoke.java:182):182 at
mxunit.framework.testcase_cfc$cf._2(/var/www/html/mxunit/framework/TestCase.cfc:115):115
at
mxunit.framework.testcase_cfc$cf.udfCall(/var/www/html/mxunit/framework/TestCase.cfc):-1
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:103):103 at
railo.runtime.type.UDFImpl._call(UDFImpl.java:371):371 at
railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:275):275
at railo.runtime.ComponentImpl._call(ComponentImpl.java:608):608 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:490):490 at
railo.runtime.ComponentImpl.callWithNamedValues(ComponentImpl.java:1800):1800
at
railo.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:749):749
at
railo.runtime.PageContextImpl.getFunctionWithNamedValues(PageContextImpl.java:1521):1521
at
mxunit.framework.decorators.dataproviderdecorator_cfc$cf._1(/var/www/html/mxunit/framework/decorators/DataProviderDecorator.cfc:31):31
at
mxunit.framework.decorators.dataproviderdecorator_cfc$cf.udfCall(/var/www/html/mxunit/framework/decorators/DataProviderDecorator.cfc):-1
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:103):103 at
railo.runtime.type.UDFImpl._call(UDFImpl.java:371):371 at
railo.runtime.type.UDFImpl.call(UDFImpl.java:284):284 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:607):607 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:490):490 at
railo.runtime.ComponentImpl.call(ComponentImpl.java:1781):1781 at
railo.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:723):723
at
railo.runtime.PageContextImpl.getFunction(PageContextImpl.java:1506):1506
at
mxunit.framework.testsuiterunner_cfc$cf._1(/var/www/html/mxunit/framework/TestSuiteRunner.cfc:99):99
at
mxunit.framework.testsuiterunner_cfc$cf.udfCall(/var/www/html/mxunit/framework/TestSuiteRunner.cfc):-1
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:103):103 at
railo.runtime.type.UDFImpl._call(UDFImpl.java:371):371 at
railo.runtime.type.UDFImpl.call(UDFImpl.java:284):284 at
railo.runtime.type.scope.UndefinedImpl.call(UndefinedImpl.java:774):774
at
railo.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:723):723
at
railo.runtime.PageContextImpl.getFunction(PageContextImpl.java:1506):1506
at
mxunit.framework.testsuiterunner_cfc$cf._1(/var/www/html/mxunit/framework/TestSuiteRunner.cfc:52):52
at
mxunit.framework.testsuiterunner_cfc$cf.udfCall(/var/www/html/mxunit/framework/TestSuiteRunner.cfc):-1
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:103):103 at
railo.runtime.type.UDFImpl._call(UDFImpl.java:371):371 at
railo.runtime.type.UDFImpl.call(UDFImpl.java:284):284 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:607):607 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:490):490 at
railo.runtime.ComponentImpl.call(ComponentImpl.java:1781):1781 at
railo.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:723):723
at
railo.runtime.PageContextImpl.getFunction(PageContextImpl.java:1506):1506
at
mxunit.framework.testsuite_cfc$cf._1(/var/www/html/mxunit/framework/TestSuite.cfc:131):131
at
mxunit.framework.testsuite_cfc$cf.udfCall(/var/www/html/mxunit/framework/TestSuite.cfc):-1
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:103):103 at
railo.runtime.type.UDFImpl._call(UDFImpl.java:371):371 at
railo.runtime.type.UDFImpl.call(UDFImpl.java:284):284 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:607):607 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:490):490 at
railo.runtime.ComponentImpl.call(ComponentImpl.java:1781):1781 at
railo.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:723):723
at
railo.runtime.PageContextImpl.getFunction(PageContextImpl.java:1506):1506
at
mxunit.framework.remotefacade_cfc$cf._1(/var/www/html/mxunit/framework/RemoteFacade.cfc:76):76
at
mxunit.framework.remotefacade_cfc$cf.udfCall(/var/www/html/mxunit/framework/RemoteFacade.cfc):-1
at railo.runtime.type.UDFImpl.implementation(UDFImpl.java:103):103 at
railo.runtime.type.UDFImpl._call(UDFImpl.java:371):371 at
railo.runtime.type.UDFImpl.call(UDFImpl.java:284):284 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:607):607 at
railo.runtime.ComponentImpl._call(ComponentImpl.java:498):498 at
railo.runtime.ComponentImpl.call(ComponentImpl.java:1789):1789 at
railo.runtime.ComponentWrap.call(ComponentWrap.java:165):165 at
railo.runtime.net.rpc.server.ComponentController._invoke(ComponentController.java:56):56
at
railo.runtime.net.rpc.server.ComponentController.invoke(ComponentController.java:34):34
at __138.mxunit.framework.remotefacade_wrap.executeTestCase(Unknown
Source):-1 at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown
Source):-1 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
Source):-1 at java.lang.reflect.Method.invoke(Unknown Source):-1 at
org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397):397
at
org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186):186
at
org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323):323
at
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32):32
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118):118 at
org.apache.axis.SimpleChain.invoke(SimpleChain.java:83):83 at
org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:454):454
at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281):281
at
railo.runtime.net.rpc.server.RPCServer.doPost(RPCServer.java:312):312
at
railo.runtime.ComponentPage.callWebservice(ComponentPage.java:783):783
at railo.runtime.ComponentPage.call(ComponentPage.java:155):155 at
railo.runtime.PageContextImpl.doInclude(PageContextImpl.java:801):801
at
railo.runtime.PageContextImpl.doInclude(PageContextImpl.java:753):753
at
railo.runtime.listener.ModernAppListener._onRequest(ModernAppListener.java:183):183
at
railo.runtime.listener.MixedAppListener.onRequest(MixedAppListener.java:18):18
at
railo.runtime.PageContextImpl.execute(PageContextImpl.java:2255):2255
at
railo.runtime.PageContextImpl.execute(PageContextImpl.java:2222):2222
at
railo.runtime.engine.CFMLEngineImpl.serviceCFML(CFMLEngineImpl.java:310):310
at railo.loader.servlet.CFMLServlet.service(CFMLServlet.java:29):29 at
javax.servlet.http.HttpServlet.service(HttpServlet.java:728):728 at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305):305
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210):210
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222):222
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123):123
at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472):472
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171):171
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99):99
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118):118
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407):407
at
org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200):200
at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589):589
at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310):310
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown
Source):-1 at
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source):-1
at java.lang.Thread.run(Unknown Source):-1
Upvotes: 2
Views: 1021
Reputation: 112150
A simpler workaround than what you are currently using:
try
{
// standard function call
}
catch (expression e)
{
if ( NOT refind('The parameter \S+ to function \S+ is required but was not passed in',e.message) )
rethrow;
}
Of course, this relies on the wording of the error message, so is somewhat brittle.
You could alternatively do a less precise but more flexible version, just checking for the keywords:
if ( NOT find('parameter',e.message) AND find('required',e.message) )
Upvotes: 2
Reputation: 7027
Solution currently being employed (unless a better solution is offered in the next few days) will be by use of a method as follows :
boolean function checkRequiredArguments(
required inFunction,
required struct inArguments
) {
// This is intended to check the function for required arguments and ensure they are present in the struct
var arrFunctionArguments = GetMetaData(arguments.inFunction).parameters;
for (var thisArgument in arrFunctionArguments) {
if (
thisArgument.required // argument is required
&&
!IsDefined('arguments.inArguments.'&thisArgument.name) // but not defined
) {
return false;
}
}
return true;
}
This will return true if all required arguments are valid. In context of the init argument of the component above, the following example code would ensure that all required arguments are at least defined in some form (some refinement would allow this to confirm types also)
objTest = CreateObject('myComponent');
stcArguments = {
inSetting1 = 'XXX'
}
if ( checkRequiredArguments( inFunction = objTest.init , inArguments = stcArguments ) ) {
objTest.init( argumentCollection=stcArguments );
} else {
throw(type='MissingArguments');
}
Upvotes: 0