是否应该在MarkLogic 9中的新Session对象上获取isAutoCommit或getUpdate上的NPE?

时间:2018-02-25 13:36:48

标签: marklogic marklogic-9

在MarkLogic XCC版本9.0-3下,尝试在新的Session对象上调用isAutoCommitgetUpdate时,会出现NullPointerException。

如果首先调用setAutoCommitsetUpdate,则NPE会。这是故意的行为吗?如果是这样,为什么?即使没有设置任何值,Session的所有其他getter也会毫无错误地返回。

我构建了一个最小的可行示例:

import java.net.URI;

import com.marklogic.xcc.ContentSource;
import com.marklogic.xcc.ContentSourceFactory;
import com.marklogic.xcc.Session;

public class mve {
    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            System.err.println("usage: xcc://user:password@host:port/contentbase");
            return;
        }

        System.out.println("Running minimal viable example of MarkLogic isAutoCommit/getUpdate bug...");

        URI uri = new URI(args[0]);
        ContentSource contentSource = ContentSourceFactory.newContentSource(uri);
        Session updateSession = contentSource.newSession();

        // comment out the following two lines to cause a NullPointerException to be thrown on getUpdate and isAutoCommit:
        updateSession.setAutoCommit(false);
        updateSession.setUpdate(Session.Update.TRUE);

        System.out.println("is AutoCommit?");
        System.out.println(updateSession.isAutoCommit()); // if lines 21 and 22 are both commented out, this will cause NPE

        System.out.println("getUpdate?");
        System.out.println(updateSession.getUpdate());  // if lines 21 and 22 are both commented out, this will cause NPE
    }
}

1 个答案:

答案 0 :(得分:2)

这两种方法都试图访问TransactionMode的属性,该属性为null。

调用setAutoCommit()setUpdate(),或使用setTransactionMode()明确设置TransactionMode,可确保txnMode不是null

如果升级到9.0.4,SessionImpl isAutoCommit()将返回默认true而没有NPE:

public boolean isAutoCommit() {
    return txnMode == null ? true : txnMode.isAutoCommit();
} 

但如果在没有getUpdate()成立的情况下调用txnMode,您仍会获得NPE:

public Update getUpdate() {
    return txnMode.getUpdate();
}

期望它返回默认值TransactionMode.AUTO而不是NPE可能是合理的。