ColdFusion — вызов метода объекта Java

#coldfusion #coldfusion-11

#java #coldfusion

Вопрос:

Я пытаюсь получить список источников данных со своего сервера (да, я владелец сервера…это не взлом).

Я думаю, что запутал проблему, приведя два примера, поэтому я редактирую сообщение с ОДНИМ примером и трассировкой стека.

Код

 // Create Data Source Object
admin = new cfide.adminapi.Administrator();
admin.login("admin","[password]");

dbserv = createobject("java","coldfusion.server.ServiceFactory").getDatasourceService();
dblist = dbserv.getDatasources(); 
writedump(dblist);
  

Сообщение об ошибке

 The error occurred in C:wwwroot[path][file].cfm: line 6
4 : 
5 :     dbserv = createobject("java","coldfusion.server.ServiceFactory").getDatasourceService();
6 :     dblist = dbserv.getDatasources(); 
7 :     writedump(dblist);
8 : </cfscript>
  

Трассировка стека:

 Check the ColdFusion documentation to verify that you are using the correct syntax.
Search the Knowledge Base to find a solution to your problem.
Browser     Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
Remote Address      127.0.0.1
Referrer    
Date/Time       17-May-12 09:08 AM
Stack Trace
 at cf[file]2ecfm302094979.runPage(C:wwwroot[path][file].cfm:6)

coldfusion.security.SecurityManager$UnauthenticatedCredentialsException
at coldfusion.security.SecurityManager.authenticateAdmin(SecurityManager.java:1958)
at coldfusion.sql.Executive.getDatasources(Executive.java:96)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at coldfusion.runtime.StructBean.invoke(StructBean.java:508)
at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2393)
at cf[file]2ecfm302094979.runPage(C:wwwroot[path][file].cfm:6)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:231)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:416)
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:381)
at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:94)
at coldfusion.filter.LicenseFilter.invoke(LicenseFilter.java:27)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:79)
at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)
at coldfusion.CfmServlet.service(CfmServlet.java:200)
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
at jrun.servlet.FilterChain.service(FilterChain.java:101)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

Debugging Information
ColdFusion Server Developer     9,0,1,274733
Template    [path]/[file].cfm
Time Stamp  17-May-12 09:08 AM
Locale  English (US)
User Agent  Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
Remote IP   127.0.0.1
Host Name   127.0.0.1

Execution Time

top level (16ms) C:wwwroot[path][file].cfm
  · arrowtop level (0ms) CFC[ C:wwwrootCFIDEadminapiadministrator.cfc | login(admin, [password]) ] from C:wwwrootCFIDEadminapiadministrator.cfc @ line 3

(46 ms) STARTUP, PARSING, COMPILING, LOADING, amp; SHUTDOWN
(62 ms) TOTAL EXECUTION TIME
red = over 250 ms execution time

Exceptions

09:08:11.011 - coldfusion.security.SecurityManager$UnauthenticatedCredentialsException - in C:wwwroot[path][file].cfm : line 6
  

Комментарии:

1. Помогает ли это? paulalkema.com/post.cfm /…

2. Повторно я получаю не описательную ошибку… То, что вы опубликовали, работает с CF9. Можете ли вы опубликовать ошибку и выполнить трассировку стека? Кроме того, какая версия CF?

Ответ №1:

 dbserv = createobject("java","coldfusion.server.ServiceFactory").getDatasourceService();
dblist = dbserv.getDatasources(); 
writedump(dblist);
  

Это работает в ColdFusion. Если вы получаете исключение securitycredential, то вам необходимо войти в систему как администратор, например

 admin = new cfide.adminapi.Administrator();
admin.login("password","admin");
  

Следующий код не будет работать

 dbserv2 = createobject("java","coldfusion.server.DataSourceService");
dblist2 = dbserv2.getDatasources();
  

И это по праву вызывающий метод, который не найден. Главным образом потому, что DataSourceService является интерфейсом Java и в нем не реализован этот метод. Он реализован исполнительным классом.

Комментарии:

1. это правильное направление, но я, должно быть, перепутал реализацию, поскольку я все еще получаю ошибку безопасности.

2. @jpmyob Sry, я перепутал с loign api его логин (pwd, id). Отредактировал мой ответ. Теперь должно сработать!

Ответ №2:

Если вы создадите дамп своей переменной dbserv 2, вы увидите, что это не объект, а интерфейс Java, экземпляр которого невозможно создать.

Чтобы сделать то, что вы хотите, вам нужно запросить службу источника данных у service factory.

 <cfscript>
    dbserv2 = createobject("java","coldfusion.server.ServiceFactory").getDataSourceService();

    dblist2 = dbserv2.getDatasources();
</cfscript>
  

Комментарии:

1. гм, нет — это то, что я сделал первым … и это привело к неописуемой ошибке. он просто говорит «произошла ошибка» и дает номер строки — но НИКАКОЙ информации.

2. Повторите просто скажите «произошла ошибка» Как упоминалось в комментариях, вам нужно опубликовать трассировку стека. Вот где находится реальное сообщение об ошибке.

3. Если вы посмотрите на трассировку стека неописуемой ошибки, вы, вероятно, увидите, что это ошибка аутентификации.

Ответ №3:

Для других, кто может наткнуться на этот пост, другой способ сделать то, что было задумано, без необходимости аутентификации с помощью пароля администратора CF — это использовать функцию GetNames() DataSourceService вместо getDatasources . Он возвращает массив всех имен источников данных, зарегистрированных на сервере.

 <cfscript>
    dbserv3 = createobject("java","coldfusion.server.ServiceFactory").getDataSourceService();
    dblist3 = dbserv3.getNames();
</cfscript>
  

Это работает на CF11