我希望我的Java类的序列化XML输出能够满足Java类中属性的顺序.
似乎JAXB按字母顺序排序.
我可以通过重写此@XmlType与propOrder并指定所有属性,但我有很多属性的类,这些都还没有最终确定.
我读到指定一个空的propOrder会这样做,但事实并非如此.
我的示例类:
package test;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlRootElement
//@XmlType(propOrder={"company", "scheme", "agreementNumber"})
@XmlType(propOrder={}) // makes no difference - still alphabetical in XML
public class CustomerPlan2 {
private String company;
private String scheme;
private String agreementNumber;
@XmlElement(name="Company")
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@XmlElement(name="Scheme")
public String getScheme() {
return scheme;
}
public void setScheme(String scheme) {
this.scheme = scheme;
} …Run Code Online (Sandbox Code Playgroud) 我的模式指定了命名空间,但文档没有.在JAXB解组(XML - >对象)期间忽略命名空间的最简单方法是什么?
换句话说,我有
<foo><bar></bar></foo>
Run Code Online (Sandbox Code Playgroud)
代替,
<foo xmlns="http://tempuri.org/"><bar></bar></foo>
Run Code Online (Sandbox Code Playgroud) 也许是一个愚蠢的问题:我有一种List类型<Data>,我想编组成一个XML文件.这是我的班级Database包含ArrayList...
@XmlRootElement
public class Database
{
List<Data> records = new ArrayList<Data>();
public List<Data> getRecords() { return records; }
public void setRecords(List<Data> records) { this.records = records; }
}
Run Code Online (Sandbox Code Playgroud)
......这是班级数据:
// @XmlRootElement
public class Data
{
String name;
String address;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getAddress() { return address; }
public void setAddress(String address) { this.address = address; }
} …Run Code Online (Sandbox Code Playgroud) 我无法让JAXB在Resteasy JAX-RS服务器应用程序中解组时间戳.
我的班级看起来像这样:
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "foo")
public final class Foo {
// Other fields omitted
@XmlElement(name = "timestamp", required = true)
protected Date timestamp;
public Foo() {}
public Date getTimestamp() {
return timestamp;
}
public String getTimestampAsString() {
return (timestamp != null) ? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timestamp) : null;
}
public void setTimestamp(final Date timestamp) {
this.timestamp = timestamp;
}
public void setTimestamp(final String timestampAsString) {
try {
this.timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(timestampAsString);
} catch (ParseException ex) {
this.timestamp = …Run Code Online (Sandbox Code Playgroud) 使用JAXB生成XML绑定类.
该架构基于一组遗留XML文件,并包含以下代码段:
<xs:complexType name="MetaType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="Name" />
<xs:attribute type="xs:string" name="Scheme" />
<xs:attribute type="xs:string" name="Value" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
'Value'属性与'value'属性冲突,xs:string代码生成失败并出现错误:
com.sun.istack.SAXParseException2: Property "Value" is already defined. Use <jaxb:property> to resolve this conflict.
Run Code Online (Sandbox Code Playgroud) 我需要从xml生成不提供模式的类.我知道这几乎没用,但事实是我们有xml,它是结构化的,我们应该能够从xml创建一个模型.在过去,我已经手工完成了,但是我正在使用的当前xml文档非常大,而且我可能更好地花时间构建满足我需要的东西.但是,我猜它已经完成了,我找不到它.
有什么指针吗?
我正在解决这个错误,同时解组一个字符串.我使用JAXB创建了Java文件.
JAXBContext jaxbContext = JAXBContext.newInstance(DocumentType.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// Input string posted below
DocumentType dType = (DocumentType) unmarshaller.unmarshal(new StringReader("input string"));
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd", local:"document"). Expected elements are (none)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:243)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:238)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1048)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:483)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:135)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:602)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3065)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:881)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:203)
at …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring WebServiceTemplate进行webservice调用,该调用使用JAXB生成请求XML.我的要求需要所有元素(包括root)在SOAP请求中具有名称空间前缀(只有一个名称空间).
例如:
<ns1:Login xmlns:ns1="www.example.com/a">
<ns1:username>abc</ns1:username>
<ns1:password>abc</ns1:password>
</ns1:Login>
Run Code Online (Sandbox Code Playgroud)
但我得到了
<Login xmlns="www.example.com/a">
<username>abc<username>
<password>abc<password>
</Login>
Run Code Online (Sandbox Code Playgroud)
xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="www.example.com/a" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ilreq="www.example.com/a" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="Login">
<xs:sequence>
<xs:element name="username" type="xs:string"/>
<xs:element name="password" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
从XSD生成的Java类
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Login", propOrder = {
"username",
"password"
})
@XmlRootElement
public class Login {
@XmlElement(required = true)
protected String username;
@XmlElement(required = true)
protected String password;
......
}
Run Code Online (Sandbox Code Playgroud)
package-info.java
@javax.xml.bind.annotation.XmlSchema(
namespace = "www.example.com/a",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package authenticator.beans.login;
Run Code Online (Sandbox Code Playgroud)
想知道如何使用Namespace前缀生成包含root的所有元素的请求XML.
当我从XSD生成JAXB类时,元素maxOccurs="unbounded"会为它们生成一个getter方法,但是没有setter方法,如下所示:
/**
* Gets the value of the element3 property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the element3 property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getElement3().add(newItem);
* …Run Code Online (Sandbox Code Playgroud) 这个问题适用于曾经测试过Tomcat管理器中"查找泄漏"按钮的人,并获得了这样的结果:
以下Web应用程序已停止(重新加载,取消部署),但之前运行的类仍然在内存中加载,从而导致内存泄漏(使用分析器确认):
/leaky-app-name
我认为这与经常重新部署经常得到的"Perm Gen space"错误有关.
所以我在部署时在jconsole中看到的是我加载的类从大约2k到5k.然后你会认为取消部署应该将它们降回到2k,但它们保持在5k.
我也尝试使用以下JVM选项:
-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled
我确实看到Perm Gen空间的使用量非常小,但不是我预期的,并且加载的类计数没有下降.
那么有没有办法配置Tomcat或设计你的应用程序以便在取消部署时更好地卸载?或者我们是否在一些重要的调试会话后重新启动服务器?
Tomcat版本输出:
服务器版本:Apache Tomcat/6.0.29
服务器内置:2010年7月19日1458
服务器编号:6.0.0.29
操作系统名称:Windows 7
操作系统版本:6.1
体系结构:x86
JVM版本:1.6.0_18-b07
JVM供应商:Sun Microsystems Inc.
更新:
感谢celias的回答,我决定多做一些挖掘,我认为由于CXF,Spring和JAXB,我确定了应用程序的罪魁祸首.
在我学习了如何分析Java应用程序之后,我将分析器指向Tomcat并获取了一些堆转储和快照,以查看对象和类在内存中的外观.我发现在我的CXF/JAXB(wsdl2java)生成的类中使用的XML模式中的一些枚举在取消部署后仍然存在.根据我的堆转储,它看起来像是绑定到Map.免责声明:我承认我仍然有点绿色,分析和跟踪对象的调用树在Java中可能具有挑战性.
另外我应该提一下,我甚至没有调用该服务,只是部署然后取消部署它.对象本身似乎是通过部署时从Spring发起的反射加载的.我相信我遵循了在Spring中设置CXF服务的惯例.所以我不能100%确定这是Spring/CXF,JAXB还是反射的错误.
作为旁注:有问题的应用程序是使用Spring/CXF的Web服务,而XML恰好是一个相当复杂的模式(NIEM的扩展).