Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / как заставить oracle видеть java-class ? / 14 сообщений из 14, страница 1 из 1
13.11.2012, 15:27:38
    #38036421
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Доброго времени суток !

имеем
- oracle 11g
- чужие jar

загружаю jar-ки в базу (loadjava ...).

в тесте получаю:
Код: plsql
1.
2.
3.
[Error] Execution (2: 1): ORA-29532: Java call terminated by uncaught Java exception: java.lang.NoClassDefFoundError: com/portal/pcm/fields/FldOpCorrelationId
ORA-06512: at "TEST_CONNECT", line 1
ORA-06512: at line 5


однако,
Код: plsql
1.
2.
3.
4.
5.
6.
select *
from sys.USER_JAVA_CLASSES
where 
  NAME like 'com/portal/pcm/fields/FldOpCorrelationId'

com/portal/pcm/fields/FldOpCorrelationId	46	0	INTERFACE	PUBLIC	NO	NO	NO	NO	-	com/portal/pcm/StrField	-



Если я в своем коде напрямую использую
Код: plsql
1.
 com.portal.pcm.fields.FldOpCorrelationId o = null;


то класс находится без проблем.

Куда копать ??
...
Рейтинг: 0 / 0
13.11.2012, 15:49:16
    #38036472
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Какой статус java-класса?
Код: plsql
1.
2.
3.
4.
select object_type, object_name, dbms_java.longname(object_name) longname, status
from OBJ
where object_type like 'JAVA%'
  and dbms_java.longname(object_name) = 'com/portal/pcm/fields/FldOpCorrelationId';


и как выглядит процедура TEST_CONNECT?
...
Рейтинг: 0 / 0
13.11.2012, 15:56:58
    #38036500
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Денис, приветствую !

Код: plsql
1.
2.
3.
4.
5.
6.
select object_type, object_name, dbms_java.longname(object_name) longname, status
from OBJ
where object_type like 'JAVA%'
  and dbms_java.longname(object_name) = 'com/portal/pcm/fields/FldOpCorrelationId';

JAVA CLASS	/2475b4d5_FldOpCorrelationId	com/portal/pcm/fields/FldOpCorrelationId	VALID



процедурка простая,
В обычной java - работает. С этими же либами портала (oracle BRM).
Такое ощущение, что когда получается ответ от портала и начинает строится результирующий FList используется рефлексия...
Не может ли здесь засада присутствовать ?

Представляешь, что есть BRM ?
...
Рейтинг: 0 / 0
13.11.2012, 15:58:03
    #38036503
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Denis Popov,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED peresetsky."TestConnect" AS

import com.portal.pcm.*;
import com.portal.pcm.fields.*;

public class TestConnect {

    private static long  db = 1;
    private static long  id = -1;

    public static String test_connect () {
    
        com.portal.pcm.fields.FldOpCorrelationId o = null;
    
        PortalContext ctx = null;
        try {
            ctx = ContextHelper.getContext();
           
        //создание параметра  PIN_FLD_ARGS
        FList fld_args;
        fld_args = new FList();
        fld_args.set(FldAccountNo.getInst(),"0.0.0.1-58727");
        SparseArray argsArray = new SparseArray();
        argsArray.add(1,fld_args);

        //создание параметра  PIN_FLD_RESULTS
        SparseArray resultsArray = new SparseArray();
        resultsArray.add(0,(FList)null);

        // создание конечного OP-кода
            FList flist = new FList();

            //заполнение PIN_FLD_ARGS
            flist.set(FldArgs.getInst(),argsArray);
            //заполнение PIN_FLD_FLAGS
            flist.set(FldFlags.getInst(),256);
            //заполнение PIN_FLD_TEMPLATE
            flist.set(FldTemplate.getInst(),"select X  from /account where F1 = V1 ");
            //заполнение PIN_FLD_RESULTS
            flist.set(FldResults.getInst(),resultsArray);
            //заполнение PIN_FLD_POID
            flist.set(FldPoid.getInst(), new Poid(db, id, "/search"));

            FList outflist = ctx.opcode(PortalOp.SEARCH, flist);
           
           
           ContextHelper.release();
           return outflist.toXMLString();
        }
        catch (Exception e) {
           //e.printStackTrace();
            if (ctx!=null){ContextHelper.release();};

            StackTraceElement[] st = e.getStackTrace();
            StringBuffer sb = new StringBuffer();
            for (StackTraceElement el : st) {
                sb.append(el.toString()+"\n");
            }
           
           
           return sb.toString();
        }
    }
    
