2010-12-15 49 views
2

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

+0

你是说这个相同的代码部署和GF V2按预期工作来解决? – Preston 2010-12-15 15:09:06

+0

是的,我添加了一个项目jar和在GFv2&3上运行的详细结果。它在GFv2上按预期工作。 – Raanan 2010-12-20 15:52:01

回答

1

我已经发布针对此问题的错误,它应该在3.1版(link

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; 

而是两个。

+0

嗨, 谢谢您的回答, 我曾尝试声明它只在一个地方,无论是在包级别或属性级别,但仍然 - 没有运气。它不起作用。 – Raanan 2010-12-19 08:41:01

+0

我建议为这个问题输入一个错误。这可以在这里完成:http://java.net/jira/browse/JAX_WS – 2010-12-20 17:32:44

相关问题