【问题标题】:JAXB namespaces and prefixJAXB 命名空间和前缀
【发布时间】:2016-02-26 10:25:02
【问题描述】:

我在解组以下 XML 时遇到问题:

<p456:doServiceResponse xmlns:p456="http://www.sign.services.org/IServicios/">
    <respuesta>0</respuesta>
    <respuesta>Operacion correcta</respuesta>
    <respuesta>respuesta</respuesta>
</p456:doServiceResponse>

我有以下课程:

package com.ws.client;

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.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "respuesta" })
@XmlRootElement(name = "doServiceResponse")
public class DoServiceResponse {

    @XmlElement(required = true)
    protected List<String> respuesta;

    public List<String> getRespuesta() {
        if (respuesta == null) {
            respuesta = new ArrayList<String>();
        }
        return this.respuesta;
    }

}

还有包信息文件:

@XmlSchema(
    namespace = "http://www.sign.services.org/IServicios/",
    elementFormDefault = XmlNsForm.QUALIFIED)
package com.ws.client;

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

该 XML 的解组不会失败,但 respuesta 字段是 null。如果我将p456 添加为所有&lt;respuesta&gt; 节点的前缀,那么它可以工作。问题是我不能这样做,因为这是我从 WS 调用中收到的答案并且不可修改。

另外,为了不破坏任何东西,我会将“请求”发布到该 WS,到目前为止它工作正常:

<doServiceRequest xmlns="http://www.sign.services.org/IServicios/">
    <aplicacion>app</aplicacion>
    <params>param1</params>
    <params>param2</params>
</doServiceRequest>

还有豆子:

package com.ws.client;

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.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "aplicacion", "params" })
@XmlRootElement(name = "doServiceRequest")
public class DoServiceRequest {

    @XmlElement(required = true)
    protected String aplicacion;
    @XmlElement(required = true)
    protected List<String> params;

    public String getAplicacion() {
        return aplicacion;
    }

    public void setAplicacion(String value) {
        this.aplicacion = value;
    }

    public List<String> getParams() {
        if (params == null) {
            params = new ArrayList<String>();
        }
        return this.params;
    }

}

谁能告诉我如何配置注释,这样我就可以在不修改它们并且不接触 JAXB 解组器的情况下解组这两个 XML?这可能吗?

【问题讨论】:

  • 我猜这是因为你有 xmlns:p456="http://www.sign.services.org/IServicios/" 作为命名空间。如果您的命名空间类似于 xmlns:"http://www.sign.services.org/IServicios/",它可以在没有 p456 的情况下工作
  • @user2004685 你的意思是在第一个 XML 上,doServiceResponse? WS就是这样返回响应的,所以我不能修改。
  • 双方是否使用相同的模式集?我的意思是请求和响应?
  • @user2004685 是的,他们使用相同的架构。这两个类都是使用wsimport 从WSDL 生成的。我已经更新了 Schema,因为我为我的测试手动添加了 xmlns 前缀。

标签: java xml namespaces jaxb unmarshalling


【解决方案1】:

您可以简单地将命名空间参数添加到 @XmlElement 注释:

@XmlElement(required = true, namespace="")
protected List<String> respuesta;

我认为这可行(未经测试)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2013-10-24
    • 1970-01-01
    相关资源
    最近更新 更多