【问题标题】:Issue with Java to XML marshallingJava 到 XML 编组的问题
【发布时间】:2014-09-13 14:00:23
【问题描述】:

我有一个通用响应类,它用于 spring mvc web 服务中的任何返回类型。 根据需要,我将对象设置为通用响应。我希望客户按照以下结构接收响应。

但是在 Spring MVC respose 中解组 Response 类时总是有异常。我收到以下错误:

org.springframework.integration.transformer.MessageTransformationException: org.springframework.integration.MessageHandlingException: org.w3c.dom.DOMException: INVALID_CHARACTER_ERR: 指定了无效或非法的 XML 字符。

请参阅下面的 Java 类。有人可以指导我问题出在哪里。问题是否是由于每个类中存在多个 XMLRootElement?

Response.java

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Response", propOrder = { "value", "businessMessages" })
public class Response<T> implements Serializable {  

    /**
     *  Generated serial version UID
     */
    private static final long serialVersionUID = -2079538531780930420L;

    /**
     * The value.
     */
    @XmlElement(name = "Value")
    private T value;

    /**
     * The business messages.
     */
    @XmlElementWrapper(name = "BusinessMessages")
    @XmlElement(name = "BusinessMessage")
    private List<BusinessMessage> businessMessages;


    public List<BusinessMessage> getBusinessMessages() {        
        return this.businessMessages;
    }

    public T getValue() {
        return this.value;
    }


    public void setBusinessMessages(List<BusinessMessage> arg0) {
         this.businessMessages = arg0;      
    }

    public void setValue(T arg0) {
        this.value = arg0;

    }
}

BusinessMessage.java

@XmlRootElement
@XmlType(name = "BusinessMessage", propOrder = {"mibCode", "parameters", "severity"})
@XmlAccessorType(XmlAccessType.FIELD)
public class BusinessMessage implements Serializable, Cloneable {
    private static final long serialVersionUID = 1L;

    @XmlElement(name = "MibCode")
    private String mibCode;

    @XmlElement(name = "Severity")
    private BusinessMessageServerityEnum severity;

    @XmlElementWrapper(name = "Parameters")
    @XmlElement(name = "Parameter")
    private List<String> parameters;

// getter and setter ommited
}

响应中设置的响应类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "messageId"
})
@XmlRootElement(name = "GetPrelogonInfoResponse")
public class GetPrelogonInfoResponse implements Serializable {

    /**
     * Serial version identifier generated
     */
    private static final long serialVersionUID = -3109695678881152603L;

    @XmlElement(name = "MessageId", required = true)
    protected String messageId;
// getter and setter ommited
}

【问题讨论】:

  • 该消息听起来好像 XML 数据已损坏。 “无效或非法的 XML 字符”是相当低级的,例如 XML 中出现的禁止的 ASCII 控制字符(代码

标签: xml spring spring-mvc jaxb


【解决方案1】:

我终于找到了根本原因。问题在于@xmltype 中的“名称”参数。

我将 XML 注释修改为下面,并且运行良好。

Response.java

@XmlRootElement(name = "Response")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "value", "businessMessages" })

BusinessMessage.java

@XmlRootElement(name = "BusinessMessage")
@XmlType(name = "", propOrder = {"mibCode", "parameters", "severity"})
@XmlAccessorType(XmlAccessType.FIELD)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多