我目前正在使用JAXB生成java类以解组XML.现在我想创建一个与第一个非常类似的新模式,并使生成的类实现相同的接口.
比方说,我有两个模式文件,用于定义具有相似标签的XML:
adult.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="Job" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
kid.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="School" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
使用JAXB和XJC我想生成两个类文件:
public class Adult implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getJob { ... }
}
public class Kid implements Person …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Java以编程方式从XSD文件生成JAXB类.我使用以下代码片段来实现:
....
import java.io.File;
import java.io.IOException;
import org.xml.sax.InputSource;
import com.sun.codemodel.JCodeModel;
import com.sun.tools.xjc.api.S2JJAXBModel;
import com.sun.tools.xjc.api.SchemaCompiler;
import com.sun.tools.xjc.api.XJC;
....
....
public static void generateJaxb(String schemaPath,
String outputDirectory,
String packageName) throws DataLoadingException
{
try {
// Setup schema compiler
SchemaCompiler sc = XJC.createSchemaCompiler();
sc.forcePackageName(packageName);
// Setup SAX InputSource
File schemaFile = new File(schemaPath);
InputSource is = new InputSource(schemaFile.toURI().toString());
// Parse & build
sc.parseSchema(is);
S2JJAXBModel model = sc.bind();
JCodeModel jCodeModel = model.generateCode(null, null);
jCodeModel.build(new File(outputDirectory));
} catch (IOException exec) {
LOGGER.error("Error while generating JAXB …
Run Code Online (Sandbox Code Playgroud) 我WsImport
用来从远程WSDL文件生成一些Java源代码.请注意,这是来自常规Scala项目,即它不是在Maven或Ant构建中完成的:
import com.sun.tools.ws.WsImport
def run(wsdlFile: File, destination: File, packageName: String = "generated"): Seq[File] = {
sys.props("javax.xml.accessExternalDTD") = "all"
sys.props("javax.xml.accessExternalSchema") = "all"
val xjcArgs = "" //TODO
val args = s"-Xnocompile -XadditionalHeaders $xjcArgs -J-Djavax.xml.accessExternalDTD=all -b http://www.w3.org/2001/XMLSchema.xsd -p $packageName -s $destination $wsdlFile"
WsImport.doMain(args.split(' '))
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作得很好,我用它从上面的Scala代码以编程方式生成Java WSDL客户端.
但是,现在,我还想使用一些WsImport插件(例如this和this):
val xjcArgs = "-B-Xequals -B-XhashCode -B-Xvalue-constructor"
Run Code Online (Sandbox Code Playgroud)
我收到此错误:no such JAXB option: -Xequals
即使我将以下内容添加到我的类路径中:
"org.jvnet.jaxb2_commons" % "jaxb2-basics" % "1.11.1",
"org.jvnet.jaxb2_commons" % "jaxb2-value-constructor" % "3.0",
Run Code Online (Sandbox Code Playgroud)
如何强制WsImport使用这些插件?或者我是否直接使用除WsImport(如ANT)之外的其他工具?
尝试使用ANT
我在com.sun.tools.ws.WsImport
上面使用,但也有另一个 …
我正在使用的代码是使用jaxb2-maven-plugin
from org.codehaus.mojo
从XSD架构生成Java类.我正在寻找一种方法来自动实现equals()
和hashCode()
这些类的方法,但似乎没有一种方式.我知道还有其他JAXB2 Maven插件可以做到这一点(例如http://confluence.highsource.org/display/J2B/Home),但是我想知道你们之前是否遇到过这个问题,如果有办法的话修理它.我正在使用xjc
目标生成类.
使用案例:
想要将自定义注释插入到JAXB生成的java类中的字段中
问题:
使用Annotate插件+ JAXB [1],我能够成功插入自定义注释,但它们是在getter方法而不是字段中插入的.然而,Morphia(mongo DB)注释(我实际上想要插入)只能注释java字段[2].
我的测试xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="annox">
<xsd:element name="hoo" type="External" />
<xsd:complexType name="External">
<xsd:sequence>
<xsd:element name="bar" type="xsd:string" />
<xsd:element name="hoobar" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)
我的测试绑定xjb:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings
version="2.1"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="annox">
<jaxb:bindings schemaLocation="external.xsd" node="/xs:schema">
<jaxb:bindings node="xs:complexType[@name='External']/xs:sequence/xs:element[@name='bar']">
<annox:annotate>
<annox:annotate
annox:class="java.lang.SuppressWarnings"
impl="com.acme.foo.MyFieldBridge">
</annox:annotate>
</annox:annotate>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)
我生成的java片段:
@XmlElement(required = true)
protected String bar;
@XmlElement(required = true)
protected String hoobar;
/**
* Gets the value of the bar property.
*
* @return …
Run Code Online (Sandbox Code Playgroud) ObjectOutputStream
写方法的方法签名是
public final void writeObject(Object obj) throws IOException
Run Code Online (Sandbox Code Playgroud)
至于obj
应该器具Serializable
(了解标记).为什么java开发人员不写这个方法
public final void writeObject(Serializable obj) throws IOException
Run Code Online (Sandbox Code Playgroud)
有什么缘故吗?
我在这里尝试了JAXB Simplify插件vs*.xjb的问题解决方案.
但它失败了以下例外
"编译器无法遵循这种简化:as-element-property customization.它附加到错误的地方,或者与其他绑定不一致."
这是我使用的自定义绑定
<jaxb:bindings node="//xs:complexType[@name='Op']//xs:choice/xs:element[@name='Time']">
<simplify:as-element-property/>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)
jaxb简化插件融合页面是不可访问的,所以有人使用过此插件并可以举个例子吗?
这是我根据答案更新的架构
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns="http://www.amadeus.com/APT/FOM/00" targetNamespace="http://www.amadeus.com/APT/FOM/00" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:simplify="http://jaxb2-commons.dev.java.net/basic/simplify" jaxb:extensionBindingPrefixes="simplify">
...
...
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element name="Time" type="xs:dateTime" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:appinfo>
<simplify:as-element-property />
</xs:appinfo>
</xs:annotation>
</xs:element>
... ...
</xs:choice>
...
Run Code Online (Sandbox Code Playgroud)
我在maven构建期间得到了异常,例如"不支持的绑定命名空间" http://jaxb2-commons.dev.java.net/basic/simplify ".也许你的意思是" http://jaxb.dev.java.net/plugin/code-injector "?"
我们有一个 xml 文件,需要对其进行解组(转换为 Java 对象)。现在 Java 对象是第三方的,我无法对其进行注释以进行解组。关于如何在没有注释的情况下解组的任何想法。请在下面找到我的代码片段
JAXBContext context;
try {
context = JAXBContext.newInstance(Abc.class);
Unmarshaller unMarshaller = context.createUnmarshaller();
Abc abc= (Abc) unMarshaller.unmarshal(new FileInputStream("C:\\Documents and Settings\\sandeep.nair\\Desktop\\abc.xml"));
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e){
}
Run Code Online (Sandbox Code Playgroud)
我收到以下异常。一个用于无参数构造函数(我知道我可以通过为适配器添加注释来解决这个问题,但我想知道或查看一个在没有注释的情况下处理它的示例片段)
同样,我收到另一条关于 JAXB 无法处理接口的消息。
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:5 个 IllegalAnnotationExceptions java.sql.Timestamp 没有无参数默认构造函数。此问题与以下位置有关: 在 java.sql.Timestamp 在 public java.sql.Timestamp com.test.Abc.getSomeTimestamp() 在 com.riteaid.entities.customer.Customer com.test.Def 没有无参数默认构造函数。此问题与以下位置有关:at com.test.Def...
java.sql.Date 没有无参数默认构造函数。这个问题与以下位置有关:at java.sql.Date ... com.test.Ghi 是一个接口,JAXB 无法处理接口。此问题与以下位置有关: ... com.test.Ghi 没有无参数默认构造函数。这个问题与以下位置有关:..
我有一个xsd架构,我正在从中生成一些java类.我正在使用jaxb代代相传.
我希望能够生成一个带注释的类@XmlRootElement
,但我希望@XmlRootElement name属性与生成的类的名称不同.
在我的xsd中,我定义了以下内容:
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
....
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
这段代码生成以下java类:
@XmlRootElement(name = "customer")
public class Customer {
...
}
Run Code Online (Sandbox Code Playgroud)
name的name属性@XmlRootElement
与生成的Class的名称相同.我希望生成的类名是CustomerReques
t.
我已经尝试使用该jaxb:class
定义来更改classe名称.实际上,这个选项改变了类名但删除了@XmlRootElement
注释,我需要它存在.
以下xsd:
<xs:element name="customer">
<xs:complexType>
<xs:annotation>
<xs:appinfo>
<jaxb:class name="CustomerRequest"/>
</xs:appinfo>
</xs:annotation>
<xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
生成这个类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "customer", propOrder = {
})
public class CustomerRequest {
}
Run Code Online (Sandbox Code Playgroud)
如何在@XmlRootElement
不丢失注释的情况下使注释的属性名称与生成的类名称不同?
解决方案更新: 用户Xstian使用外部绑定提出了正确的解决方案.仅供进一步参考,我将使用内联绑定转换的解决方案更新我自己的帖子:
<xs:element name="customer">
<xs:complexType>
<xs:annotation>
<xs:documentation>Request object for the operation that checks if a …
Run Code Online (Sandbox Code Playgroud) 我在 JAXB 生成的类中有以下注释
@XmlType(name = "MessageInfoType", propOrder = {
"debugTraceBoolean",
"clientHostnameString",
"endUserIPAddress"
})
Run Code Online (Sandbox Code Playgroud)
需要使用自定义绑定在 JAXB 类中生成以下注释。即需要编辑上述注释并使用 annox 添加命名空间,如下所示类型。
@XmlType(name = "MessageInfoType", propOrder = {
"debugTraceBoolean",
"clientHostnameString",
"endUserIPAddress"
}, namespace="urn:expedia:e3:data:messagetypes:defn:v4")
Run Code Online (Sandbox Code Playgroud)
我的xjb文件是:
<jaxb:bindings schemaLocation="../../serviceDescription/atlantis/common/com.expedia.e3.data.messagetypes.v4.xsd">
<jaxb:bindings node="//xs:complexType[@name='MessageInfoType']">
<annox:annotate target="field">
<annox:annotate annox:class="javax.xml.bind.annotation.XmlType"
namespace="urn:expedia:e3:data:messagetypes:defn:v4"/>
</annox:annotate>
</jaxb:bindings>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)