[Pljava-dev] Unable to find static method error

马皓明 brightpony at gmail.com
Thu Apr 24 18:19:38 UTC 2008


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: http://pgfoundry.org/pipermail/pljava-dev/attachments/20080425/0b9d9631/attachment.html 


More information about the Pljava-dev mailing list