为什么ColdFusion隐式Setter最终会进行网络调用?
我在CFC的init()方法中有一个隐式setter。我观察到(使用Fusion Reactor,并通过错误消息)对setActive(false)的简单调用最终导致联网。我不知道为什么ColdFusion在使用ColdFusion 9引入的隐式setter设置此值时会做这么多工作 我正在运行最新的ColdFusion 9.01,并应用了所有修补程序更新 你知道为什么ColdFusion会遇到这么多麻烦吗 谢谢 我的CFC的初始方法为什么ColdFusion隐式Setter最终会进行网络调用?,coldfusion,Coldfusion,我在CFC的init()方法中有一个隐式setter。我观察到(使用Fusion Reactor,并通过错误消息)对setActive(false)的简单调用最终导致联网。我不知道为什么ColdFusion在使用ColdFusion 9引入的隐式setter设置此值时会做这么多工作 我正在运行最新的ColdFusion 9.01,并应用了所有修补程序更新 你知道为什么ColdFusion会遇到这么多麻烦吗 谢谢 我的CFC的初始方法 /* Constructor @user_id A v
/* Constructor
@user_id A valid User_ID. If provided, the User will self-populate.
*/
public shared.models.objects.User function init (numeric user_id = -1) {
super.init(argumentCollection=arguments);
// Prepare structs required for 'adding' methods
clearRoles();
setActive(false); // <--- THIS IS THE LINE
setUser_ID(user_id);
settings = {};
defaultLanguage = new shared.models.objects.Language();
setLanguages( [defaultLanguage] );
setLanguage( defaultLanguage );
if (user_id == -1) {
// Construct a 'blank' User
// addRole('Contributor');
setRequirePasswordChange(false);
} else {
// Attempt to populate a user
populate();
}
return this;
}
我遇到了同样的问题。我相信我可以添加一些东西,但最终我认为这里有一个CF缺陷,我将尝试详细说明 堆栈跟踪中的第一个注意事项是:
at coldfusion.runtime.CgiScope.resolve(CgiScope.java:221)
at coldfusion.runtime.CgiScope.containsName(CgiScope.java:301)
at coldfusion.runtime.CgiScope.search(CgiScope.java:334)
at coldfusion.runtime.NeoPageContext.searchScopes(NeoPageContext.java:766)
at coldfusion.runtime.NeoPageContext.findAttribute(NeoPageContext.java:638)
当ColdFusion试图解析一个未划分范围的变量时,它将按照范围的优先顺序来测试每个范围。如果它一直到达CGI范围,CF服务器将尝试向Web服务器连接器请求请求头中的CGI信息。反过来,连接器尝试从保持TCP连接的连接器句柄读回浏览器。您在此原始消息中看到的网络连接可能是试图通过TCP从浏览器收集某些CGI属性的连接器
如果浏览器连接不再处于活动状态,例如用户关闭了浏览器,单击了其他位置,或者网络中断,那么TCP连接可能“过时”。在这种情况下,您将在如下日志中看到堆栈跟踪,主消息为“**读取头时出错”
再次得出的结论是,如果浏览器连接已断开,则
在执行CGI查找时,您的代码可能会显示“reading header”错误,这可能是由于您的意图,也可能是因为您在非作用域变量名上使用了isDefined
这只是一些相关的背景信息。此问题与此线程中的ORM问题相交
我发现在ColdFusion 9.01中,有时对隐式setter的调用会导致ColdFusion尝试解析setter方法,就像它是一个属性一样,并且它会查看CGI范围以尝试找到它
我在此处(部分)显示了以下实体:
请注意,它扩展了myBaseClass,如下(部分)所示:
在某些情况下,当请求使用实体的模板时,模板请求会无限期地挂在浏览器中,地址栏会旋转。稍后查看日志时,我会发现请求的相关条目显示“读取头时出错”
这个堆栈跟踪告诉我ColdFusion试图解析隐式setter,并试图通过向连接器请求相同名称的HTTP请求头,在CGI范围内找到它
对我来说,试图通过在CGI作用域中搜索请求头来解析隐式getter似乎是ColdFusion的缺陷
意见?您的CFC是否扩展了另一个可能明确定义了setActive的组件?此外,您是否为CFC(或您可能扩展的CFC)定义了onMissingMethod函数?@JakeFeasel否,没有其他setActive()方法,也没有onMissingMethod()。谢谢。您的用户.cfc的第131行是什么?@StephenMoretti setActive(false);//记录2个缺陷:和
at coldfusion.runtime.CgiScope.resolve(CgiScope.java:221)
at coldfusion.runtime.CgiScope.containsName(CgiScope.java:301)
at coldfusion.runtime.CgiScope.search(CgiScope.java:334)
at coldfusion.runtime.NeoPageContext.searchScopes(NeoPageContext.java:766)
at coldfusion.runtime.NeoPageContext.findAttribute(NeoPageContext.java:638)
03/06 13:45:52 error Error while reading header <headername>
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
...
at coldfusion.runtime.CgiScope.resolve(CgiScope.java:221)
at coldfusion.runtime.CgiScope.containsName(CgiScope.java:301)
at coldfusion.runtime.CgiScope.search(CgiScope.java:334)
error Error while reading header S_UNABLE
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
...
at coldfusion.runtime.CgiScope.resolve(CgiScope.java:221)
at coldfusion.runtime.CgiScope.containsName(CgiScope.java:301)
at coldfusion.runtime.CgiScope.search(CgiScope.java:334)
...
at cfsavecontent2ecfm1472308084.runPage(E:\cf9_final\cfusion\wwwroot\WEB-INF\cftags\savecontent.cfm:11)
...
at cfexception_en2exml1502993924.runPage(D:\JRun4\servers\cfusion\cfusion.ear\cfusion.war\WEB-INF\exception\exception_en.xml:52)
...
at cfdetail2ecfm1809038875.runPage(D:\JRun4\servers\cfusion\cfusion.ear\cfusion.war\WEB-INF\exception\detail.cfm:35)
...
at cfApplicationException2ecfm797577125.runPage(D:\JRun4\servers\cfusion\cfusion.ear\cfusion.war\WEB-INF\exception\coldfusion\runtime\ApplicationException.cfm:2)
component persistent="true" table="myTable" output="false" extends="myBaseClass" {
property name="myProperty" column="myProperty" type="date" ormtype="timestamp";
component {
public void function doSomething(){
if (hasProperty('myProperty'))
setMyProperty(now());
}
03/06 13:45:52 error Error while reading header SETMYPROPRTY
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
...
at coldfusion.runtime.CgiScope.resolve(CgiScope.java:221)
at coldfusion.runtime.CgiScope.containsName(CgiScope.java:301)
at coldfusion.runtime.CgiScope.search(CgiScope.java:334)
...
at cfmybaseclass2ecfc1915167844$funcDOSOMETHING.runFunction(X:\MyApp\myBaseClass.cfc:8)
...
at coldfusion.orm.hibernate.HibernateEventHandler.onFlushDirty(HibernateEventHandler.java:130)
...
at coldfusion.orm.hibernate.HibernatePersistenceManager.onCommit(HibernatePersistenceManager.java:950)
...
at cfsomecomp2ecfc1707726523$funcRUN.runFunction(X:\MyApp\SomeComp.cfc:131)