Nac*_*321 3 java rest jaxb jersey
所以,假设我有几个名称空间的xml.
<Envelope xmlns:pdi="http://www.mypage.com/schemas/pdi" xmlns:ib="http://www.mypage.com/schemas/ib" xmlns="http://www.mypage.com/schemas/envelope">
<Product>
<pdi:number>123456</pdi:number>
</Product>
<Instance>
<ib:serial>abcdefg</ib:serial>
</Instance>
</Envelope>
Run Code Online (Sandbox Code Playgroud)
我正在尝试为它建立一个客户端.我有一个像这样声明的信封POJO
@XmlRootElement(name ="Envelope", namespace = "http://www.mypage.com/schemas/envelope")
public class Envelope
Run Code Online (Sandbox Code Playgroud)
在里面,它有这些属性
@XmlElement(name="Product", namespace = "http://www.mypage.com/schemas/pdi")
public Product getProduct(){...}
@XmlElement(name="Instance", namespace = "http://www.mypage.com/schemas/ib")
public Instance getInstance(){...}
Run Code Online (Sandbox Code Playgroud)
此外,产品POJO如下所示:
@XmlRootElement(name="Product", namespace = "http://www.mypage.com/schemas/pdi")
public class Product
Run Code Online (Sandbox Code Playgroud)
和属性
@XmlElement(name="pdi:number", namespace = "http://www.mypage.com/schemas/pdi")
public int getNumber(){...}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我无法获得产品编号.我一直收到请求错误.我是否正确处理名称空间,或者我错过了什么?
对于此用例,我建议利用包级别@XmlSchema
注释来指定命名空间限定.
package-info(forum14651918/package-info.java)
@XmlSchema(
namespace="http://www.mypage.com/schemas/envelope",
elementFormDefault=XmlNsForm.QUALIFIED,
xmlns={
@XmlNs(namespaceURI = "http://www.mypage.com/schemas/envelope", prefix = ""),
@XmlNs(namespaceURI = "http://www.mypage.com/schemas/ib", prefix = "ib"),
@XmlNs(namespaceURI = "http://www.mypage.com/schemas/pdi", prefix = "pdi")
}
)
@XmlAccessorType(XmlAccessType.FIELD)
package forum14651918;
import javax.xml.bind.annotation.*;
Run Code Online (Sandbox Code Playgroud)
信封(forum14651918/Envelope.java)
由于我们在注释中指定了一个namespace
和elementFormDefault
,因此@XmlSchema
对应于Envelope
该类的所有元素都将使用http://www.mypage.com/schemas/envelope
命名空间自动限定.
package forum14651918;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Envelope")
public class Envelope {
@XmlElement(name="Product")
private Product product;
@XmlElement(name="Instance")
private Instance instance;
}
Run Code Online (Sandbox Code Playgroud)
产品(forum14651918/Product.java)
您可以Product
使用@XmlType
注释覆盖类的命名空间.
package forum14651918;
import javax.xml.bind.annotation.*;
@XmlType(namespace="http://www.mypage.com/schemas/pdi")
public class Product {
private int number;
}
Run Code Online (Sandbox Code Playgroud)
实例(forum14651918/Instance.java)
您可以Instance
使用@XmlType
注释覆盖类的命名空间.
package forum14651918;
import javax.xml.bind.annotation.XmlType;
@XmlType(namespace="http://www.mypage.com/schemas/ib")
public class Instance {
private String serial;
}
Run Code Online (Sandbox Code Playgroud)
演示(forum14651918/Demo.java)
下面是一些代码,您可以运行以证明一切正常.
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Envelope.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14651918/input.xml");
Envelope envelope = (Envelope) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(envelope, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
欲获得更多信息
归档时间: |
|
查看次数: |
6155 次 |
最近记录: |