Java JAXB对象工厂不包含JAXBElement创建方法
我有一个名为MYClass的类,其代码如下所示Java JAXB对象工厂不包含JAXBElement创建方法,java,jakarta-ee,jaxb,Java,Jakarta Ee,Jaxb,我有一个名为MYClass的类,其代码如下所示 package com.rest; public class MyClass { private String var; public String getVar() { return var; } public void setVar(String var) { this.var = var; } } 我已经使用schemagen../src/com/rest/M
package com.rest;
public class MyClass {
private String var;
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
}
我已经使用schemagen../src/com/rest/MyClass.java创建了它的模式
生成的架构:
<?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="myClass">
<xs:sequence>
<xs:element name="var" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
然后,我使用模式创建了JAXB工件
xjc -d <my_source_dir>\ -p com.rest.generated <my_generated_schema>.xsd
xjc-d \-p com.rest.generated.xsd
下面给出了生成的工件代码
对象工厂:
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2012.06.01 at 08:56:31 PM PKT
//
package com.rest.generated;
import javax.xml.bind.annotation.XmlRegistry;
/**
* This object contains factory methods for each
* Java content interface and Java element interface
* generated in the com.rest.generated package.
* <p>An ObjectFactory allows you to programatically
* construct new instances of the Java representation
* for XML content. The Java representation of XML
* content can consist of schema derived interfaces
* and classes representing the binding of schema
* type definitions, element declarations and model
* groups. Factory methods for each of these are
* provided in this class.
*
*/
@XmlRegistry
public class ObjectFactory {
/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.rest.generated
*
*/
public ObjectFactory() {
}
/**
* Create an instance of {@link MyClass }
*
*/
public MyClass createMyClass() {
return new MyClass();
}
}
//
//该文件由JDK 6中的JavaTM XML绑定体系结构(JAXB)参考实现vJAXB 2.1.10生成
//看
//重新编译源架构时,对此文件的任何修改都将丢失。
//生成日期:2012.06.01北京时间下午8:56:31
//
包com.rest.generated;
导入javax.xml.bind.annotation.XmlRegistry;
/**
*此对象包含每个对象的工厂方法
*Java内容接口和Java元素接口
*在com.rest.generated包中生成。
*ObjectFactory允许您以编程方式
*构造Java表示的新实例
*用于XML内容。XML的Java表示
*内容可以由模式派生的接口组成
*和表示模式绑定的类
*类型定义、元素声明和模型
*小组。每种方法的工厂方法如下:
*本课程提供。
*
*/
@XmlRegistry
公共类对象工厂{
/**
*创建一个新的ObjectFactory,可用于为包com.rest.generated创建架构派生类的新实例
*
*/
公共对象工厂(){
}
/**
*创建{@link MyClass}的实例
*
*/
公共MyClass createMyClass(){
返回新的MyClass();
}
}
而MyClass.java是
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2012.06.01 at 08:56:31 PM PKT
//
package com.rest.generated;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for myClass complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="myClass">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="var" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "myClass", propOrder = {
"var"
})
public class MyClass {
protected String var;
/**
* Gets the value of the var property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getVar() {
return var;
}
/**
* Sets the value of the var property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setVar(String value) {
this.var = value;
}
}
//
//该文件由JDK 6中的JavaTM XML绑定体系结构(JAXB)参考实现vJAXB 2.1.10生成
//看
//重新编译源架构时,对此文件的任何修改都将丢失。
//生成日期:2012.06.01北京时间下午8:56:31
//
包com.rest.generated;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.XmlType;
/**
*myClass复杂类型的Java类。
*
*以下架构片段指定此类中包含的预期内容。
*
*
*complexType name=“myClass”>
*complexContent>
*限制基数=”{http://www.w3.org/2001/XMLSchema}任何类型“>
*序列>
*元素名称=“var”类型=”{http://www.w3.org/2001/XMLSchema}字符串“minOccurs=”0“/>
*/顺序>
*/限制>
*/complexContent>
*/complexType>
*
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=“myClass”,proporter={
“var”
})
公共类MyClass{
保护字符串变量;
/**
*获取var属性的值。
*
*@返回
*可能的对象是
*{@link String}
*
*/
公共字符串getVar(){
收益var;
}
/**
*设置var属性的值。
*
*@param值
*允许的对象是
*{@link String}
*
*/
公共void setVar(字符串值){
this.var=值;
}
}
问题:找不到创建JAXBElement的方法。我应该怎么做才能得到这个方法呢?XJC只会在必要时将字段创建为JAXBElements,而且只有当映射需要一些不能用“正常”JavaBean语义表示的元信息时才真正需要
当一个字段同时为nillable且minOccurs=0时,这是一个必要的示例。如果您这样定义一个元素,您将得到一个JAXBElement作为字段类型而不是目标类型。这样您就可以区分“nil”和“not provided”,这大概是您需要做的(否则您就不会在模式中以这种方式定义它)。如果您想创建MyClass的实例
org.jboss.resteasy.plugins.providers.jaxb.JAXBMarshalException: The method createclass <package name here>.<class name here>() was not found in the object Factory!
at org.jboss.resteasy.plugins.providers.jaxb.JAXBXmlTypeProvider.wrapInJAXBElement(JAXBXmlTypeProvider.java:175)
at org.jboss.resteasy.plugins.providers.jaxb.JAXBXmlTypeProvider.writeTo(JAXBXmlTypeProvider.java:74)
at org.jboss.resteasy.core.interception.MessageBodyWriterContextImpl.proceed(MessageBodyWriterContextImpl.java:117)
如果要从类创建XML,请使用封送拆收器;如果要从XML文件创建MyClass的对象,请使用解组拆收器。这通常还会导致以下异常
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="myClass">
<xs:complexType>
<xs:sequence>
<xs:element name="var" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
org.jboss.resteasy.plugins.providers.jaxb.JAXBMarshalException:在对象工厂中找不到方法createclass。()!
位于org.jboss.resteasy.plugins.providers.jaxb.JAXBXmlTypeProvider.wrapInJAXBElement(JAXBXmlTypeProvider.java:175)
位于org.jboss.resteasy.plugins.providers.jaxb.JAXBXmlTypeProvider.writeTo(JAXBXmlTypeProvider.java:74)
在org.jboss.resteasy.core.interception.MessageBodyWriterContextImpl.procedure上(MessageBodyWriterContextImpl.java:117)
问题在于您的模式,请将其更改为具有外部标记。然后,这将生成包含@XmlRootElement注释的代码
按如下方式更改架构:
然后运行在这个新模式上创建JAXB工件的xjc步骤。当我使用marshall/unmarshall时,会发生以下异常:20:55:39809错误[stderr](http-localhost-127.0.0.1-8080-4)javax.xml.bind.MarshalException 20:55:39809错误[stderr](http-localhost-127.0.0.1-8080-4)-带有链接的异常:20:55:39809错误[stderr](http-localhost-127.0.0.1-8080-4)[com.sun.istack.SAXException2:无法将类型“com.rest.generated.MyClass”封送为元素,因为它缺少@XmlRootElement注释]20:55:39810错误[stderr](http-localhost-127.0.0.1-8080-4)位于com.sun.xml.bind.v2.runtime.MarshallImpl.write(marshallImpl.jav
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="myClass">
<xs:complexType>
<xs:sequence>
<xs:element name="var" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>