[英]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一起使用。
知道什么可能不起作用嗎?
您只為根元素指定了名稱空間限定。 有兩種方法可以解決此問題。
您可以在@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;
}
@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.