我维护的一个应用程序使用第三方商业 EJB 实现。我没有能力更改源代码,但我可以阅读它。
我已确定 EJB 的源代码正在使用以下方式设置 javax.xml.parsers.DocumentBuilderFactory
的特定实现:
System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
我想阻止这种情况发生——但是要通过 WAR 文件来阻止。
我的 EAR 是:
EAR application.xml weblogic-application.xml 3rd-party-ejb.jar my-web-app.war
有 Detecting System.setProperty method invocations关于实现自定义的问题java.lang.SecurityManager我现在正在研究,但我仍然不明白 WAR 文件如何影响 3rd-party-ejb.jar 行为。
正确的解决方案是什么?
最佳答案
看看this所以回答。我相信它描述了一个非常简单的解决方案来解决您的问题。
更新:为了解决评论。
因此,如上面的链接所示,您可以实现自己的属性并用它替换系统属性。这是我将如何实现它以防止更改以下内容
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
没有任何影响:
public class MyProperties extends Properties {
public MyProperties(Properties properties) {
super(properties);
}
@Override
public Object setProperty(String key, String value) {
if ("javax.xml.parsers.DocumentBuilderFactory".equals(key) && "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl".equals(value)) {
return null;
} else {
return super.setProperty(key, value);
}
}
}
然后确保您运行(例如在 servlet 生命周期监听器中):
MyProperties newProps = new MyProperties(System.getProperties());
System.setProperties(newProps);
在您试图阻止产生效果的代码有机会运行之前。
关于java - 如何防止 Java 系统属性发生更改(在 Java EE 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15435732/