2009-06-16 7 views
1

je les suivantes Applicaton.cfcColdFusion erreur de définition de classe

<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> 

Ceci est mon élément 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> 

Et voici ma same.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> 

I obtenez l'erreur suivante:

Element USERGATEWAY is undefined in a Java object of type class [Ljava.lang.String;. 
The error occurred in same.cfm: line 10 

Que manque-t-il?

------------------------------------------- 
------------------------------------------- 

Lorsque je le fais de cette façon, cela fonctionne. ça doit être quelque chose de trivial que je ne reçois pas en tant que débutant.

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> 
+0

Je suppose que vous avez un Application.cfc dans votre projet, et non Applicaton.cfc comme indiqué ci-dessus? –

+0

oui, une faute de frappe dans stackoverflow – mrt181

+0

le plus probable le problème est dans votre application.cfc. Pourriez-vous poster l'application.cfc entière? Si vous n'avez pas nommé l'application avec This.name = "SomeName", alors la variable enregistrée dans la portée de l'application pourrait aller ailleurs, d'où le problème lorsque vous essayez de référencer l'usergateway. – Jayson

Répondre

2

Il y a deux choses que je vois mal ici:

d'abord, À ma connaissance, en utilisant le « ceci » portée dans application.cfc ne fonctionne pas comme vous essayez de le faire.En définissant votre objet userGateway sur une valeur de portée d'application, il devient globalement disponible et rend vraiment inutile le retour à onApplicationStart. Dans votre application.cfc, changez votre type de retour en booléen et renvoyez juste true; Cela devrait résoudre votre problème. Deuxièmement, si dans votre requête, vos arguments et conditions ne sont pas des approximations de ce que vous avez réellement, vous faites référence à un argument 'personid' qui n'existe pas dans votre fonction. Lorsque j'appelle cette requête via un appel d'objet dans la portée de l'application, j'ai vu l'erreur de chaîne Java renvoyée comme une erreur auparavant, contrairement à l'erreur "La variable n'existe pas" CF Friendly.

+0

personid est une faute de frappe, devrait être de courese seulement id – mrt181

0

En same.cfm, exécutez:

<cfset OnApplicationStart()> 

Ensuite, actualisez la page. Est-ce que ça marche maintenant?

+0

non, cela n'aide pas – mrt181

0
<cffunction name="init" access="public" hint="constructor" output="false" returntype="UserGateway"> 

devrait être:

<cffunction name="init" access="public" hint="constructor" output="false" returntype="Any"> 
+0

désolé, n'aide pas. Je reçois la même erreur – mrt181

0

La ligne suivante est incorrecte:

<cfset application.userGateway = createObject("component","cfc.UserGateway").init(dsn = application.dsn) /> 

Il faut lire avec des "cfc." au début du nom du composant que vous voulez:

<cfset application.userGateway = createObject("component","UserGateway").init(dsn = application.dsn) /> 

En outre, vérifiez le reste de la application.cfc pour l'exactitude parce que quelque chose ne fonctionne pas bien, que vous auriez dû voir cette erreur qu'il ne pouvait pas recherchez le composant cfc.UserGateway. J'ai également oublié de mentionner que onApplicationStart n'a pas besoin de retourner quoi que ce soit. Le type de retour doit être vide et aucun <return this/> ne doit être présent.

+0

Désolé, n'aide pas. J'obtiens la même erreur – mrt181

+0

si le Usergateway était dans un répertoire appelé cfc, c'est correct, cependant, si tous les fichiers sont dans le même répertoire, ceci n'est pas correct. Veuillez poster votre application.cfc, car le problème semble être là. – Jayson

0

redémarrer votre service CF pourrait aider.

Questions connexes