Веб-сервис Coldfusion RESTful: объект не является экземпляром объявляющего класса

Когда я вызываю URL-адрес http://192.168.2.26:8080/rest/RestSample/season/1.json, я получаю сообщение об ошибке:

«Ошибка», «ajp-bio-8012-exec-4», «01.03.13», «16:51:58», «RestSample», «объект не является экземпляром объявляющего класса Конкретная последовательность файлов включено или обработано: C:\path_to\api\service.cfc'' "

Это файл /api/service.cfc:

<cfscript>
component restpath="season" rest="true"
{

    remote query function getSeasonsByUserId(numeric userid restargsource="Path") httpmethod="GET" restpath="{userid}"
    {
        var response = "";
        var qry = new Query();
        var userQry = "";

        qry.setSQl("select * from mytable where userID = :userid");
        qry.addParam(name="userid", value="#arguments.userid#", cfsqltype="cf_sql_numeric");
        userQry = qry.execute().getResult();

        if(userQry.recordcount == 0)
        {
            response = userQry;
        } else {
            throw(type="Restsample.SeasonsNotFoundError", errorCode='404', detail='Seasons not found');
        }

        return response;
    }    
}   
</cfscript>

Редактировать №1: в соответствии с этим руководством: http://www.anujgakhar.com/2012/02/20/using-rest-services-in-coldfusion-10/

Редактировать №2: мой application.cfc

<cfscript>
component output="false"
{
    this.name = "RestSample";
    this.applicationTimeout = createTimespan(0,0,0,0);
    this.datasource = "mydsn";
    this.username = "";
    this.password = "";

    //this.restsettings.skipCFCWithError = true;

    public boolean function onRequestStart()
    {
        restInitApplication(getDirectoryFromPath(getCurrentTemplatePath()), this.name);

        return true;
    }
}
</cfscript>

Также хотел бы отметить, что обновление служб REST в админке ВСЕГДА дает мне следующее сообщение:

Unable to refresh REST service.
Application RestSample could not be initialized.
Reason: The application does not contain any rest enabled CFCs.
The application does not contain any rest enabled CFCs.

Однако я могу без проблем удалить их и добавить через onRequestStart().

Изменить №3

Моя текущая структура

/api/main/service.cfc /api/application.cfc /api/index.cfm

приложение.cfc

