使用其他 JAXB 绑定的 wsimport 期间出错
Error during wsimport with additional JAXB bindings
我来自 cmd 运行 wsimport
,我的数据绑定在 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
我的 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 class:
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 位于文件夹 "adapter" 中,与我 运行 wsimport 所在的位置相同。
我想知道为什么它无法读取 DateAdapter?我也尝试过将文件保存在根目录而不是文件夹中,但这也会引发类似的异常。
只是更新一下我是如何解决这个问题的。
我找到了两种使日期转换起作用的方法。
问题中提到了两种情况下使用的wsimport命令。另外,我在这两种情况下都使用了 jdk1.6.0_45。
1.不使用自定义 DateAdapter.class
在这种情况下,我直接使用 javax.xml.bind.DatatypeConverter 作为日期时间模式类型。这是绑定。
<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
我认为在没有包语句的情况下使用 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 导入)。
我来自 cmd 运行 wsimport
,我的数据绑定在 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
我的 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 class:
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 位于文件夹 "adapter" 中,与我 运行 wsimport 所在的位置相同。
我想知道为什么它无法读取 DateAdapter?我也尝试过将文件保存在根目录而不是文件夹中,但这也会引发类似的异常。
只是更新一下我是如何解决这个问题的。
我找到了两种使日期转换起作用的方法。
问题中提到了两种情况下使用的wsimport命令。另外,我在这两种情况下都使用了 jdk1.6.0_45。
1.不使用自定义 DateAdapter.class
在这种情况下,我直接使用 javax.xml.bind.DatatypeConverter 作为日期时间模式类型。这是绑定。
<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
我认为在没有包语句的情况下使用 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 导入)。