javax.print库中的结果不一致



我在Tomcat 5.0中运行的Web应用程序中有一段代码,它调用javax.print.PrintServiceLookup方法lookupPrintServices(null,null)。以前,此代码返回一个大数组,按预期列出服务器上的所有打印机。最近突然有一天,它开始表现不同,现在返回一个没有打印机的零大小数组。经过相当彻底的检查,我无法确定是什么变化导致这种方法现在的行为与以前不同。

我制作了一个小型的独立测试程序,其中包含相同的方法调用。

    PrintService[] printers = PrintServiceLookup.lookupPrintServices(null, null);
    System.out.println("Java Version: " + System.getProperty("java.version"));
    System.out.println("Printers found:");
    if (printers != null) {
        for (PrintService printer : printers) {
            if (printer != null) {
                System.out.println("    " + printer.toString());
            }
        }
    }
    System.out.println("End");

运行此程序时,的反应不同,返回打印机的完整列表。经过反复检查,我在Web应用程序的上下文初始化方法中放入了相同的代码(使用日志记录语句而不是System.print语句),它仍然返回零打印机。方法返回不同的结果,这取决于它是从web应用程序war还是从独立jar运行。

我的一些同事认为,这可能与SecurityManager有关,事实上,PrintService类的文档表明,SecurityManager的某些属性可以更改方法调用的结果。但是,在将一些代码添加到我的测试中以检索和查看Security Manager之后,在这两种情况下似乎都没有。

    try {
        if (sec != null) {
            System.out.println(sec.toString());
            sec.checkPrintJobAccess();
        }
        System.out.println("*-*-*-*-*Printer Access allowed!!");
    }
    catch (SecurityException e) {
        System.out.println("*-*-*-*-*Printer NOT Access allowed!!");
    }

结果是,安全管理器在这两种情况下都是null

在另一台服务器上尝试,web应用程序和独立的jar版本都不会返回打印机。我找不到一致性。

这里发生了什么是什么导致这个javax方法调用在不同的情况下返回不同的结果?在这一天和下一天之间,网络应用程序的行为会发生什么变化?

尝试使用此选项启动服务器-DUseSunHttpHandler=true以使用JDK API而不是服务器API启动HTTP URL连接。希望这对你也有用。

最新更新