我有一个简单的Web服务方法,它返回一个简单的java类作为返回值。
@WebMethod()
public SimpleClass myMethod();
@XmlRootElement()
public class SimpleClass {
@XmlElement(name="myDate")
@XmlJavaTypeAdapter(value=MyDateAdapter.class)
public java.sql.Date myDate = new java.sql.Date(new java.util.Date().getTime());
}
我希望java.sql.Date在XML中作为Long值传输(因为客户端是无法处理复杂事物的J2ME)。 为了这个目的,我采用了之前在许多地方提到的解决方案,并且在Glassfish v2上工作得非常好。
首先,我声明以下适配器:
public class MyDateAdapter extends XmlAdapter<Long, java.sql.Date> {
public java.sql.Date unmarshal(Long v) throws Exception {
return new java.sql.Date(v);
}
public Long marshal(java.sql.Date v) throws Exception {
return v.getTime();
}
}
然后,我在package-info文件中声明它的用法如下:
@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(value=MyDateAdapter.class,type=java.sql.Date.class)
})
package mingler.tracker.ejb.client;
问题发生在GlassFish 3上。虽然我正确定义了适配器,但日期是作为“xs:dateTime”值而不是Long传输的。 这是我从GlassFish 3服务器获得的响应,当我调用我的Web服务时:
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:myMethodResponse xmlns:ns2="http://nevermind.com">
<return>
<myDate xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:dateTime">2010-12-09T12:44:06.875+02:00</myDate>
</return>
</ns2:myMethodResponse>
</S:Body>
</S:Envelope>
我还检查过调试器 - 从不调用适配器中的函数。 另一方面,适配器并非无用,因为如果我尝试删除它,我会得到JAXB异常, 告诉我java.sql.Date无法处理,因为它没有no-arg构造函数。
有什么想法吗?
20/12/2010 -
我添加了一个带有源的项目jar的链接以及glassfish2和glassfish3的结果:
jar file,glassfish3 result,glassfish2 result
答案 0 :(得分:1)
您在属性级别和包级别声明了@XmlJavaTypeAdapter。你试过只在一个地方宣布它吗?
或者:
@XmlJavaTypeAdapter(value=MyDateAdapter.class)
public java.sql.Date myDate = new java.sql.Date(new java.util.Date().getTime());
或者:
@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(value=MyDateAdapter.class,type=java.sql.Date.class)
})
package mingler.tracker.ejb.client;
而不是两者。
答案 1 :(得分:1)
我发布了此问题的错误,应该在版本3.1(link)上解决