当前位置: 首页 > 面试题库 >

JAXB,自定义绑定,Adapter1.class和Joda-time

双志强
2023-03-14
问题内容

我对JAXB为XML模式生成绑定类的方式有疑问(为了精确起见,我无法对其进行修改)。我想将xsd:date类型映射到Joda-time
LocalDate对象,并在此处,阅读,我创建了以下DateAdapter类:

public class DateAdapter extends XmlAdapter<String,LocalDate> {
    private static DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd");

    public LocalDate unmarshal(String v) throws Exception {
        return fmt.parseLocalDate(v);
    }

    public String marshal(LocalDate v) throws Exception {
        return v.toString("yyyyMMdd");
    }
}

然后将以下内容添加到我的全局绑定文件中:

  <jaxb:globalBindings>
        <jaxb:javaType name="org.joda.time.LocalDate" xmlType="xs:date"
            parseMethod="my.classes.adapters.DateAdapter.unmarshal"
            printMethod="my.classes.adapters.DateAdapter.marshal" />
    </jaxb:globalBindings>

问题是,当我尝试进行项目编译时,它失败并显示以下错误:

[ERROR] \My\Path\MyProject\target\generated-sources\xjc\my\classes\generated\Adapter1.java:[20,59] non-static method unmarshal(java.lang.String) cannot be referenced from a static context
[ERROR] \My\Path\MyProject\target\generated-sources\xjc\my\classes\generated\Adapter1.java:[24,59] non-static method marshal(org.joda.time.LocalDate) cannot be referenced from a static context

…这就是事情变得奇怪的地方。JAXB生成一个包含以下内容的类Adapter1:

public class Adapter1
    extends XmlAdapter<String, LocalDate>
{


    public LocalDate unmarshal(String value) {
        return (my.classes.adapters.DateAdapter.unmarshal(value));
    }

    public String marshal(LocalDate value) {
        return (my.classes.adapters.DateAdapter.marshal(value));
    }

}

....这是编译错误的来源。

现在,我的问题是:

  • 因为我的适配器覆盖了XmlAdapter,所以无法使方法静态....如何避免这种情况?
  • 我可以完全避免生成Adapter1.class吗?也许使用包级注释XmlJavaTypeAdapters,如果是,我该怎么做呢?(JAXB已经生成了自己的package-info.java。)

希望我能阐明我的情况。
谢谢


问题答案:

您不需要扩展XmlAdapter

只需在POJO上创建静态方法即可。

例:

 public class DateAdapter {
    private static DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd");

    public static LocalDate unmarshal(String v) throws Exception {
        return fmt.parseLocalDate(v);
    }

    public static String marshal(LocalDate v) throws Exception {
        return v.toString("yyyyMMdd");
    }
 }


 类似资料:
  • 问题内容: 我想使用JAXB 2.1 XJC从xsd生成Java代码。我提供了xsd模式,无法更改。我想在从xml架构生成Java类时使用 xjc:simple 模式。 在xsd中有一些元素: 如此处所述:http : //jaxb.java.net/guide/Mapping_of__xs_any___.html我希望这些元素将被绑定到: 但是当我使用简单绑定模式 xjc:simple时, 我有

  • 问题内容: 我有一个Json响应,如下所示: 我不知道参数的名称和数量。因此,我需要并且想要将所有这些参数绑定到由<“ paramX”,“ valueX”>元组组成的java.util.Map字段。为此,我尝试了以下代码,但“ parametersMap”字段返回null。 如何使用JAXB批注实现这种绑定? 提前致谢。 问题答案: 基本上,您需要一个xml适配器。您可以摆弄KeyValue类上的

  • 自定义绑定(Custom Binding)允许我们通过代码实现自定义绑定规则,从而完成更高级的业务需求。 示例代码 //.js片段 justep.Bind.bindingHandlers.yourBindingName = { init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {

  • 我有以下xsd文件: 以及以下bindings.xjb 我还有以下xml文件: 当我使用jaxb生成的类进行解组时: 我得到以下例外: java.lang.ClassCastExcema: test.ShiporderItem$ShiporderItemItem不能强制转换为测试。ShiporderItem 在JaxbTest.main(JaxbTest.java:16) 你能帮我找出我做错了什么

  • 我正在使用来自第三方系统的一组DTD。我们的目标是将XML请求(符合这些DTD的请求映射到java中,然后将XML响应发送回系统)。 DTD是一成不变的(我无法控制更改它们)。 因此,为了进行映射,我使用XMLSpy将dtd转换为XML Schemas (xsd ),然后使用XJC编译器创建Jaxb绑定类。我用的是Java 7。 问题是,DTD 实际上没有命名空间。我有20个不同的DTD。10 表

  • 我目前正在尝试将一些现有的XML解组到我手工创建的几个类中。问题是,我总是得到一个错误,告诉我,JaxB需要一个天气元素,但却找到了一个天气元素。(?) UnMarshalException:意外元素(URI:“http://www.aws.com/aws”,本地:“weather”)。需要的元素为<{}API>、<{}Location>、<{}Weather> 这就是我试图解析的XML: 我不太