Ошибка определения класса ColdFusion - PullRequest
1 голос
/ 16 июня 2009

У меня есть следующий 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>

Ответы [ 6 ]

2 голосов
/ 18 июня 2009

Есть две вещи, которые я здесь вижу неправильно:

Во-первых, насколько я понимаю, использование области действия this в application.cfc не работает так, как вы пытаетесь это сделать. Установив для объекта userGateway значение области приложения, оно становится глобально доступным и действительно делает ненужным его возвращение в onApplicationStart. В вашем application.cfc измените свой тип возвращаемого значения на boolean и просто верните true; это должно решить вашу проблему.

Во-вторых, если в вашем запросе ваши аргументы и условные выражения не являются прокси-факторами того, что у вас есть на самом деле, вы ссылаетесь на аргумент personid, который не существует в вашей функции. При вызове этого запроса через объектный вызов в области приложения я видел ошибку строки java, возвращенную как ошибку, в отличие от CF-сообщения Friendly «переменная не существует».

0 голосов
/ 16 июня 2009

перезапуск службы CF может помочь.

0 голосов
/ 16 июня 2009
0 голосов
/ 16 июня 2009

Следующая строка неверна:

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

Должно читаться без "cfc." в начале нужного имени компонента:

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

Кроме того, дважды проверьте остальную часть application.cfc на правильность, потому что что-то не работает должным образом, поскольку вы должны были видеть эту ошибку, что она не могла найти компонент cfc.UserGateway.

EDIT: Я также забыл упомянуть, что onApplicationStart не нужно ничего возвращать. Тип возвращаемого значения должен быть void, и <return this/> не должно присутствовать.

0 голосов
/ 16 июня 2009
<cffunction name="init" access="public" hint="constructor" output="false" returntype="UserGateway">

должно быть:

<cffunction name="init" access="public" hint="constructor" output="false" returntype="Any">
0 голосов
/ 16 июня 2009

В same.cfm, запустите это:

<cfset OnApplicationStart()>

Затем обновите страницу снова. Теперь это работает?

...