簡體   English   中英

我得到空字段用spring-oxm解組xml

[英]I get null fields Unmarshalling a xml with spring-oxm

我正在編寫一個小的命令行工具來維護數據庫。 首先,我將問題簡化為一張表。 基本上,我對它執行CRUD操作。 輸入是一個xml文件。 我已經創建了一個Spring應用程序,這是我第一次在Web應用程序上下文之外使用它。 對於建築,我正在使用gradle 1.11。

我有一個測試課。 測試之一非常簡單:從類路徑中讀取測試xml文件並解組。 這是server.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<xs2:server xmlns:xs2="http://www.opsource.net/simpleapp">
    <xs2:id>5</xs2:id>
    <xs2:name>Server_5</xs2:name>
</xs2:server>

這是解組xml的方法:

@Autowired
private Unmarshaller unMarshaller;

public ServerType unMarshallServerType(InputStream is) throws XmlMappingException, IOException{
    ServerType server = (ServerType) unMarshaller.unmarshal(new StreamSource(is));
    return server;
}

在應用程序上下文中,我定義了jaxb2Marshaller:

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.mangrar.jaxb.ServerType</value>
        </list>
    </property>
</bean>

我已經檢查了InputStream的內容是否正確,並且編組沒有引發任何異常,但是ServerType實例內部的2個屬性為null。 這是ServerType類:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "serverType", propOrder = {
    "id",
    "name"
})
@XmlRootElement(namespace = "http://www.opsource.net/simpleapp", name = "server" )
public class ServerType {

    @XmlElement(required = true)
    protected String id;
    @XmlElement(required = true)
    protected String name;
}

最奇怪的是,如果我運行“ gradle test”,則測試正在運行,但不適用於IDE。 我已經嘗試使用IDEA和Eclipse(最新版本),但仍為null。 我已經向Jetbrains創建了一個支持請求,並且在那時,它也不與gradle一起使用。

知道什么可能不起作用嗎?

您只為根元素指定了名稱空間限定。 有兩種方法可以解決此問題。

選項#1-一堂課中的所有內容

您可以在@XmlElement批注和@XmlRootElement批注中利用namespace屬性。

ServerType.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "serverType", propOrder = {
    "id",
    "name"
})
@XmlRootElement(namespace = "http://www.opsource.net/simpleapp", name = "server" )
public class ServerType {

    @XmlElement(namespace = "http://www.opsource.net/simpleapp", required = true)
    protected String id;
    @XmlElement(namespace = "http://www.opsource.net/simpleapp", required = true)
    protected String name;
}

選項#2-使用@XmlSchema指定命名空間資格

package-info.java

在包級別@XmlSchema批注中指定名稱空間限定時。

@XmlSchema(
    namespace = ""http://www.opsource.net/simpleapp",
    elementFormDefault = XmlNsForm.QUALIFIED)
package example;

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

ServerType.java

然后,它將自動應用,您不必在@XmlRootElement@XmlElement上指定它。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "serverType", propOrder = {
    "id",
    "name"
})
@XmlRootElement(name = "server" )
public class ServerType {

    @XmlElement(required = true)
    protected String id;
    @XmlElement(required = true)
    protected String name;
}

欲獲得更多信息

我在博客上寫了更多有關JAXB和名稱空間的信息:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM