Frage

Ich habe folgendes 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>

Das ist meine Komponente 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>

Und das ist mein 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>

Ich erhalte den folgenden Fehler:

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

Was bin ich fehlt?

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

Wenn ich tue es auf diese Weise funktioniert. es muss etwas trivial sein, dass ich als Anfänger nicht bekommen.

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>
War es hilfreich?

Lösung

Es gibt zwei Dinge, die ich falsch hier zu sehen:

Zuerst Zu meinem Verständnis, mit dem ‚this‘ Anwendungsbereich in Application.cfc funktioniert nicht so, wie Sie versuchen, es zu tun. Durch die Einstellung Wert Ihrer userGateway Objekt zu einer Anwendung scoped, wird es weltweit verfügbar und macht es wirklich in OnApplicationStart unnötig zurück. In Ihrem Application.cfc, ändern Sie Ihren Rückgabetyp boolean und nur return true; das sollte das Problem beheben.

Zweitens, wenn in Ihrer Abfrage, Ihre Argumente und conditionals sind nicht Proxys von dem, was Sie tatsächlich haben, Sie Referenzierung ein Argument ‚PersonId‘, die nicht existiert in Ihrer Funktion. Wenn diese Abfrage durch ein Objekt Aufruf in dem Anwendungsbereich Aufruf habe ich die Java-String-Fehler vor im Gegensatz als ein Fehler an den CF-freundlichen ‚Variable existiert nicht‘ Fehler zurückgegeben gesehen.

Andere Tipps

In same.cfm, führen diese:

<cfset OnApplicationStart()>

Dann aktualisieren Sie die Seite erneut. Ist es jetzt arbeiten?

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

sollte:

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

Die folgende Zeile ist falsch:

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

Es sollte mit auslesbar „cfc.“ am Anfang des Komponentennamens Sie wollen:

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

Auch überprüfen Sie den Rest der Application.cfc für Richtigkeit, weil etwas nicht richtig läuft, wie Sie diesen Fehler gesehen haben sollte, dass es nicht Komponente cfc.UserGateway finden konnte.

EDIT: Ich vergaß zu erwähnen, dass auch OnApplicationStart müssen nichts zurück. Der Rückgabetyp sollte leer sein und keine <return this/> muss vorhanden sein.

Starten Sie Ihren CF Service könnte helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top