Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB-flag';必需的';在基元类型上忽略from XmlAttribute_Java_Jaxb_Xsd - Fatal编程技术网

Java JAXB-flag';必需的';在基元类型上忽略from XmlAttribute

Java JAXB-flag';必需的';在基元类型上忽略from XmlAttribute,java,jaxb,xsd,Java,Jaxb,Xsd,我在尝试使用JAXB库中的schemagen工具为我的项目生成模式时遇到了一些问题。问题是注释@xmldattribute未正确解析 - src - teste - entity 因此,问题在于,对于某些类,schemagen任务完全忽略了XmlAttribute中的标志required 我将在这里粘贴一些类的示例和生成的模式,以便您了解发生了什么 package teste.entity; import javax.xml.bind.annotation.XmlAttribute;

我在尝试使用JAXB库中的schemagen工具为我的项目生成模式时遇到了一些问题。问题是注释
@xmldattribute
未正确解析

- src
 - teste
  - entity
因此,问题在于,对于某些类,schemagen任务完全忽略了
XmlAttribute
中的标志
required

我将在这里粘贴一些类的示例和生成的模式,以便您了解发生了什么

package teste.entity;

import javax.xml.bind.annotation.XmlAttribute;

public abstract class Class2 {

    @XmlAttribute(required=false)
    public String stringNotRequired;

    @XmlAttribute(required=true)
    public String stringRequired;

    @XmlAttribute(required=false)
    public int anotherIntNotRequired;

    @XmlAttribute(required=true)
    public int anotherIntRequired;

}

package teste.entity;

import javax.xml.bind.annotation.XmlAttribute;

public class Class1 extends Class2 {

    @XmlAttribute(required=true)
    public Integer integerRequired;

    @XmlAttribute(required=false)
    public Integer integerNotRequired;

    @XmlAttribute(required=false)
    public int intNotRequired;

    @XmlAttribute(required=true)
    public int intRequired;

    public Class1() {
    }
}
我的包-info.java

@XmlSchema(xmlns = @XmlNs(prefix = "t", namespaceURI = "http://test.com"),
namespace = "http://test.com",
elementFormDefault = XmlNsForm.UNQUALIFIED,
attributeFormDefault = XmlNsForm.UNQUALIFIED)
package teste.entity;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
当我运行
schemagen
任务时,我得到以下输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" version="1.0" targetNamespace="http://test.com" xmlns:t="http://test.com" xmlns:tns="http://test.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="class1">
    <xs:complexContent>
      <xs:extension base="tns:class2">
        <xs:sequence/>
        <xs:attribute name="integerRequired" type="xs:int" use="required"/>
        <xs:attribute name="integerNotRequired" type="xs:int"/>
        <xs:attribute name="intNotRequired" type="xs:int" use="required"/>
        <xs:attribute name="intRequired" type="xs:int" use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="class2" abstract="true">
    <xs:sequence/>
    <xs:attribute name="stringNotRequired" type="xs:string"/>
    <xs:attribute name="stringRequired" type="xs:string" use="required"/>
    <xs:attribute name="anotherIntNotRequired" type="xs:int" use="required"/>
    <xs:attribute name="anotherIntRequired" type="xs:int" use="required"/>
  </xs:complexType>
</xs:schema>

这是我的蚂蚁任务

<target name="generate-schema" >
    <path id="mycp">
        <fileset dir="lib/jaxb/lib\">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="lib" >
            <include name="*.jar"/>
        </fileset>
        <fileset dir="dist" >
            <include name="*.jar"/>
        </fileset>
    </path>

    <taskdef name="schemagen" classname="com.sun.tools.jxc.SchemaGenTask">
        <classpath refid="mycp"/>
    </taskdef>

    <mkdir dir="schema"/>

    <schemagen srcdir="src/teste/entity" destdir="schema" >
        <classpath refid="mycp"/>
        <schema namespace="http://test.com" file="full.xsd" />            
    </schemagen>
</target>

我是否需要对命名空间的类进行注释才能正确获得输出

可能吧。我已经创建了一个类似于您的设置

Test.java
package info.java
build.xml
(代码片段,基于OP的输入) (我使用了前缀
tns
,因为JAXB将生成并使用该前缀,而不是
@XmlNs
中指定的任何前缀)

