标签: jaxb

JAXB和物业订购

我希望我的Java类的序列化XML输出能够满足Java类中属性的顺序.

似乎JAXB按字母顺序排序.

我可以通过重写此@XmlTypepropOrder并指定所有属性,但我有很多属性的类,这些都还没有最终确定.

我读到指定一个空的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)

java jaxb xml-binding

64
推荐指数
3
解决办法
8万
查看次数

JAXB:如何在解组XML文档时忽略命名空间?

我的模式指定了命名空间,但文档没有.在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)

java xml jaxb xml-serialization

63
推荐指数
4
解决办法
11万
查看次数

JAXB:如何编组列表中的对象?

也许是一个愚蠢的问题:我有一种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)

xml arraylist jaxb unmarshalling

61
推荐指数
3
解决办法
9万
查看次数

jaxb unmarshal时间戳

我无法让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)

java datetime jaxb

60
推荐指数
2
解决办法
6万
查看次数

JAXB - 属性"值"已定义.使用<jaxb:property>解决此冲突

使用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 &lt;jaxb:property> to resolve this conflict. 
Run Code Online (Sandbox Code Playgroud)

java xsd jaxb

59
推荐指数
3
解决办法
6万
查看次数

如何从XML生成JAXB类

我需要从xml生成不提供模式的类.我知道这几乎没用,但事实是我们有xml,它是结构化的,我们应该能够从xml创建一个模型.在过去,我已经手工完成了,但是我正在使用的当前xml文档非常大,而且我可能更好地花时间构建满足我需要的东西.但是,我猜它已经完成了,我找不到它.

有什么指针吗?

java xml jaxb

59
推荐指数
2
解决办法
8万
查看次数

javax.xml.bind.UnmarshalException:意外元素.预期要素是(无)

我正在解决这个错误,同时解组一个字符串.我使用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)

java jaxb unmarshalling

57
推荐指数
2
解决办法
9万
查看次数

JAXB:需要所有元素的命名空间前缀

我正在使用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.

java xml spring-ws jaxb

56
推荐指数
4
解决办法
12万
查看次数

为什么JAXB不为列表生成setter

当我从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)

java jaxb getter-setter

56
推荐指数
3
解决办法
3万
查看次数

有没有办法避免Tomcat中的部署内存泄漏?

这个问题适用于曾经测试过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的扩展).

java spring tomcat memory-leaks jaxb

54
推荐指数
2
解决办法
2万
查看次数