Проблема xpathFactory в многопоточном приложении java - PullRequest
0 голосов
/ 28 марта 2020

У меня есть класс xpathutility, который я использую во всем приложении, чтобы получить строку или результаты узла из выражения xpath:

public static String getStringResult(String expression, Document doc) {
        String outString = new String();

        try {
            outString = (String)xpath.compile(expression).evaluate(doc, XPathConstants.STRING);
        } catch (XPathExpressionException e) {
            e.printStackTrace(System.out);
        }
        return outString;
    }
    public static NodeList getNodeListResult(String expression, Document doc) {
        NodeList outList = null;

        try {
            outList = (NodeList)xpath.compile(expression).evaluate(doc, XPathConstants.NODESET);
        } catch (XPathExpressionException e) {
            e.printStackTrace(System.out);
        }
        return outList;
    }

Для инициализации фабрики я использовал следующее, чтобы сделать поток безопасным, нашел его поверх inte rnet:

 private static final ThreadLocal<XPathFactory> XPATH_FACTORY = new ThreadLocal<XPathFactory>()
    {
        @Override
        protected XPathFactory initialValue()
        {
            return XPathFactory.newInstance();
        }
    };
    private static final XPath xpath= XPATH_FACTORY.get().newXPath();

Но когда я выполняю это из нескольких потоков, это дает мне нулевое ожидание указателя для xpath. Нужно знать, как сделать это потокобезопасным.

...