给定XJC的
SchemaGen
上面的文件,如果我有一个必需的属性,那么它将生成所需的结果;如果我设置
required=false
,则它不会

这里的主要内容是
Test
类上的
@XmlType
注释。如果你手工制作你的课程,你就不能没有它。(无需使用
@XmlRootElement
,因此它取决于您是否需要它。)这告诉JAXB当
SchemaGen
处理类时,
测试类(顺便说一下,它代表一种模式类型)属于哪个命名空间

package info.java
服务于几乎相同的目的,但在模式级别。如果一个包包含这个文件(以及上面显示的注释)并且遇到了
SchemaGen
问题,那么它将知道该包中的类(模式类型)属于包级别注释中指定的名称空间。(同样,如果您手工操作,这是必须的。)除此之外,
SchemaGen
使用此文件中声明的命名空间将输出发送到您在
中指定的文件。没有它,生成的文件名总是
schema1.xsd
(或类似名称)

多个包 如果要将位于多个包中的多个类分组到一个名称空间中,那么必须在所有包上应用相同的包级别注释(如
package info.java
代码段中所使用的名称空间前缀必须是
tns
,因为前面描述了JAXB限制)

schemagen
当然需要订购才能编译这两个包。在
build.xml
中,
schemagen
任务的
srcdir
应该包含这两个包

如果你有一个类似的结构

.
|-- x
|   |-- A.java             # JAXB
|   |-- B.java             # POJO
|   `-- package-info.java  # http://test.com
`-- y
    |-- C.java             # JAXB
    `-- package-info.java  # http://test.com
您可以这样告诉
schemagen
任务只编译
A
C

<schemagen srcdir="." destdir="." >
  <schema namespace="http://test.com" file="test.xsd" />
  <include name="x/A.java" />
  <include name="y/C.java" />
</schemagen>

(我找到了一个,也许你对它感兴趣。)

我正确地得到了full.xsd文件,而另一个schema2.xsd包含了我没有得到的铰类型和元素。
full.xsd
schema2.xsd
的内容是什么?为什么会生成两个文件?我想,如果你的包中有其他类(比如
东西
),那么你也必须对它们进行注释。是的,我还有两个包作为模式的一部分生成,它们是需要的=]好的,所以我应该猜一下在你这端生成了什么文件,对吗?哦,等等,看看我在那里做了什么…给定您的输入,一个单独的类(顺便说一句,它扩展了您没有提供的其他类),我尝试创建一个测试场景,这样您就可以看到为了调整XML输出需要更改哪些因素。如果这还不足以解决你的问题(顺便说一句,我已经不明白了),那么试着重写你的问题。看看如何做的指南。好的,完全重写这个问题,我希望你现在能理解这里发生了什么。所以我们回到原点了,不是吗?这里的问题是,您展示了您得到的实际模式,但是给定这些类,
schemagen
在编译它们时会失败,因为没有注释。另外,如果您有两个包,它们都有应该是XML类型的类,那么您必须使用
schemagen
编译它们。使用

<schemagen srcdir="<path-to-test-package>" destdir=".">
  <classpath refid="<classpath-refid>" />
  <schema namespace="http://test.com" file="test.xsd" />
</schemagen>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema 
  attributeFormDefault="qualified"
  elementFormDefault="qualified" version="1.0"
  targetNamespace="http://test.com"
  xmlns:tns="http://test.com"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="test" type="tns:test"/>

  <xs:complexType name="test" final="extension restriction">
    <xs:sequence>
      <xs:element name="b" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute ref="tns:a"/>
  </xs:complexType>

  <xs:attribute name="a" type="xs:string"/>
</xs:schema>
.
|-- x
|   |-- A.java             # JAXB
|   |-- B.java             # POJO
|   `-- package-info.java  # http://test.com
`-- y
    |-- C.java             # JAXB
    `-- package-info.java  # http://test.com
<schemagen srcdir="." destdir="." >
  <schema namespace="http://test.com" file="test.xsd" />
  <include name="x/A.java" />
  <include name="y/C.java" />
</schemagen>
@XmlAttribute
public int attribute;

@XmlAttribute
public Integer attribute;