如何在使用Web服务时将java.sql.Date序列化为Long?

时间:2010-12-15 12:26:15

标签: glassfish jaxb service glassfish-3

我有一个简单的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 fileglassfish3 resultglassfish2 result

2 个答案:

答案 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)上解决