2013-11-18 2 views
1

Я обновляюсь от Railo 3 до 4 и сталкивается с проблемой со старым Application.cfc. Application.cfc терпит неудачу на следующей строке в методе OnRequest:invoke command in application.cfc не работает в railo 4.1 (ошибка: отсутствует требуемый аргумент [object])

content = invoke(controller = controllerPath, method = URL.action, arguments = {'data':FORM,'options':URL}); 

Это частичное содержание ошибки:

Railo 4.1.1.009 Error (template)

Message missing required argument [object] for function [invoke]

Pattern invoke(object:any, name:string [, arguments:any]):object

Documentation invokes a function/operation of the given object and if given object is a string, Railo tries to load as component.

Required:

  • object (any): a component, struct or scope that holds a function, can also be the name of a component, in this case the component get loaded.
  • name (string): name of the function/operation

Optional:

  • arguments (any): arguments to pass to the function/operation

Stacktrace The Error Occurred in /home/admin/quicktrackweb/src/web/cf3/Application.cfc: line 215

213: dynFunc = view[URL.action];

214:

215: content = invoke(controller = controllerPath, method = URL.action, arguments = {'data':FORM,'options':URL});

216: //content = "test";

217: if (GetMetaData(dynFunc).access == 'remote') {

Java Stacktrace missing required argument [object] for function [invoke] at railo.transformer.bytecode.expression.var.Variable.getMatchingValueAndType(Variable.java:700):700 at railo.transformer.bytecode.expression.var.Variable._writeOutFirstBIF(Variable.java:458):458 at railo.transformer.bytecode.expression.var.Variable._writeOutFirst(Variable.java:419):419 at railo.transformer.bytecode.expression.var.Variable._writeOut(Variable.java:238):238 at railo.transformer.bytecode.expression.var.Variable._writeOut(Variable.java:219):219 at railo.transformer.bytecode.expression.ExpressionBase.writeOut(ExpressionBase.java:34):34 ...

Вот метод OnRequest:

public void function OnRequest (required string TargetPage) { 
      var content = ''; 
      var controllerPath = ''; 
      var dynFunc = ''; 
      var isDebug = false; 
      var output = ''; 
      var response = ''; 
      var templatePath = 'views/login/login.cfm'; 
      var toolbar = CreateObject('component', 'controllers.toolbar'); 
      var view = ''; 
      import 'controllers.ajax'; 
        //ssl implemtation 
      if (!CGI.SERVER_PORT_SECURE) { 
        Location("http://#CGI.SERVER_NAME#/?#CGI.QUERY_STRING#", false); 
      } 


      param name='URL.view' type='string' default='home'; 
      param name='URL.action' type='string' default=''; 
      param name='URL.id' type='numeric' default=0; 
      param name='URL.options' type='string' default=''; 

      URL.view = REReplace(URL.view, '\W', '', 'all'); 

      if (StructKeyExists(URL, 'faq')) { 
        templatePath = "views/home/faq.cfm";  
      } else if (SESSION.user.id || (URL.view == 'login' && URL.action == 'new')) { 
        if (StructKeyExists(GetHttpRequestData().headers, 'ajax')) { 
          var ajax = new ajax(request = GetHttpRequestData(), url = URL, form = FORM, cookie = COOKIE); 

          Header(name = 'Content-Type', value = 'application/json'); 
          WriteOutput(ajax.getResponse()); 

          return; 
        } else { 
          if (URL.action == '') { 
            URL.action = ListGetAt(URL.view, ListLen(URL.view, '.'), '.'); 
          } 

          if (hasFunction('controllers.' & URL.view, URL.action) || hasFunction('controllers.#URL.view#.#URL.view#', URL.action)) { 
            if (hasFunction('controllers.' & URL.view, URL.action)) { 
              controllerPath = 'controllers.#URL.view#'; 
            } else { 
              controllerPath = 'controllers.#URL.view#.#URL.view#'; 
            } 

            view = CreateObject('component', controllerPath); 
            dynFunc = view[URL.action]; 

========> Line where app fails:   content = invoke(controller = controllerPath, method = URL.action, arguments = {'data':FORM,'options':URL}); 

            if (GetMetaData(dynFunc).access == 'remote') { 
              GetPageContext().getResponse().reset(); 
              Header(name = 'Content-Type', value = 'application/json'); 
              WriteOutput(content); 
              return; 
            } 

            templatePath = '';  
          } else if (FileExists("views/#URL.view#/#URL.view#.cfm")){ 
            templatePath = "views/#URL.view#/#URL.view#.cfm"; 
          } else{ 
            templatePath = "views/home/home.cfm"; 
          } 
        } 
      } 

      if (content == '' && FileExists(templatePath)) { 
        savecontent variable = 'content' {include '#templatePath#';}  
      } 

      if (CGI.SCRIPT_NAME == '/js/webapp.cfm') { 
        Header(name = 'Content-Type', value = 'application/javascript'); 
        include '/js/webapp.cfm'; 
      } else if (CGI.SCRIPT_NAME == '/css/webapp.cfm') { 
        Header(name = 'Content-Type', value = 'text/css'); 
        include '/css/webapp.cfm'; 
      } else { 
        include '/index.cfm'; 
      } 

      //Return out. 
      return; 
    } 

К сожалению для взрыва всего этого кода, но поскольку я довольно новичок в Railo/CF, я не уверен, с чего начать. Вызывали ли вы устаревшие и что я должен использовать вместо него?

Похоже, что Invoke полностью отличается от предыдущей версии, так как он ожидает аргумент «объект», но у меня есть аргументы «контроллер», «метод» и «аргументы»

Моя версия Railo is 4.1.1.009 Я бегу на сервере Ubuntu с Apache 2.2.22 и Tomcat 7.0.20

+0

Вам не нужно вызывать, если вам не нужна совместимость с CF10. Сделайте что-то вроде 'content = view [url.action] (data: form, options: url)' - не уверен, что это именно то, что вам нужно (я не могу побеспокоить расшифровку окружающего кода), но это будет линий. –

+0

Спасибо, Питер. В коде непосредственно над вызовом есть строка, которая «рассматривает [URL.action]». Поэтому я до сих пор не понимаю, почему вызовы кода вызывают (на основе вашего комментария) или что мне нужно сделать, чтобы заставить его работать. Без переопределения метода OnRequest сайт не работает - я получаю пустую страницу, и простая страница cf отлично работает. Я сделал все возможное, чтобы попробовать то, что вы сказали. – dwaz

+0

До CF10 не было [invoke] (https://learn.adobe.com/wiki/display/coldfusionen/invoke), и было необходимо написать 'x = view [URL.action]' и 'x (args) 'в CF, так что это проблема, из которой происходит эта линия. (В Railo вы всегда могли делать 'view [URL.action] (args)' за один раз.) –

ответ

0

Вернувшись в Railo 3.3.4.003 final, соответствующий серверу производства, он работает. 3.3.4.003 имеет совместимость с ColdFusion с 9.0.0.1. Я думаю, именно поэтому он работает сейчас, и мне не нужно было вносить какие-либо изменения в код в Application.cfc, кроме как удалить перенаправление http, где он проверяет! CGI.SERVER_PORT_SECURE (вызвал цикл перенаправления, который я прокомментировал вне).

Если мое мышление здесь не так, сообщите мне.