    public static void test1() {
         com.portal.pcm.fields.FldOpCorrelationId o = null;
    }
    
}
...
Рейтинг: 0 / 0
13.11.2012, 16:01:38
    #38036514
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
ну и для полноты картины

эта выдает ошибку:

Код: plsql
1.
2.
3.
4.
CREATE OR REPLACE function peresetsky.test_connect return varchar2
   as
   language java
    name 'TestConnect.test_connect() return String';



эта работает:
Код: plsql
1.
2.
3.
4.
CREATE OR REPLACE procedure peresetsky.test_connect1
   as
   language java
    name 'TestConnect.test1()';
...
Рейтинг: 0 / 0
13.11.2012, 16:57:51
    #38036640
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Igor-65,

ошибку выдает, конечно вызов функции, а не ее создание :)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare
   str varchar2(32000);
begin
   --test_connect1;
   str := test_connect;
   DBMS_OUTPUT.PUT_LINE(str);
end;   

[Error] Execution (2: 1): ORA-29532: Java call terminated by uncaught Java exception: java.lang.NoClassDefFoundError: com/portal/pcm/fields/FldOpCorrelationId
ORA-06512: at "PERESETSKY.TEST_CONNECT", line 1
ORA-06512: at line 5
...
Рейтинг: 0 / 0
13.11.2012, 17:35:40
    #38036748
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Похоже, проблему локализовал.
Оракловая java не понимает, что такое рефлексия.

попытка в java-коде получить класс:
Код: plsql
1.
2.
3.
4.
5.
6.
Class cl_str = Class.forName("java.lang.String");

[Error]  (0: 0): TestConnect:66: unreported exception java.lang.ClassNotFoundException; must be caught or declared to be thrown
[Error]  (0: 0):          cl_FldOpCorrelationId = Class.forName("java.lang.String");
[Error]  (0: 0):                                               ^
[Error]  (0: 0): 1 error


а в либах, которые я грузил, это используется...

Есть ли другой способ подсунуть оракловой java эти либы ?
Или это безнадежно ?
...
Рейтинг: 0 / 0
13.11.2012, 17:38:57
    #38036757
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Igor-65, если перезаправить java-вский вывод в output, может там будет дополнительная информация?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
   str varchar2(32000);
begin
   dbms_java.set_output(2000);
   str := test_connect;
   DBMS_OUTPUT.PUT_LINE(str);
end;
/
...
Рейтинг: 0 / 0
13.11.2012, 17:52:32
    #38036799
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Igor-65а в либах, которые я грузил, это используется...
И пускай:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace and resolve java source named "Test" as
public class Test {
  public static void foo() throws ClassNotFoundException {
    Class.forName("java.lang.String");
  }
}
/
create or replace procedure TEST_FOO as language java name 'Test.foo()';
/
begin
  dbms_java.set_output(2000);
  TEST_FOO();
end;
/
...
Рейтинг: 0 / 0
13.11.2012, 18:26:14
    #38036829
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Денис,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
   str varchar2(32000);
begin
   dbms_java.set_output(2000);
   str := test_connect;
   DBMS_OUTPUT.PUT_LINE(str);
end;

Creating PCM context using configuration supplied in a Properties object...
Exception in thread "Root Thread" java.lang.NoClassDefFoundError: com/portal/pcm/fields/FldOpCorrelationId
	at ContextHelper.createContextUsingProperties(ContextHelper:54)
	at ContextHelper.getContext(ContextHelper:26)
	at TestConnect.test_connect(TestConnect:15)



