相关疑难解决方法(0)

Java中没有泛型参数的通用方法

在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)

java generics

35
推荐指数
3
解决办法
5万
查看次数

如何用JAXB将空值表示为空元素?

我的XSD结构如下: -

<element name="XYZDate" maxOccurs="1" minOccurs="1" nillable="true" type="date"/>
Run Code Online (Sandbox Code Playgroud)

当我在这个字段中设置空值时,它允许我,但是在编组时它XMLJAXB编组时产生输出

<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的解决方案.

java xml jaxb

8
推荐指数
2
解决办法
4万
查看次数

JAXB:空字符串不会产生空元素

我正在使用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)

谁能发现我做错了什么?

jaxb

6
推荐指数
1
解决办法
5165
查看次数

标签 统计

java ×2

jaxb ×2

generics ×1

xml ×1