From: brightpony at gmail.com (=?GB2312?B?wu3wqcP3?=) Date: Fri, 25 Apr 2008 02:19:38 +0800 Subject: [Pljava-dev] Unable to find static method error Message-ID: <542c32f50804241119k115d718ejde17e63ff9ae4c32@mail.gmail.com> Hello, everyone. I'm a newbie to pljava, and I came across "Unable to find static method" error. I've build a jar called myproject-pljava.jar, and there is a Test.java in myproject-pljava.jar like this: public class Test { public static Timestamp getTimestamp() { return new Timestamp(System.currentTimeMillis()); } } And there is a IndexSyncTrigger.java in myproject-pljava.jar ( I want to use pljava to write some triggers to keep Lucene index synchronized with the data in DB. ) which denpends other jars such as spring.jar, commons-configurations.jar. I can call Test.getTimestamp from SQL and it works well. But when I tried to call IndexSyncTrigger.getTimestamp and IndexSyncTrigger.getBeansCount, I always got an error: Error: Unable to find static method com.mycompany.myproject.pljava.IndexSyncTrigger.getTimestamp with signature ()Ljava/sql/Timestamp; ********** Error ********** Error: Unable to find static method com.mycompany.myproject.pljava.IndexSyncTrigger.getTimestamp with signature ()Ljava/sql/Timestamp; SQL state: XX000 ---------------------------------------------------------------------------------------------- I've put all of the dependent jars to a dir and config them in the postgresql.conf, just like this: custom_variable_classes = 'pljava' pljava.classpath = '/opt/pljava-classpath/pljava.jar:/opt/pljava-classpath/commons-collections.jar:/opt/pljava-classpath/lucene-analyzers-2.2.0.jar:/opt/pljava-classpath/commons-configuration-1.3.jar:/opt/pljava-classpath/lucene-core-2.2.0.jar:/opt/pljava-classpath/commons-io.jar:/opt/pljava-classpath/jakarta-oro-2.0.8.jar:/opt/pljava-classpath/lucene-memory-2.2.0.jar:/opt/pljava-classpath/commons-lang.jar:/opt/pljava-classpath/jchardet-1.0.jar:/opt/pljava-classpath/pljava.jar:/opt/pljava-classpath/commons-logging.jar:/opt/pljava-classpath/log4j-1.2.14.jar:/opt/pljava-classpath/spring.jar:/opt/pljava-classpath/classes:/opt/pljava-classpath/terrier-lexer.jar' And the deployment descriptor and the IndexSyncTrigger.java are here: SQLActions[] = { "BEGIN INSTALL CREATE SCHEMA myproject_pljava; BEGIN PostgreSQL SET search_path TO myproject_pljava,public END postgreSQL; CREATE FUNCTION myproject_pljava.tk_getTimestamp() RETURNS timestamp AS 'com.mycompany.myproject.pljava.IndexSyncTrigger.getTimestamp' LANGUAGE javaU; CREATE FUNCTION myproject_pljava.tk_testgetTimestamp() RETURNS timestamp AS 'com.mycompany.myproject.pljava.Test.getTimestamp' LANGUAGE javaU; CREATE FUNCTION tk_getBeansCount() RETURNS int4 AS 'com.mycompany.myproject.pljava.IndexSyncTrigger.getBeansCount' LANGUAGE javaU; END INSTALL", "BEGIN REMOVE DROP SCHEMA myproject_pljava CASCADE; END REMOVE" } public class IndexSyncTrigger { private static final String NAME_COL = "name"; private static final String ALIAS_COL = "alias"; private static final String ID = "id"; private static final String TYPE = "type"; private static final String CITY_ID = "city_id"; private static ApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "pljavaContext.xml" }); private static Indexer indexer = (Indexer) context.getBean("myprojectIndexer"); private static PoiDocument getDocument(ResultSet rs, String table) throws SQLException { String name = rs.getString(NAME_COL); String alias = rs.getString(ALIAS_COL); Long id = rs.getLong(ID); String type = rs.getString(TYPE); String cityId = rs.getString(CITY_ID); return new PoiDocument(table, id, cityId, name, alias, type); } public static void update(TriggerData td) throws SQLException { checkTd(td); if (!td.isFiredByUpdate()) throw new TriggerException(td, "must be fired by update event"); String table = td.getTableName(); PoiDocument newDoc = getDocument(td.getOld(), table); PoiDocument oldDoc = getDocument(td.getNew(), table); indexer.update(oldDoc, newDoc); } private static void checkTd(TriggerData td) throws SQLException, TriggerException { if (td.isFiredForStatement()) throw new TriggerException(td, "can't process STATEMENT events"); if (td.isFiredBefore()) throw new TriggerException(td, "must be fired after event"); } public static void delete(TriggerData td) throws SQLException { checkTd(td); if (!td.isFiredByDelete()) throw new TriggerException(td, "must be fired by delete event"); indexer.delete(getDocument(td.getOld(), td.getTableName())); } public static void add(TriggerData td) throws SQLException { checkTd(td); if (!td.isFiredByInsert()) throw new TriggerException(td, "must be fired by insert event"); indexer.add(getDocument(td.getNew(), td.getTableName())); } public static void flush() throws SQLException { indexer.flush(); } public static void optimize() throws SQLException { indexer.optimize(); } public static int getBeansCount() { return context.getBeanDefinitionCount(); } public static Timestamp getTimestamp() { return new Timestamp(System.currentTimeMillis()); } } BTW, I'm using postgresql 8.2 on Ubuntu 8.04, and pljava 1.4. Thanks in advance. -------------- next part -------------- An HTML attachment was scrubbed... URL: