首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java7 Update4中的SecurityManager和XSLT扩展被破坏了吗?

Java7 Update4中的SecurityManager和XSLT扩展被破坏了吗?
EN

Stack Overflow用户
提问于 2012-05-26 04:10:38
回答 1查看 1.8K关注 0票数 4

Java应用程序FreeMind使用XSLT从旧文件进行更新。XSLT使用静态java函数来简化字符串操作。这在java7更新2中运行得很好,并且在windows下的java7更新4中给出了以下异常:

代码语言:javascript
复制
STDERR: ERROR:  'The first argument to the non-static Java function 'replaceSpacesToNonbreakableSpaces' is not a valid object reference.'
STDERR: FATAL ERROR:  'Could not compile stylesheet'May 26, 2012 10:50:06 PM freemind.main.Resources logException
SEVERE: An exception occured: 
javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(Unknown Source)
    at freemind.main.Tools$1TransformerRunnable.run(Tools.java:1023)
    at java.lang.Thread.run(Unknown Source)

将其简化为一个最小的示例,就会发现自定义SecurityManager是罪魁祸首。如果设置,代码将失败。如果将其注释掉,代码就会正常工作。有没有人知道,在更新2和更新4之间,java7的安全系统发生了什么变化,或者其他什么可能导致这种变化?

下面是一个更小的例子:

代码语言:javascript
复制
package freemind.main;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public final class FreeMindSecurityTest  {

    public static void main(String[] args) throws Exception {
        // if commented out, this program works as expected.
        System.setSecurityManager(new SecurityManager());
        String input = "<map version=\"0.9.0\">"
                + "</map>";
        String xslt = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                + "     <xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:FreeMindSecurityTest=\"xalan://freemind.main.FreeMindSecurityTest\" exclude-result-prefixes=\"FreeMindSecurityTest\">"
                + "         <xsl:template               match=\"/ | node() | @* | comment() | processing-instruction()\">"
                + "             <xsl:value-of select=\"FreeMindSecurityTest:replaceSpacesToNonbreakableSpaces('test')\"/>"
                + "         </xsl:template>" + "        </xsl:stylesheet>";
        StringWriter writer = new StringWriter();
        final Result result = new StreamResult(writer);

        final StreamSource sr = new StreamSource(new StringReader(input));
        // create an instance of TransformerFactory
        TransformerFactory transFact = TransformerFactory.newInstance();
        Transformer trans = transFact.newTransformer(new StreamSource(
                new StringReader(xslt)));

        trans.transform(sr, result);

        System.out.println("Transformed: " + writer.getBuffer());
        writer.close();
    }

    public static String replaceSpacesToNonbreakableSpaces(String input) {
        return input;
    }



}

简而言之,java认为该方法不是静态的(但它确实是静态的),并且遗漏了对象引用。

蒂娅,来自FreeMind的克里斯

编辑:添加了最短的示例(只需设置普通安全管理器的副本即可)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-29 00:28:39

JAXP 1.4.6 (in Java 7 Update 4)中可能存在错误。Java7u4中的一个变化是升级到了JAXP1.4.6,参见Java Release Notes

一种变通方法/解决方案(可能不是最好的选择)是通过Java endorsed folder使用Xalan2.7.1,而不使用额外的补丁。(将xalan 2.7.1 jars复制到jre/libs/endorsed中)或使用Xalan作为第三方库。

它在我使用J7U4和Xalan2.7.1的Linux64上工作正常

代码语言:javascript
复制
Transformed: <?xml version="1.0" encoding="UTF-8"?>test
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10760798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档