java - JAXB 为非根元素提供命名空间

标签 java xml xsd jaxb saml

需求是这样的

<samlp:Response xmlns:samlp="something1" >
    <saml:EncryptedAssertion xmlns:saml="something2">
         <EncryptedData xmlns="something3" >
             some more tags with namespace
         </EncryptedData> 
    </saml:EncryptedAssertion>
</samlp:Response>

我使用 package-info.java 获得了根级别的前缀和命名空间,但我无法获取非根级别的命名空间定义,即

这就是我能够实现的目标

<samlp:Response xmlns:samlp="something1" xmlns:saml="something2" xmlns:ns6="someting3">
    <saml:EncryptedAssertion >
        <EncryptedData >
            some more tags with namespace
        </EncryptedData>
    </saml:EncryptedAssertion>
</samlp:Response>

包信息.java

@XmlSchema(
        namespace="something1",

    elementFormDefault=XmlNsForm.UNQUALIFIED,
    attributeFormDefault =XmlNsForm.UNQUALIFIED,
    xmlns={ 
            @XmlNs(prefix = "samlp", namespaceURI = "somthing1"),
            @XmlNs(prefix = "saml", namespaceURI = "something2"),
            @XmlNs(prefix = "", namespaceURI = "something3"),
    }
)

我知道命名空间可以在父/根节点中定义,并且它将是有效的,但我正在使用 Web 服务,因此我不确定在父级别中声明的命名空间在解码时是否会产生任何影响,这就是我尝试生成精确的 saml 响应的原因。

最佳答案

我就是这样做的。 不确定天气是对还是错,但它适用于我提到的有问题的场景。

  1. 添加了特定 JAXBclass 中的必需属性

    public class EncryptedAssertionType {
    @XmlAttribute(name = "xmlns:saml")
    protected String samlNamespace;
    
  2. 为同一变量生成 getter/setter 并在编码时设置变量

    EncryptedAssertionType encryptedAssertion = new EncryptedAssertionType();
    encryptedAssertion.setSamlNamespace("something2");
    

    如果需要,您可以将此类属性添加到所有级别

无需包含package-info.java

这给了我预期的回应

    <samlp:Response xmlns:samlp="something1" >
    <saml:EncryptedAssertion xmlns:saml="something2">

关于java - JAXB 为非根元素提供命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37518284/

相关文章:

java - 在 Android 中以位图、jpeg 或 png 图像形式查看 PowerPoint XML

XML 数据绑定(bind)向导备选方案

visual-studio-2008 - Visual Studio 2008 的 XML 架构设计器

java - 如何在Spring Boot中默认阻止@PathVariable值的解码

java - 为什么 hasNextInt() 在这里返回 false ?

java - Spring @Controller 和 Transactionmanager

Python如何制作 "associative array"

java - 无法在公共(public)类中调用公共(public)静态方法

xml - XSLT 转换取决于父项值

javascript - 使用 jQuery 解析自定义 XML 模式