我在 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");
运行这个程序,它的反应不同,返回完整的打印机列表。仔细检查,我将相同的代码(使用日志记录语句而不是 System.print 语句)放在 Web App 的上下文初始化方法中,它仍然返回零打印机。该方法返回不同的结果,具体取决于它是从 Web 应用程序 War 还是独立 jar 中运行。
我的一些同事建议它可能与安全管理器有关,事实上,PrintService 类的文档说安全管理器的某些属性可以改变方法调用的结果。但是,在我的测试中添加一些代码以检索和查看安全管理器之后,似乎在这两种情况下都没有。
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!!");
}
结果是安全管理器在这两种情况下都是空的。
在不同的服务器上尝试,Web 应用程序和服务器的独立 jar 版本都不会返回打印机。我找不到一致性。
这里发生了什么? 是什么导致此 javax 方法调用在不同情况下返回不同的结果?Web 应用程序可能会发生什么变化以改变其在一天和第二天之间的行为?