我有一个简单的Web服务方法,返回一个简单的Java类作为返回值。如何在使用Web服务时将java.sql.Date序列化为Long?
@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();
}
}
然后,我宣布其在包的信息文件,像这样的:
@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>
我也与调试检查 - 在适配器的功能不会被调用。 另一方面,adapater不是无用的,因为如果我尝试删除它,我会得到JAXB异常, 告诉我java.sql.Date无法处理,因为它没有无参数构造函数。
任何想法?
20/12/2010 - 我添加链接到与源项目JAR和结果glassfish2和glassfish3:
jar file,glassfish3 result,glassfish2 result
你是说这个相同的代码部署和GF V2按预期工作来解决? – Preston 2010-12-15 15:09:06
是的,我添加了一个项目jar和在GFv2&3上运行的详细结果。它在GFv2上按预期工作。 – Raanan 2010-12-20 15:52:01