т.е. вылетает на
context.connect(props);

файл Infranet.properties я загрузил..

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
import com.portal.pcm.EBufException;
import com.portal.pcm.PortalContext;

import java.io.IOException;
import java.util.Properties;

/**
 * Created by IntelliJ IDEA.
 * User: peresetsky
 * Date: 09.11.12
 * Time: 10:53
 * To change this template use File | Settings | File Templates.
 */
public class ContextHelper {

    private static String hostname="10.110.32.59";
    private static String port="11950";
    private static String login="login";
    private static String password="password";

    private static PortalContext ctx = null;

    public static PortalContext getContext() throws IOException {
        if (ctx==null) {
            ctx = createContextUsingProperties();

        }
        return ctx;
    }

    private static PortalContext createContextUsingProperties() throws IOException {
        System.out.println("---------------------------------------------------------------");
        System.out.println("Creating PCM context using configuration supplied in a Properties object...");
        Properties props = new Properties();
        PortalContext context = null;

        props.put("infranet.connection",
                  "pcp://" + login + ":" +
                          password + "@" +
                          hostname +
                  ":" + port + "/service/admin_client 1");


        props.put("infranet.login.type", "1");

        try {
            context = new PortalContext();
            context.connect(props);

            System.out.println("Context successfully created.");
            // print out some info about the connection
            System.out.println("current DB: " + context.getCurrentDB());
            System.out.println("user ID:    " + context.getUserID());

        } catch (EBufException ebufex) {
            System.out.println("Your connection to the server failed.");
            System.out.println(" * Have you modified 'HOST', 'LOGIN', 'PASSWORD' and 'PORT' variables at the top of this example?");
            System.out.println(" * Is the Infranet server CM up?");
            System.out.println("Here's the error:");
            System.out.println(ebufex);
            System.exit(1);
        }

        return context;
    }

    public static void release() {
        if (ctx!=null) {
            try {
                ctx.close(true);
                System.out.println("PCM connection closed.");
            } catch (EBufException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
    }
 }
...
Рейтинг: 0 / 0
13.11.2012, 18:43:17
    #38036850
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Igor-65файл Infranet.properties я загрузил..
Могу ошибатсья и дело не в этом, но тут сказано:
The Properties object requires two key/value entries:
Key: Value: Infranet.connect Connection_string Infranet.login.type 1

у тебя же первая строка с ключем "infranet.connection", а не "Infranet.connect"
...
Рейтинг: 0 / 0
13.11.2012, 18:55:39
    #38036867
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Думаю, дело не в этом, т.к. прежде, чем грузить в oracle, я все отладил в сторонке.

Если декомпилить PortalContext и PortalProperties

то станет очевидно, что ищется infranet.connection. (так же и в примерах к порталу)
Тут ошибка в доке, что ты приложил.

PortalContext:
Код: plsql
1.
String str1 = getProperty("connection");


PortalProperties:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 private static String getSysProperty(String paramString1, String paramString2)
  {
    StringBuffer localStringBuffer = new StringBuffer("infranet.");
    if (paramString1 != null)
      localStringBuffer.append(paramString1).append(".").append(paramString2);
    else
      localStringBuffer.append(paramString2);
    String str = sysprops.getProperty(localStringBuffer.toString());
    if ((str == null) && (paramString1 != null))
      str = sysprops.getProperty("infranet." + paramString2);
    return str;
  }
...
Рейтинг: 0 / 0
13.11.2012, 19:21:28
    #38036907
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Может, есть исходники pcm.jar ?
...
Рейтинг: 0 / 0
13.11.2012, 19:26:41
    #38036915
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить oracle видеть java-class ?
Если идей никаких нет, то буду строить иначе.
Хотелось избежать еще одного узла в транспортной цепочке :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / как заставить oracle видеть java-class ? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]