2010-12-16 55 views
2

我试图将EclipseLink莫西2.1.2和Java 1.6的基础上我的域名类来生成模式,下面的这个例子中默认的minOccurs生成模式默认minOccurs值。如果注释@XmlElement没有指定必需的属性,则它应该默认为false,这意味着在生成模式时,minOccurs应该为0.这在Sun的JAXB实现中按预期工作。但是,当使用Moxy minOccurs没有被生成,默认值1是暗含的。使用莫西

例如,

public Integer getDuration() { 
    return duration; 
} 

应改为如果使用莫西它生成

<xsd:element name="duration" type="xsd:int"/> 

这意味着的minOccurs = “1”,因为这是默认已经产生

<xs:element name="duration" type="xsd:int" minOccurs="0"/> 

。这是一个错误?有没有解决方法?

在此先感谢!

回答

1

您是否有机会购买EclipseLink 2.1.2的预发布版本?可以在这里获得的EclipseLink 2.1.2的发布版本:

当我运行下面的例子:

package minoccurs; 

import java.io.IOException; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.SchemaOutputResolver; 
import javax.xml.transform.Result; 
import javax.xml.transform.stream.StreamResult; 

import org.eclipse.persistence.Version; 

public class Demo { 

    public static class Root { 

     private Integer duration; 

     public Integer getDuration() { 
      return duration; 
     } 

     public void setDuration(Integer duration) { 
      this.duration = duration; 
     } 

    } 

    public static class MySchemaOutputResolver extends SchemaOutputResolver { 

     @Override 
     public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException { 
      StreamResult result = new StreamResult(System.out); 
      result.setSystemId(suggestedFileName); 
      return result; 
     } 

    } 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 
     System.out.println(jc); 
     System.out.println(Version.getVersionString()); 
     jc.generateSchema(new MySchemaOutputResolver()); 
    } 
} 

我得到:

[email protected] 
2.1.2.v20101206-r8635 
<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="root"> 
     <xsd:sequence> 
     <xsd:element name="duration" type="xsd:int" minOccurs="0"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

更新#1

根据您的update,这是一个问题。我已经打开了下面的EclipseLink莫西错误:

更新#2

我们的EclipseLink的2.2流中解决了这个错误。此修复程序可从开始12月21日夜间下载获得:

此修复程序也将最终被包含在2.1.3补丁。

0

感谢您的回复,Blaise。这个问题似乎是由于我试图通过指定propOrder = {}来生成xsd:all。通过该注释,MOXy不会生成minOccurs =“0”。我已经修改了您的演示类来说明这个问题:

package moxy.test; 

import java.io.IOException; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.SchemaOutputResolver; 
import javax.xml.bind.annotation.XmlType; 
import javax.xml.transform.Result; 
import javax.xml.transform.stream.StreamResult; 

import org.eclipse.persistence.Version; 

public class Test { 

    @XmlType(propOrder = {}) 
    public static class Root { 

     private Integer duration; 
     private Integer period; 

     public Integer getPeriod() { 
      return this.period; 
     } 

     public void setPeriod(Integer period) { 
      this.period = period; 
     } 

     public Integer getDuration() { 
      return duration; 
     } 

     public void setDuration(Integer duration) { 
      this.duration = duration; 
     } 

    } 

    public static class MySchemaOutputResolver extends SchemaOutputResolver { 

     @Override 
     public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException { 
      StreamResult result = new StreamResult(System.out); 
      result.setSystemId(suggestedFileName); 
      return result; 
     } 

    } 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 
     System.out.println(jc); 
     System.out.println(Version.getVersionString()); 
     jc.generateSchema(new MySchemaOutputResolver()); 
    } 
} 

下产生与莫西。通知没有的minOccurs属性:

2.1.2.v20101206-r8635 
<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="root"> 
     <xsd:all> 
     <xsd:element name="duration" type="xsd:int"/> 
     <xsd:element name="period" type="xsd:int"/> 
     </xsd:all> 
    </xsd:complexType> 
</xsd:schema> 

如果删除@XmlType(propOrder = {})注释生成的模式具有目前的minOccurs但与元素作为序列:

[email protected] 
2.1.2.v20101206-r8635 
<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="root"> 
     <xsd:sequence> 
     <xsd:element name="duration" type="xsd:int" minOccurs="0"/> 
     <xsd:element name="period" type="xsd:int" minOccurs="0"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

而仅供参考,以下是Sun的JAXB参考实现生成的内容:

jar:file:/C:/Program%20Files/Java/jdk1.6.0_21/jre/lib/rt.jar!/com/sun/xml/internal/bind/v2/runtime/JAXBContextImpl.class Build-Id: 1.6.0_21 
... 

2.1.2.v20101206-r8635 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="root"> 
    <xs:all> 
     <xs:element name="duration" type="xs:int" minOccurs="0"/> 
     <xs:element name="period" type="xs:int" minOccurs="0"/> 
    </xs:all> 
    </xs:complexType> 
</xs:schema> 

在此先感谢!

+0

感谢您的更新,这是一个错误。查看我的答案,了解有关跟踪此问题的详细信息:http://stackoverflow.com/questions/4460158/generating-schema-with-default-minoccurs-using-moxy/4462173#4462173 – 2010-12-16 18:41:09

+0

完美,谢谢布莱斯! – Mart 2010-12-16 19:55:59

+0

我们已将此问题的修复检入到EclipseLink 2.2中。我已经在我的答案中提供了获取此修复程序的说明:http://stackoverflow.com/questions/4460158/generating-schema-with-default-minoccurs-using-moxy/4462173#4462173 – 2010-12-20 16:07:42