Monthly Archives: Апрель 2016

Встраивание атрибута Id в тег Body SOAP-запроса

С некоторой версии Java (примерно с 7u25 см. http://stackoverflow.com/questions/17331187/xml-dig-sig-error-after-upgrade-to-java7u25) начались проблемы со встаиванием атрибута Id в тег Body SOAP-запроса. Такое встраивание необходимо с целью подписания запроса ЭЦП.
Пока я встретил две ошибки в зависимости каким путем идет встраивание атрибута Id:

  1. com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment
  2. org.apache.xml.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID …

Чтобы решить проблему нужно специальным образом пометить атрибут Id как ID (простите за тавтологию)

Первая ошибка возникает в коде такого вида:

Attr attr = doc.createAttribute("id");
attr.setValue("body");
body.getAttributes().setNamedItem(attr);

Подкорректированная версия:

Attr attr = doc.createAttribute("id");
attr.setValue("body");
body.getAttributes().setNamedItem(attr);
((Element) body).setIdAttributeNode(attr, true);//fix

Вторая ошибка возникает в коде вида:

SOAPBody body = env.getBody();
body.addAttribute(new QName("Id"), id);

Подкорректированная версия:

SOAPBody body = env.getBody();
body.addAttribute(new QName("Id"), id);
body.setIdAttribute("Id", true);//fix

Если помог отпишитесь 🙂