在C#中我可以这样做:
//This is C#
static T SomeMethod<T>() where T:new()
{
Console.WriteLine("Typeof T: "+typeof(T));
return new T();
}
//And call the method here
SomeMethod<SomeClassName>();
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,我不能让它在Java中工作.
我想要做的是,在超类上创建一个静态方法,这样子类就可以转换为XML.
//This is Java, but doesn't work
public static T fromXml<T>(String xml) {
try {
JAXBContext context = JAXBContext.newInstance(T.class);
Unmarshaller um = context.createUnmarshaller();
return (T)um.unmarshal(new StringReader(xml));
} catch (JAXBException je) {
throw new RuntimeException("Error interpreting XML response", je);
}
}
//Also the call doesn't work...
fromXml<SomeSubObject>("<xml/>");
Run Code Online (Sandbox Code Playgroud) 我的XSD结构如下: -
<element name="XYZDate" maxOccurs="1" minOccurs="1" nillable="true" type="date"/>
Run Code Online (Sandbox Code Playgroud)
当我在这个字段中设置空值时,它允许我,但是在编组时它XML从JAXB编组时产生输出
<XYZDate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
Run Code Online (Sandbox Code Playgroud)
而在结果中我想要输出,<XYZDate/>即不想要架构和其他属性.
我在使用的帮助下摆脱了这一点,XMLStreamWriter但它产生了XML单线完整.我需要格式化良好XML.如果我需要使用IndentingXMLStreamWriter我的Java版本,则不支持它,我无法控制Java容器进行更改或修改.
请建议任何形成XMLWell Formatted的解决方案.
我正在使用Sun的JDK 1.6.0_18中的JAXB 2.1.10:
D:\ apps\jdk160_18\bin> xjc.exe -version xjc版本"JDK 6中的JAXB 2.1.10"用于XML绑定的JavaTM体系结构(JAXB)参考实现,(在JDK 6中构建JAXB 2.1.10)
当JAXB对象具有空字符串()的值时,我需要让JAXB的marshaller生成一个空元素(例如<someStringField></someStringField>或).但是,JAXB并没有这样做,而是从输出中省略了元素(就好像它是一个可选元素).<someStringField/>""
我在Internet上的搜索表明,只要将字段设置为非空的空字符串(即myJAXBObject.setSomeStringField("");),JAXB通常应该创建此标记:
如何使用JAXB实例化一个空元素 https://jaxb.dev.java.net/tutorial/section_2_2_12_8-No-Value.html#No%20Value
在我的XSD中,我试图表明(我知道的每一种方式)元素的存在是强制性的,即使它是空的:
<xs:element name="outerElement">
<xs:complexType>
<xs:sequence>
<xs:element name="someStringField" type="xs:string" nillable="false" minOccurs="1" />
<xs:element name="someOtherStringField" type="xs:string" />
Run Code Online (Sandbox Code Playgroud)
生成的代码看起来像这样(两个元素都是一样的):
@XmlElement(name = "someStringField", required = true)
protected String someStringField;
@XmlElement(name = "someOtherStringField", required = true)
protected String someOtherStringField;
Run Code Online (Sandbox Code Playgroud)
但是,当我编组以下对象时......
outerElement.setSomeStringField("");
outerElement.setSomeOtherStringField("Value was set");
Run Code Online (Sandbox Code Playgroud)
我明白了:
<outerElement>
<someOtherStringField>Value was set</someOtherStringField>
</outerElement>
Run Code Online (Sandbox Code Playgroud)
当我期待:
<outerElement>
<someStringField></someStringField>
<someOtherStringField>Value was set</someOtherStringField>
</outerElement>
Run Code Online (Sandbox Code Playgroud)
要么:
<outerElement>
<someStringField/>
<someOtherStringField>Value was set</someOtherStringField>
</outerElement>
Run Code Online (Sandbox Code Playgroud)
谁能发现我做错了什么?