【发布时间】:2011-08-01 14:59:40
【问题描述】:
我正在尝试创建 SAML 响应。构成断言的属性之一称为地址,属性值需要是在 XSD 中定义的自定义类型。如何向响应中添加自定义属性值类型?
【问题讨论】:
我正在尝试创建 SAML 响应。构成断言的属性之一称为地址,属性值需要是在 XSD 中定义的自定义类型。如何向响应中添加自定义属性值类型?
【问题讨论】:
如果你的属性值 XML 是字符串形式:
String yourXMLFragment = "...";
AttributeStatementBuilder attributeStatementBuilder =
(AttributeStatementBuilder) builderFactory.getBuilder(AttributeStatement.DEFAULT_ELEMENT_NAME);
AttributeStatement attributeStatement = attributeStatementBuilder.buildObject();
AttributeBuilder attributeBuilder =
(AttributeBuilder) builderFactory.getBuilder(Attribute.DEFAULT_ELEMENT_NAME);
Attribute attr = attributeBuilder.buildObject();
attr.setName("yourAttributeName");
XSAnyBuilder sb2 = (XSAnyBuilder) builderFactory.getBuilder(XSAny.TYPE_NAME);
XSAny attrAny = sb2.buildObject(AttributeValue.DEFAULT_ELEMENT_NAME, XSAny.TYPE_NAME);
attrAny.setTextContent(yourXMLFragment.trim());
attr.getAttributeValues().add(attrAny);
attributeStatement.getAttributes().add(attr);
【讨论】:
实际上,上面的结果并不正确。上面的示例只能用于创建带有文本内容而不是 xml 内容的 xsany(xml 内容被转义)。
因此,在挖掘 opensaml 源代码后,以下确实根据需要工作:
public XSAny createXSAny(Element dom)
{
XSAnyBuilder anyBuilder = (XSAnyBuilder) Configuration.getBuilderFactory().getBuilder(XSAny.TYPE_NAME);
XSAny any = anyBuilder.buildObject(AttributeValue.DEFAULT_ELEMENT_NAME, XSAny.TYPE_NAME);
// this builds only the root element not the whole dom
XSAny xo=anyBuilder.buildObject(dom);
// set/populate dom so whole dom gets into picture
xo.setDOM(dom);
any.getUnknownXMLObjects().add(xo);
return any;
}
【讨论】: