JAXB marshal名称空间前缀

时间:2017-09-19 19:35:14

标签: java xml jaxb jax-ws marshalling

我正在开发一个使用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;
    }

}

package-info.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     包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() {
    }

    ...

}

package-info.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 个答案:

答案 0 :(得分:0)

通过替换

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

使用预期的实体

@XmlElement(namespace="http://www.portalfiscal.inf.br/nfe")
protected TRetEnviNfe;