ColdFusionクラス定義エラー
-
05-07-2019 - |
質問
次のApplicaton.cfcがあります
<cffunction name="onApplicationStart" access="public" returntype="Object">
<cfset application.dsn = "myDB" />
<cfset application.userGateway = createObject("component","cfc.UserGateway").init(dsn = application.dsn) />
<cfreturn this />
</cffunction>
これは私のコンポーネントUserGateway.cfcです
<cfcomponent name="UserGateway" hint="Data Access Object" output="false">
<cffunction name="init" access="public" hint="constructor" output="false" returntype="UserGateway">
<cfargument name="dsn" type="string" required="true" hint="datasource" />
<cfset variables.dsn = arguments.dsn />
<cfreturn this />
</cffunction>
<cffunction name="getUsers" access="public" output="false" returntype="query">
<cfargument name="id" type="String" default="" />
<cfargument name="name" type="String" default="" />
<cfargument name="district" type="String" default="" />
<cfset var qQuery = "" />
<cfquery name="qQuery" datasource="#variables.dsn#">
SELECT *
FROM A INNER JOIN B
ON A.X = B.Y
WHERE 0=0
<cfif "#arguments.id#" neq "">
AND B.X LIKE '%#arguments.id#%'
</cfif>
<cfif "#arguments.name#" neq "">
AND (A.I LIKE '#arguments.name#%'
OR A.J LIKE '#arguments.name#%')
</cfif>
<cfif "#arguments.district#" neq "">
AND A.O LIKE '%#arguments.district#%'
</cfif>
</cfquery>
<cfreturn qQuery />
</cffunction>
</cfcomponent>
そしてこれは私の同じ.cfm
<cfform action="same.cfm" method="post" preservedata="true">
<p>ID: <cfinput type="text" name="id" size="20" maxlength="4" /></p>
<p>Name: <cfinput type="text" name="name" size="20" maxlength="64" /></p>
<p>District: <cfinput type="text" name="district" size="20" maxlength="3" /></p>
<p><cfinput class="button" type="submit" name="submit" value="OK" /></p>
</cfform>
<cfif IsDefined("form.submit")>
<table>
<cfset qQuery = application.userGateway.getUsers(id = form.id, name = form.name, district = form.district) />
<cfoutput query="qQuery">
<tr>
<td>#qQuery.currentRow#.</a></td>
<td>#qQuery.I#</a></td>
<td>#qQuery.M#, #qQuery.N#</a></td>
<td>#qQuery.D#</a></td>
</tr>
</cfoutput>
</table>
</cfif>
次のエラーが表示されます:
Element USERGATEWAY is undefined in a Java object of type class [Ljava.lang.String;.
The error occurred in same.cfm: line 10
不足しているもの
-------------------------------------------
-------------------------------------------
このようにすると、動作します。初心者の私が得られない些細なものでなければなりません。
Application.cfc
<cffunction name="onRequestStart" access="public" returntype="String">
<cfset request.dsn="myDB" />
</cffunction>
same.cfm
<cfset userGateway = createObject("component","cfc.UserGateway").init(dsn = request.dsn) />
<cfset qGetUser = userGateway.getUsers(id = form.personid, name = form.name, district = form.district) />
<cfoutput query="qQuery">
<tr>
<td>#qQuery.currentRow#.</a></td>
<td>#qQuery.I#</a></td>
<td>#qQuery.M#, #qQuery.N#</a></td>
<td>#qQuery.D#</a></td>
</tr>
</cfoutput>
解決
ここで間違っていることが2つあります:
まず、私の理解では、application.cfcで「this」スコープを使用しても、あなたがやろうとしている方法では機能しません。 userGatewayオブジェクトをアプリケーションスコープの値に設定することで、グローバルに利用可能になり、onApplicationStartで返す必要がなくなります。 application.cfcで、returntypeをbooleanに変更し、trueを返します。これで問題が解決するはずです。
第二に、クエリで引数と条件が実際に持っているもののプロキシではない場合、関数に存在しない引数 'personid'を参照しています。アプリケーションスコープのオブジェクト呼び出しを介してそのクエリを呼び出すと、以前はCFフレンドリーの「変数が存在しません」というエラーではなく、エラーとしてjava文字列エラーが返されました。
他のヒント
same.cfmで、これを実行します:
<cfset OnApplicationStart()>
その後、ページを再度更新します。今は動作しますか?
<cffunction name="init" access="public" hint="constructor" output="false" returntype="UserGateway">
はずです:
<cffunction name="init" access="public" hint="constructor" output="false" returntype="Any">
次の行は正しくありません:
<cfset application.userGateway = createObject("component","cfc.UserGateway").init(dsn = application.dsn) />
<!> quot; cfc。<!> quotなしで読み取る必要があります。必要なコンポーネント名の先頭に:
<cfset application.userGateway = createObject("component","UserGateway").init(dsn = application.dsn) />
また、正常に動作していないため、application.cfcの残りの部分を再確認してください。コンポーネントcfc.UserGatewayが見つからないというエラーが表示されるはずです。
編集:
また、onApplicationStartは何も返す必要がないことを忘れていました。戻り値の型はvoidであり、<return this/>
が存在する必要はありません。
CFサービスを再起動すると役立つ場合があります。