Question

J'ai le fichier Applicaton.cfc suivant

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

Voici mon composant 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 mon 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>

J'obtiens 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

Qu'est-ce qui me manque?

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

Quand je le fais de cette façon, cela fonctionne. ce 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>
Était-ce utile?

La solution

Il y a deux choses que je vois mal ici:

Tout d'abord, à ma connaissance, l'utilisation de la portée "this" dans application.cfc ne fonctionne pas comme vous le tentez. En définissant votre objet userGateway sur une valeur de domaine d'application, il devient globalement disponible et rend vraiment inutile le renvoi dans onApplicationStart. Dans votre application.cfc, changez votre type de retour en boolean et retournez simplement true; cela devrait régler votre problème.

Deuxièmement, si dans votre requête, vos arguments et vos conditions ne sont pas des mandataires de ce que vous avez réellement, vous référencez un argument 'personid' qui n'existe pas dans votre fonction. Lors de l'appel de cette requête via un appel d'objet dans l'étendue de l'application, j'ai vu l'erreur de chaîne java renvoyée sous la forme d'une erreur auparavant, contrairement à l'erreur "La variable n'existe pas".

Autres conseils

Dans same.cfm, exécutez ceci:

<cfset OnApplicationStart()>

Actualisez à nouveau la page. Est-ce que ça marche maintenant?

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

devrait être:

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

La ligne suivante est incorrecte:

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

Il faut lire sans & "cfc. &"; au début du nom de composant souhaité:

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

Vérifiez également que le reste du fichier application.cfc est correct, car quelque chose ne fonctionne pas, car vous auriez dû voir que le composant cfc.UserGateway n’a pas été trouvé.

MODIFIER: J'ai également oublié de mentionner que onApplicationStart n'a rien à retourner. Le type de retour doit être annulé et aucun <return this/> ne doit être présent.

redémarrer votre service militaire pourrait vous aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top