<cfscript>
component output="false"
{
    this.name = "RestSample";
    this.applicationTimeout = createTimespan(0,0,0,0);
    this.datasource = "mydsn";
    this.username = "";
    this.password = "";

    this.restsettings.skipCFCWithError = true;

    public boolean function onRequestStart()
    {
        restInitApplication(getDirectoryFromPath(getCurrentTemplatePath()).concat("main\"), this.name);

        return true;
    }
}
</cfscript>

сервис.cfc

<cfscript>
component restpath="season" rest="true"
{

    remote Query function getSeasonsByUserId(numeric userid restargsource="Path") httpmethod="GET" restpath="{userid}"
    {
        var response = "";
        var qry = new Query();
        var userQry = "";

        qry.setSQl("select * from mytable where userID = :userid");
        qry.addParam(name="userid", value="#arguments.userid#", cfsqltype="cf_sql_numeric");
        userQry = qry.execute().getResult();

        return userQry;
    } 
}   
</cfscript>

Я все еще получаю следующую ошибку:

'object is not an instance of declaring class

person TekiusFanatikus    schedule 01.03.2013    source источник
comment
Я не работал с реализацией REST в CF, но должен ли этот бросок быть ">RestSetResponse вместо этого?   -  person Peter Boughton    schedule 02.03.2013
comment
@PeterBoughton Я так не думаю ... мое отображение - RestSample, значит, оно тоже должно быть RestSample? Честно говоря, я следил за учебником по этому вопросу.   -  person TekiusFanatikus    schedule 02.03.2013
comment
Первым шагом к диагностике проблемы является определение источника ошибки. Удалите (или закомментируйте) if и измените return на return userQry;, чтобы увидеть, где ошибка вообще. (p.s. == 0 задом наперёд и в любом случае не нужен.)   -  person Peter Boughton    schedule 02.03.2013
comment
Включите ссылку на учебник в вопрос - таким образом его можно будет проверить, если вы неправильно поняли инструкции или учебник неверен.   -  person Peter Boughton    schedule 02.03.2013
comment
@PeterBoughton Я избавился от оператора if и вернул запрос (после удаления остальной службы из консоли администрирования и ее повторного добавления) ... та же ошибка.   -  person TekiusFanatikus    schedule 02.03.2013
comment
Хорошо, это говорит о том, что это было не то, что я думал. Придется подождать, пока кто-то, кто действительно использовал REST, поможет.   -  person Peter Boughton    schedule 02.03.2013
comment
Я искал сообщение об ошибке и нашел следующее: bugbase.adobe.com/index. cfm?event=bug&id=3346117 - так что проверьте, есть ли в вашем App.cfc restInitApplication вне каких-либо функций (в учебнике это есть в onRequestStart, поэтому, если у вас есть то же самое, то, вероятно, это что-то другое).   -  person Peter Boughton    schedule 02.03.2013
comment
Эта ошибка Приложение не содержит CFC с включенным отдыхом недавно была в другом вопросе - см. здесь: stackoverflow.com/questions/14499275/   -  person Peter Boughton    schedule 02.03.2013
comment
Также кажется, что существует ошибка CF, связанная с использованием /* comments */ в REST CFC:/ bugbase .adobe.com/index.cfm?event=bug&id=3119366   -  person Peter Boughton    schedule 02.03.2013
comment
@PeterBoughton Я удалил свои комментарии, ошибка все еще возникает.   -  person TekiusFanatikus    schedule 02.03.2013


Ответы (2)


Давайте начнем с более простого примера и посмотрим, сможете ли вы перейти к рабочему состоянию. Я успешно настроил работающую службу REST, выполнив следующие действия:

Перейдите в Службы REST в Администраторе ColdFusion и удалите все существующие регистрации REST.

В новом каталоге в корне вашего веб-сайта создайте Application.cfc со следующим содержимым (обратите внимание, что теги <cfscript> не нужны, если вы используете CF 9 или выше):

component output="false"
{
    this.name = "RestSample";
}

В том же каталоге создайте index.cfm следующего содержания:

<cfset restInitApplication(getDirectoryFromPath(getCurrentTemplatePath()), "RestSample") />
Done.

В том же каталоге создайте service.cfc следующего содержания:

component restpath="season" rest="true"
{
    remote struct function getSeasonsByUserId(numeric userid restargsource="Path") httpmethod="GET" restpath="{userid}"
    {
        return {
            'hello': 'world'    
        };
    } 
}

Сначала перейдите к файлу index.cfm в браузере и убедитесь, что вы видите текст «Готово».

Откройте службы REST в Администраторе ColdFusion и убедитесь, что служба REST успешно зарегистрирована.

Наконец, перейдите к ресурсу REST в своем браузере через /rest/RestSample/season/123 и, надеюсь, вы увидите надежный «hello world».

Дайте мне знать, если у вас все еще есть проблемы, и мы посмотрим, что мы можем сделать.

person Honey    schedule 02.03.2013
comment
Также обратите внимание (как обсуждалось в комментариях к учебнику, которому вы следуете), вам нужно будет создать index.cfm для обновления службы REST. - person Honey; 02.03.2013
comment
У меня был index.cfm, и я применил ваше исправление. Я все еще получаю ту же проблему. - person TekiusFanatikus; 02.03.2013
comment
Я воспроизвел ваши файлы, вот что я получаю: Error,ajp-bio-8012-exec-10,03/06/13,13:01:51,, '' Конкретная последовательность включенных или обработанных файлов: ' ''' - person TekiusFanatikus; 06.03.2013
comment
Вот это да. Я очень впечатлен вашей решимостью заставить это работать. Я бы уже подобрал Таффи на твоем месте. Я не знаю, что означает ошибка, которую вы получаете. Когда вы получаете эту ошибку и как она проявляется? Вы просматривали свои журналы ошибок, чтобы узнать, можете ли вы найти более подробную информацию? Вы перезапускали CF после того, как у вас начались проблемы? - person Honey; 07.03.2013
comment
Я попробовал эту настройку на Win7 Pro, с CF10, и она работает. Интересно, почему это не работает на моей виртуальной машине. Тем временем я просто создал страницу, которая выводит JSON, и вместо этого у меня есть процесс, которому это нужно. Я не перезапускал, сегодня попробую. Журналы показывают то, что я выложил, не более того. - person TekiusFanatikus; 07.03.2013

Я создал файлы под C:\ColdFusion10\cfusion\wwwroot (вместо корня IIS сайта) и смог без проблем зарегистрировать службу REST через административную консоль.

person TekiusFanatikus    schedule 28.03.2013