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

JAXB 封送名称空间前缀

萧宏远
2023-03-14

我正在开发一个客户端来使用 Web 服务,但由于某种原因,除非所有命名空间都正确且没有任何前缀,否则我的请求没有得到正确处理。

我所有的类都是由服务提供商使用提供的XSD和WSDL创建的。

NfeDadosMsg.class

package br.inf.portalfiscal.nfe.wsdl.nfestatusservico4;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlMixed;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "content"
})
@XmlRootElement(name = "nfeDadosMsg")
public class NfeDadosMsg {

    @XmlMixed
    @XmlAnyElement(lax = true)
    protected List<Object> content;

    public List<Object> getContent() {
        if (content == null) {
            content = new ArrayList<Object>();
        }
        return this.content;
    }

}

包装信息.java

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.portalfiscal.inf.br/nfe/wsdl/NFeStatusServico4", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package br.inf.portalfiscal.nfe.wsdl.nfestatusservico4;

TConsStatServ.class package br.inf.portalfiscal.nfe;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "TConsStatServ",
    propOrder = {"tpAmb", "cuf", "xServ"}
)
public class TConsStatServ {
    @XmlElement(
        required = true
    )
    protected String tpAmb;
    @XmlElement(
        name = "cUF",
        required = true
    )
    protected String cuf;
    @XmlElement(
        required = true
    )
    protected String xServ;
    @XmlAttribute(
        name = "versao",
        required = true
    )
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    protected String versao;

    public TConsStatServ() {
    }

    ...

}

包装信息.java

package br.inf.portalfiscal.nfe;

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.portalfiscal.inf.br/nfe", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package br.inf.portalfiscal.nfe

输出xml:

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
  <S:Body>
    <nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NFeStatusServico4" xmlns:ns2="http://www.portalfiscal.inf.br/nfe">
      <ns2:consStatServ versao="4.00">
        <ns2:tpAmb>2</ns2:tpAmb>
        <ns2:cUF>33</ns2:cUF>
        <ns2:xServ>STATUS</ns2:xServ>
      </ns2:consStatServ>
    </nfeDadosMsg>
  </S:Body>
</S:Envelope>

由于某种原因,如果我有一个带前缀的名称空间,web服务就不能正确地使用它。所以我需要的是

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
  <S:Body>
    <nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NFeStatusServico4">
      <consStatServ versao="4.00" xmlns="http://www.portalfiscal.inf.br/nfe">
        <tpAmb>2</tpAmb>
        <cUF>33</cUF>
        <xServ>STATUS</xServ>
      </consStatServ>
    </nfeDadosMsg>
  </S:Body>
</S:Envelope>

如何更改输出xml的名称空间?

共有1个答案

杨安歌
2023-03-14

通过替换修复

@XmlMixed
@XmlAnyElement(lax = true)
protected List<Object> content;

与预期实体

@XmlElement(namespace="http://www.portalfiscal.inf.br/nfe")
protected TRetEnviNfe;
 类似资料:
  • 2)如果我按照下面的方式编辑package-info,那么它是很好的,但是问题是我创建的是一个JAXB整数元素如下所示,前缀删除没有应用于这些元素

  • 我有5个schemas.xsd,用于生成Java类,然后封送XML文件。 问题是只有一种情况--对于这个文件,JAXB生成额外的名称空间前缀NS2。这是非常奇怪的,因为所有模式都是相同的,并且编组机制对于所有模式都是通用的。 生成机制: 对于不能正常工作的包: 包信息: 对象-工厂 良好工作包: 包信息: 和对象工厂看起来完全一样(当然除了命名)。

  • 我花了一些时间来调查是什么问题,但我不能解决它。当我在XML下面反封送和回封送时,我看到的是不同的XML。 在上面的xml中,只有一个标记(第一个),其余所有(包括名称空间)都是意外元素。另一个应用程序发送上述XML。 null 我真的不明白QName的事

  • 我有从一个模式创建的JAXB对象。在封送过程中,使用NS2对xml元素进行注释。对于这个问题,我已经尝试了网络上存在的所有选项,但没有一个可行。我不能修改我的模式或更改package-info.java。请帮忙

  • 面临使用JAXB解组的问题。我需要使用多个名称空间。Java类是为第三方提供的XSD生成的。因此,我不想在Java类中的XMLRootElement指定名称空间,也不想手动更改多个类。 编组逻辑如下: xmlelement类TokenRequest.java BasicInRequestType.java 我在package-info.java中指定了前缀 TokenRequest元素实际上引用了

  • 我想让JAXB列表到xml,其中命名空间只出现在根元素中,而不是在任何其他元素中: 我已经尝试了package level @XmlSchema,但是我一定是做错了什么,因为没有显示任何东西。 这是我的根元素类: 我还有以下包-info.java: