当前位置: 首页 > 知识库问答 >
问题:

将命名空间设置为@XmlRootElement时,解组失败且没有错误

爱茂勋
2023-03-14

我已经创建了一个JAXB对象,我正在尝试向其中散集一个xml字符串。我面临的问题是,当我将名称空间属性放入@XmlRootElement和我正在发送的xml文档中时,正在创建JAXB对象,但它是空的。如果我删除名称空间,它就可以工作。这就是我的意思。

我的JAXB对象:

@XmlRootElement(name = "incident", namespace = "http://www.ba.com/schema/BAserviceDeskAPI/incident")
@XmlAccessorType(XmlAccessType.FIELD)
public class Incident {

    @XmlElement
    private String eventTitle;

    public Incident() {
    }

    public String getEventTitle() {
        return eventTitle;
    }

    public void setEventTitle(String eventTitle) {
        this.eventTitle = eventTitle;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Incident [");
        builder.append("eventTitle=");
        builder.append(eventTitle);
        builder.append("]");
        return builder.toString();
    }
}

我的主要:

public static void main(String[] args) throws JAXBException {
        String s = "<incident xmlns=\"http://www.ba.com/schema/BAserviceDeskAPI/incident\">"
                + "<eventTitle>Test Title from BAwrapper</eventTitle>"
                + "</incident>";
        JAXBContext jaxbContext = JAXBContext.newInstance(Incident.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Incident incident = (Incident) jaxbUnmarshaller.unmarshal(new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8)));

        System.out.println(incident.toString());
    }
}

输出:

Incident [eventTitle=null]

如果我从@XmlRootElement中删除 ,命名空间 = “http://www.ba.com/schema/BAserviceDeskAPI/incident” xmlns=\“http://www.ba.com/schema/BAserviceDeskAPI/incident\” 从发送的 xml 中删除,我得到下面的输出

事件 [事件标题 = 来自 BAwrapper 的测试标题]

知道为什么会这样吗?

谢谢

共有1个答案

白成济
2023-03-14

<code>@XmlRootElement</code>上指定的命名空间仅适用于该元素。如果您希望它应用于您映射到的所有元素,可以使用<code>@XmlSchema</code>注释在包级别执行此操作。

package-info.java

@XmlSchema( 
    namespace = "http://www.ba.com/schema/BAserviceDeskAPI/incident", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

详细信息

我在博客上写了更多关于JAXB和命名空间限定的内容:

  • http://blog.bdoughan.com/2010/08/jaxb-namespaces.html

将命名空间设置为@XmlRootElement时,解组失败且没有错误

对于 JAXB,我们(JSR-222 专家组)决定,如果存在未映射的内容,则默认情况下,取消封送不会失败。为什么?因为很多XML文档都包含额外的内容,所以事情会一直失败。如果您确实希望看到这些错误,则可以在取消装配器上指定验证事件处理程序

 类似资料:
  • 当我试图使用包含名称空间的JAXB将xml转换为Java对象时,会发生错误。 示例示例:' Zeta Walnes ` 我需要忽略名称空间

  • 命名空间是设计用来扑捉框架最常见用途和提供一个简化和简介的语法用来在应用程序中打开他们。设计是基于框架中的大规模依赖,并且可以划分为以下几个方面: Web/HTTP 安全- 最复杂的部分,设置过滤器和应用框架验证机制的相关服务bean,渲染登录和错误页面等等。 业务对象(方法)安全 - 业务层安全选项. AuthenticationManager - 处理来自框架其他部分的认证请求 AccessD

  • 我的操作系统是Debian10(Buster),4.19内核,Tomcat9似乎不稳定。 我不希望在运行'SystemCTL status tomcat9.service'命令时看到任何错误消息。 但是,'systemCTL status tomcat9.service'命令是打印错误消息。 然而,尽管有错误消息,我已经确认网页工作正常。 我不知道为什么会这样。 我试图解决这个问题。 shutdo

  • SimpleXML示例页的"示例#5使用属性"部分指出: 访问元素的属性,就像访问数组的元素一样。 在SimpleXMLElement中的示例#1::cHilrey()使用语法来访问子属性; 将命名空间添加到该代码,将禁用对属性的访问: 这里有很多问题指向同一个解决方案,即使用函数而不是作为数组进行访问,但没有一个答案解释原因。 使用名称空间时的这种不同行为是错误吗?文件是否过时?我们是否应该始终

  • 我有一个为安全令牌构建的XML。这些包含基于WS-Trust的名称空间,但是当我解组这个XML以创建< code > RequestSecurityTokenResponseCollection 对象时,它用< code>ns1 、< code>ns2 、< code>ns3等名称空间替换了这些名称空间。 是否有一种方法可以在不更改输入XML中的名称空间和名称空间前缀的情况下解组XML? 这是我一

  • 我的代码如下: 我怎样才能让它工作?如果我的xml标记有一些相关元素,如上面的“xmlns”,则JAXB解组器会抛出异常。 这是我第一次这么做,所以我对JAXB、解编等都一无所知。我在苦苦挣扎任何帮助都是好的。 编辑StackTrace: