wsimport期间出现错误以及其他JAXB绑定

时间:2017-07-31 17:51:31

标签: java xml soap jaxb wsimport

我正在使用wsimport文件中的dataBindings从cmd运行bindings.xml。基本上我试图覆盖“datetime”模式类型的默认绑定,以生成“java.util.Date”而不是“XMLGregorianCalendar”。

这是我使用的命令。

wsimport -keep -verbose -extension -b bindings.xml -wsdllocation http://localhost/wsdl/API http://localhost:8080/cc/API?WSDL -d C:/Users/ab/Desktop/test

My Bindings.xml看起来像这样。

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.1" >
    <globalBindings>
        <javaType name="java.util.Date" xmlType="xs:dateTime"
        parseMethod="adapter.DateAdapter.marshal"
        printMethod="adapter.DateAdapter.unmarshal" />
    </globalBindings>
</bindings>

这是我的DateAdapter类:

package adapter;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.bind.DatatypeConverter;

public class DateAdapter
{
    public static Date unmarshal(String paramString)
    {
        return DatatypeConverter.parseDate(paramString).getTime();
    }

    public static String marshal(Date paramDate)
    {
        Calendar localCalendar = GregorianCalendar.getInstance();
        localCalendar.setTime(paramDate);
        return DatatypeConverter.printDateTime(localCalendar);
    }
}

运行wsimport会生成webService文件以及Adapter1.class。但是,响应包含以下错误。

C:\Users\ab\Desktop\test\org\w3\_2001\xmlschema\Adapter1.java:13: package a
dapter does not exist
        return (adapter.DateAdapter.marshal(value));

现在,我的DateAdapter.class位于我正在运行wsimport的同一位置的“adapter”文件夹中。

我想知道为什么它无法读取DateAdapter?我也尝试将文件保存在根目录而不是文件夹中,但这也会引发类似的异常。

1 个答案:

答案 0 :(得分:1)

关于我如何解决问题的最新消息。

我找到了两种方法来进行日期转换工作。

问题中提到了两种情况下使用的wsimport命令。另外,我在两种情况下都使用了jdk1.6.0_45。

<强> 1。不使用自定义DateAdapter.class

在这种情况下,我直接使用javax.xml.bind.DatatypeConverter作为datetime架构类型。这是绑定。

<jaxb:globalBindings>
    <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
     printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
   </jaxb:globalBindings>
</jaxb:bindings>

<强> 2。使用自定义DateAdapter.class

我认为使用没有package语句的DateAdapter.java会使JAXB无法在它生成的Adapter1.class中为DateAdapter添加导入。 因此,我将DateAdapter.java放在一个包(com.test.date)中,并使用如下所示的完整路径在绑定中引用它。

<jaxb:globalBindings>
    <jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" parseMethod="com.test.date.DateAdapter.unmarshal" 
        printMethod="com.test.date.DateAdapter.marshal"> </jaxb:javaType>
   </jaxb:globalBindings>
</jaxb:bindings>

DateAdapter.java看起来像这样。

package com.test.date;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.bind.DatatypeConverter;

public class DateAdapter {
    private DateAdapter() {
    }

    public static String marshal(Date date) {
        System.out.println("Inside marshal");
        Calendar cal = GregorianCalendar.getInstance();
        cal.setTime(date);
        return DatatypeConverter.printDateTime(cal);
    }

    public static Date unmarshal(String xmlDate) {
        System.out.println("Inside unmarshal");
        return DatatypeConverter.parseDate(xmlDate).getTime();
    }

}

现在,这确实会引发编译错误,但它会正确生成Adapter1.java(使用正确的DateApapter导入)。