Если вы используете document.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
, вы получите пустой список узлов, а предоставленный исходный код выбросит ваш new SecurityException("Cannot find signature")
.
Если вы document.getElementsByTagName("Signature")
, элемент Signature найден, но без распознавания пространства имен, позже выдается это исключение:
javax.xml.crypto.MarshalException: Document implementation must support DOM Level 2 and be namespace aware
at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshal(DOMXMLSignatureFactory.java:189)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshalXMLSignature(DOMXMLSignatureFactory.java:150)
При исследовании термина getElementsByTagNameNS(XMLSignature.XMLNS, "Signature")
я нашел примеры кода, в которых они активируют осведомленность о пространстве имен в новом экземпляре DocumentBuilderFactory вручную:
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
Это должно исправить вашу new SecurityException("Cannot find signature")
проблему.
Относительно вашего предыдущего вопроса вы не только перенесли Java 8 на 11, но также и CDI API, OpenWebBeans, Apache Tomcat и, возможно, другие модули, кто-то другой должен был сделать эту активацию осведомленности о пространстве имен для вас ранее ,
Или, говоря по-другому - вы @Внедрили экземпляр DocumentBuilderFactory, осведомленный о пространстве имен.
Edit:
Для ручной настройки и внедрения DocumentBuilderFactory
создайте метод, который @Produces
создает экземпляр DocumentBuilderFactory
и предоставляет этот экземпляр для внедрения в другом месте:
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Produces;
import javax.xml.parsers.DocumentBuilderFactory;
@Dependent
public class DocumentBuilderFactoryProducer {
@Produces
@ApplicationScoped
public DocumentBuilderFactory createDocumentBuilderFactory() {
DocumentBuilderFactory result = DocumentBuilderFactory.newInstance();
result.setNamespaceAware(true);
// other customizations ...
return result;
}
}
Это может быть введено в другие бины, например:
@Inject
private DocumentBuilderFactory documentBuilderFactory;