0

私が保守しているアプリケーションは、サードパーティの商用 EJB 実装を使用しています。ソースコードを変更する能力はありませんが、読むことはできます。

javax.xml.parsers.DocumentBuilderFactoryEJB のソース コードが、以下を使用する特定の実装を設定していると判断しました。

System.setProperty("javax.xml.parsers.DocumentBuilderFactory", 
    "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");

これを防ぎたいのですが、WARファイルからです。

私の耳は:

EAR
  application.xml
  weblogic-application.xml
  3rd-party-ejb.jar
  my-web-app.war

現在調べているカスタムjava.lang.SecurityManagerの実装に関するSystem.setProperty メソッド呼び出しの検出に関する質問がありますが、WAR ファイルが 3rd-party-ejb.jar の動作にどのように影響するかはまだわかりません。

適切な解決策は何ですか?

4

1 に答える 1

1

このSOの答えを見てください。あなたの問題に対する非常に簡単な解決策を説明していると思います。

更新:コメントに対処するため。

したがって、上記のリンクのように、独自のプロパティを実装し、システム プロパティをそれに置き換えます。以下の変更を防ぐために実装する方法は次のとおりです

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);
        }
    }
}

次に、実行することを確認してください(サーブレットライフサイクルリスナーで言う):

MyProperties newProps = new MyProperties(System.getProperties());
System.setProperties(newProps);

影響を与えないようにしようとしているコードが実行される前に。

于 2013-03-16T04:45:36.610 に答える